ibm-pc汇编语言程序设计(沈美明第二版)第二章指令与寻址.ppt
《ibm-pc汇编语言程序设计(沈美明第二版)第二章指令与寻址.ppt》由会员分享,可在线阅读,更多相关《ibm-pc汇编语言程序设计(沈美明第二版)第二章指令与寻址.ppt(83页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、汇编语言程序设计汇编语言程序设计北京理工大学北京理工大学 电子工程系电子工程系马永锋马永锋第二章第二章 汇编语言指令系统和寻址方式汇编语言指令系统和寻址方式2.2 指令系统指令系统 2.2.1 数据传送指令数据传送指令 2.2.2 算术运算指令算术运算指令 2.2.3 逻辑运算指令逻辑运算指令 2.2.4 字符串指令字符串指令 2.2.5 程序转移指令程序转移指令 2.2.6 处理器控制指令处理器控制指令2.2 指令系统指令系统 指令系统指令系统是CPU指令的集合,CPU除了具有计算功能的指令外,还有一些实现其它功能的指令,也有为某种特殊的应用而增设的指令。在学习汇编指令时,指令的功能无疑是我
2、们学习和掌握的重点,但要准确、有效地运用这些指令,我们还要熟悉系统对每条指令的一些规定或约束。归纳起来,对指令还要掌握以下几个方面内容:要清楚指令操作数的寻址方式,不同寻址方式,执行时间大不相同;指令对标志位的影响、标志位对指令的影响指令的执行时间,对可完成相同功能的指令要选用执行时间短的指令指令的执行时间指令的执行时间指令的基本执行时间举例指令的基本执行时间举例加法指令执行时间加法指令执行时间计算有效地址计算有效地址EA所需时间所需时间数据传送指令(数据传送指令(14条)条)1.通用数据传送指令通用数据传送指令 MOV(MOVe byte or word)传送字节或字。POP(POP wor
3、d off stack)字退栈。PUSH(PUSH Word into stack)字进栈。XCHG(Exchange byte or word)字节或字交换。XLAT(Translate byte)字节换码2.输入输出指令输入输出指令 IN(INput byte or word)输入字节或字。OUT(OUTput byte or word)输出字节或字。3.标志寄存器传送指令标志寄存器传送指令 LAHF(Load AH register from Flags)取标志到AH。SAHF(Store AH register in Flags)取AH到标志。PUSHF(PUSH Flags into
4、 stack)标志进栈。POPF(POP Flags off stack)标志退栈。4.地址传送指令地址传送指令 LEA(Load Effective Address)取有效地址。LDS(Load pointer using DS)取指示器到DS。LES(Load pointer using ES)取指示器到ES。除指令SAHF和POPF指令外,本类的其它指令都不影响标志位。1 通用数据传送指令通用数据传送指令(1)传送指令)传送指令 MOV(Move Instruction)传送指令是使用最频繁的指令,它相当于高级语言中的赋值语句。格式:格式:MOV Reg/Mem,Reg/Mem/Imm功
5、能:功能:把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。说明:说明:源操作数可以是立即数、通用寄存器、存储器以及段寄存器;目的操作数可以是通用寄存器、存储器和除CS外的段寄存器,目的操作数不能是立即数。当存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。注释:RegRegister(寄存器),MemMemory(存储器),ImmImmediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。通用数据传送指令通用数据传送指令MOV对MOV指令有以下几条具体规定,其中有些规定对其
6、它指令也同样有效。n两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOV BL,AX等是不正确的;n两个操作数不能同时为段寄存器,如:MOV ES,DS等;n代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV CS,AX等不正确,但指令MOV AX,CS等是正确的;n立即数不能直接传给段寄存器,如:MOV DS,100H等;n立即数不能作为目的操作数,如:MOV 100H,AX等;n指令指针IP,不能作为MOV指令的操作数;n两个操作数不能同时为存储单元,如:MOV VARA,VARB等,其中VARA和VARB是同数据类型的内存变量。对于规定2、4和7,我们可以用
7、通用寄存器作为中转来达到最终目的。通用数据传送指令通用数据传送指令MOV数据传送方向搭配图数据传送方向搭配图通用数据传送指令通用数据传送指令MOV举例:(1)寄存器与寄存器之间的数据传送例如:MOV AX,BX;(BX)AXMOV DL,AH;(AH)DLMOV DX,ES;(ES)DXMOV DS,AX;(AX)DSMOV AX,CS;(CS)AX 注意:源操作数和目的操作数的数据类型必须一致,可以同时是字节寄存器或字寄存器,不能同时为段寄存器;代码段寄存器CS不能为目的操作数;指令指针IP不能作为操作数。MOV指令不影响状态标志通用数据传送指令通用数据传送指令MOV举例:(2)立即数传送到
8、通用寄存器立即数传送到通用寄存器是指立即数传送给AX,BX,CX,DX,BP,SP,SI,DI以及AH,AL,BH,BL,CH,CL,DH,DL寄存器,但不能传送到段寄存器。例如:MOV AX,100Q;100QAXMOV BX,0FFFFH;0FFFFHBXMOV AL,-2;0FFFEHALMOV CH,100B;100BCHMOV DL,A;65DLMOV SI,OFFSET TABLE;OFFSET TABLESI注意:立即数与寄存器数据类型必须一致,立即数可以是二进制、八进制、十进制、十六进制的常数,可以是带符号或无符号的整数,也可以是ASCII字符。通用数据传送指令通用数据传送指令
9、MOV举例:(3)寄存器与存储器之间的数据传送寄存器与存储器之间的数据传送是指除了CS和IP以外的所有寄存器与内存储器之间的数据传送。例如:MOV AL,BUFFER;(BUFFER)ALMOV AX,SI ;(DS)10H+(SI)AXMOV DI,DX ;(DX)(DS)10H+(DI)MOV BX+DI,DL ;(DL)(DS)10H+(BX)+(DI)MOV SI,ES:BP ;(ES)10H+(BP)SIMOV AX,ABXSI;(DS)10H+(BX)(SI)+A位移)AX(4)立即数传送到存储器立即数的数据类型与存储器变量的类型一致。例如:MOV A,3 ;3同A的类型一致MOV
10、 BYTE PTR SI,3 ;3为一个字节MOV WORD PTR BX,3 ;3为一个字MOV B1BXDI1,30H ;30H同B1变量的类型一致存储器操作数可以采用各种存储器寻址方式。(2)堆栈指令)堆栈指令POP/PUSH堆栈的概念堆栈的概念堆栈堆栈也称作栈栈(Stack),是一种具有后进先出访问方式的存储空间;堆栈是先进后出(Last In First Out)的线性表,简称LIFO表,堆栈允许插入和删除的一端称作栈顶,另外一端称作栈底。堆栈就是限制在顶端进行插入和删除的线性表。见示意图堆栈有两个基本操作:入栈(push)和出栈(pop)。入栈就是将一个新的元素放入栈顶,这一个元素
11、只能够是字,不能是字节。入栈也称作压栈。出栈则是从栈顶取出一个元素。其中栈顶的元素总是最后入栈最先出栈。出栈也称作退栈或弹出。堆栈指令堆栈指令POP/PUSH8086的堆栈机制的堆栈机制8086 CPU中提供了堆栈的机制,将一段内存当作栈来使用,并通过8086的相关指令以栈的方式访问内存。堆栈操作过程中,段寄存器SS指向用于堆栈的内存段,SP指向该堆栈的栈顶,把它们合在一起就可以访问栈顶单元。堆栈的深度由SP的初值决定。入栈指令:入栈指令:PUSH 格式:格式:PUSH Reg/Mem PUSH Imm;80286+功能:功能:一个字进栈,系统自动完成两步操作:首先SPSP-2,使栈顶指针指向
12、一个新位置,然后(SP)操作数;出栈指令:出栈指令:POP 格式:格式:POP Reg/Mem功能:功能:弹出一个字,系统自动完成两步操作:首先弹出操作数(SP),然后SPSP+2,使栈顶指针指向新的栈顶位置;堆栈指令堆栈指令POP/PUSH举例:举例:PUSH AX ;(SP)-2SP且(SP),(SP)1)(AX)PUSH BX ;将(BX)压入堆栈PUSH SS ;将(SS)压入堆栈PUSH CS ;将(CS)压入堆栈(这是合法的)PUSH BETA ;将BETA存储字的内容压入堆栈PUSH BETABX;将BETABX一个字的内容压入堆栈PUSH BETABXSI;将BETABX+SI
13、一个字的内容压入堆栈POP BETABXSIPOP BETABXPOP BETAPOP A ;因为POP CS是非法的POP SSPOP BXPOP AX 堆栈指令堆栈指令POP/PUSH假设AX=4243H,执行指令“PUSH AX”,进栈前后堆栈段的情况如a、b所示,执行指令“POP BX”,堆栈段情况如图b、c所示。(a)进栈前堆栈段(b)进栈后和出栈前堆栈段(c)出栈后堆栈段 堆栈指令堆栈指令POP/PUSH注意:注意:(1)因为堆栈指针SP总是指向已经存入数据的栈顶,所以PUSH指令是先(SP)-2SP,然后将内容压栈,即先修改SP使之指向堆栈中的空闲单元,后将内容压栈。而POP是先
14、从栈顶弹出一个字,然后将堆栈指针(SP)+2SP以便使刚刚弹出的堆栈字空间释放;(2)因为SP总是指向栈顶,而用PUSH和POP指令存取数时都是在栈顶进行的,所以堆栈是“先进后出”或称作“后进先出”。栈底在高地址,堆栈是从高地址向低地址延伸的,所以栈底就是最初的栈顶;(3)PUSH CS 是合法的,但POP CS是非法的;(4)PUSH 和POP的操作数都不能是立即数;(5)用PUSH指令和POP指令时只能按字访问堆栈,不能按字节访问堆栈;(6)PUSH和POP指令都不影响标志。堆栈指令堆栈指令POP/PUSH.model small .stack 4h .code go:mov ah,A m
15、ov al,B mov bh,C mov bl,D push ax push bx pop ax pop bx mov ah,4ch int 21h end go(3)交换指令)交换指令XCHG格式:格式:XCHG Reg/Mem,Reg/Mem功能:功能:将源操作数和目的操作数相互交换。目的操作数和源操作数同时为字节或字。例如例如:XCHG AX,BX ;AX与BX寄存器内容交换 XCHG SI,AX ;SI与AX内容交换 XCHG AL,BL ;AL与BL内容交换 XCHG WORD_VAR,CX ;变量WORD_VAR与CX寄存器内容交换 XCHG DH,BYTE_VAR ;DH与变量B
16、YTE_VAR内容交换 XCHG SI+3,AL ;DS:SI+3所指的内容与AL内容交换交换指令交换指令XCHG注意:注意:(1)XCHG指令不影响状态标志。(2)操作数可以是通用寄存器和存储器,但不包括段寄存器,也不能为立即数。(3)源操作数和目的操作数不能同时为存储器,因此不能直接实现两个存储器单元的内容交换。若要进行存储器(字)变量A和存储器(字)变量B的内容交换,可以借用一个通用寄存器来实现:MOV AX,B XCHG AX,A MOV B,AX 交换指令交换指令XCHG举例:举例:用XCHG指令将字符串S1与S2的内容进行交换源程序如下:DATA SEGMENTS1 DB ABCD
17、EFGS2 DB 0123456N DW$-OFFSET S2 ;N为字符串长度DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV SI,0 MOV CX,N;将字符的个数送至CX中L1:MOV AL,S1SI XCHG AL,S2SI MOV S1SI,AL;借助寄存器AL将S1SI与S2SI交换 INC SI LOOP L1;循环N次 MOV AH,4CH INT 21HCODE ENDS END START(4)查表转换指令)查表转换指令XLAT格式:格式:XLAT功能:功能:换码表中的一
18、个字节,称为换码字节,用换码字节来置换累加器AL中的内容,即ALBXAL。说明:说明:该指令有两个隐含操作数BX和AL,换码表的表首由DS:BX指向,要换的码在表中的位移由寄存器AL中的内容指出。指令执行后即将表中要换的码置入AL中,即DS:BX+ALAL。查表转换指令查表转换指令XLAT举例:利用XLAT指令将计算机机内二进制表示的十六进制转换成ASCII码并显示输出源程序如下:DATA SEGMENTHEX_NUM DB 0,1,2,3,4,5,6,7,8,9,0AH,0BH,0CH,0DH,0EH,0FHTABLE DB 0123456789ABCDEFDATA ENDSCODE SEG
19、MENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AXMOV CX,16MOV BX,OFFSET TABLEMOV SI,OFFSET HEX_NUM查表转换指令查表转换指令XLAT L:MOV AL,SIXLAT TABLE;换码DS:BX+ALALMOV DL,ALMOV AH,02H;显示输出INT 21HMOV DL,INT 21HINC SILOOP LMOV AH,4CH INT 21HCODE ENDSEND START2 输入输出指令输入输出指令IN/OUT格式一:格式一:端口输入端口输入 IN AL,port 端口输出
20、端口输出 OUT port,AL功能:功能:IN从指定的外设端口读数据到AL寄存器,OUT将AL寄存器的内容传送到指定的外设端口。说明:说明:这里端口地址port为立即数,限制在0255,只能使用AX或AL收发端口数据。格式二格式二:端口输入端口输入 MOV DX,port IN AL,DX 端口输出端口输出 MOV DX,port OUT DX,AL说明:说明:这里端口地址可以在0655353 标志寄存器传送指令标志寄存器传送指令(1)LAHF指令(Load AH with Flags)格式:格式:LAHF功能:功能:将标志寄存器的状态标志SF,ZF,AF,PF,CF位传送至AH寄存器的对应
21、位,AH寄存器的其余3位内容不变,其操作如图所示:标志寄存器传送指令标志寄存器传送指令(2)SAHF指令(Store AH into Flags)格式:SAHF功能:将AH的指定位(与状态标志对应的位)传送至标志寄存器(即与LAHF指令传送方向相反)。其操作示意如下图所示 该条指令把寄存器AH的指定位送至标志寄存器低8位的SF,ZF,AF,PF和CF标志位,因而这些标志的内容会受到影响。但这条指令不影响溢出标志OF、方向标志DF、中断允许标志IF和追踪标志TF,即不影响标志寄存器的高位字节。标志寄存器传送指令标志寄存器传送指令(3)PUSHF指令(PUSH Flags)格式:格式:PUSHF功
22、能:功能:将标志寄存器的内容压入堆栈。先将堆栈指针减2(即(SP)-2SP),然后将整个标志寄存器(16位)的内容压入SP所指向的栈顶。这条指令不影响状态标志。(4)POPF指令(POP Flags)格式:格式:POPF功能:功能:标志寄存器退栈。先将堆栈顶的内容,即(SP)+1,(SP)传送至标志寄存器(16位)中,然后将堆栈指针SP加2,即(SP)+2SP。执行该指令后,标志寄存器的各位会发生相应的变化,因此,该指令影响标志寄存器。4 地址传送指令地址传送指令(1)有效地址传送指令有效地址传送指令LEA(Load Effective Address)格式:格式:LEA Reg,Mem 功能
23、:功能:把源操作数的有效地址传送至目的操作数寄存器说明:说明:该指令通常用来对指针或变址寄存器BX、DI或SI等置初值之用。目的操作数为16位的通用寄存器(即AX,BX,CX,DX,SP,BP,SI,DI之一);源操作数是存储器操作数,如变量、标号或地址表达式例如:LEA BX,BUFFER;将变量BUFFER的位移量送入BX中LEA DX,BUFARRAYBXSI ;将数组元素的位移量送入DX中LEA AX,BPDI ;将有效地址(BP)+(DI)送入AX中地址传送指令地址传送指令注意:(1)LEA指令处理的是变量的地址(即变量的位移量),而不是变量的内容(即变量的值)。(2)LEA指令和M
24、OV指令有本质上的区别。假设变量BUFFER的偏移是1000H,该字变量的值是4243H,则指令“LEA AX,BUFFER”是将偏移1000H送入AX中,而指令“MOV AX,BUFFER”是将值4243H送入AX中。MOV指令也可以传送有效地址(位移量),但必须用OFFSET操作符作用于变量,“MOV AX,OFFSET BUFFER”将变量BUFFER的位移量送入AX中。(3)LEA指令的源操作数可以带下标,即LEA指令可以传送任意数组元素的位移量。例如指令“LEA DX,BUFARRAYBXSI”是将数组元素BUFARRAYBXSI的位移量传送至DX中。而MOV指令用OFFSET操作符
25、则不能直接取数组元素的位移量,只能取数组的第一个元素的位移量(即数组的起始地址)。(4)LEA指令的源操作数必须是存储器操作数。(5)LEA指令的目的操作数必须是16位寄存器。(6)LEA指令不影响状态标志。地址传送指令地址传送指令(2)取段寄存器指令)取段寄存器指令(Load Segment Instruction)格式:格式:LDS/LES Reg,Mem 功能:功能:将双字指针传送至目的操作数(寄存器)和数据段寄存器。将源操作数中所含的一个32位地址指针的段值部分(变量或标号所在地段的基址)送到数据段寄存器DS(LDS)或ES(LES)中,偏移部分(变量或标号所在段的位移量)送到目的操作
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ibm pc 汇编语言 程序设计 沈美明 第二 指令 寻址
限制150内