汇编语言程序设计-第3章 80x86指令系统课件_第1页
汇编语言程序设计-第3章 80x86指令系统课件_第2页
汇编语言程序设计-第3章 80x86指令系统课件_第3页
汇编语言程序设计-第3章 80x86指令系统课件_第4页
汇编语言程序设计-第3章 80x86指令系统课件_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章80x86指令系统讲授要点3种操作数(立即数、寄存器和内存操作数)的形式。常用指令的格式、功能以及对CF、OF、SF、ZF的影响。使用指令时容易犯的错误。11/4/202280x86汇编语言程序设计第3章80x86指令系统讲授要点3种操作数(立即数、寄13.1指令格式1.指令的书写格式 标号: 指令助记符 操作数 ;注释2.操作数的3种形式:立即操作数:指令的操作数是立即数,并直接出现在指令中。寄存器操作数:操作数是寄存器的值,指令中使用寄存器名。内存操作数:操作数是某个内存单元的值,指令中给出有效地址EA,段地址在某个段寄存器中。11/4/202280x86汇编语言程序设计3.1指令格式1.指令的书写格式11/2/202280x23.2操作数的形式3.2.18086指令的操作数形式1.立即数:8位或16位立即数。2.寄存器操作数:

8位/16位通用寄存器和段寄存器(除了FS和GS)。3.内存操作数包括下列几种形式。 Variable 或[Variable] [reg] disp[reg] [base][index] disp[base][index]

说明:Variable是变量名或变量名±整数表达式。reg为BX、BP、SI、DI。disp可以是常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。base为BX或BP,index为SI或DI。有效地址为各项之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,则隐含段地址在SS,否则在DS。当段地址不在隐含的段寄存器时,可使用段超越前缀,形式为: 段寄存器名:11/4/202280x86汇编语言程序设计3.2操作数的形式3.2.18086指令的操作数形式33.2.232位CPU扩展的操作数形式1.立即数:32位立即数。2.寄存器操作数:32位通用寄存器以及FS和GS。3.内存操作数包括下列几种形式。 [base] disp[base] [base][index] disp[base][index] [index*n] disp[index*n] [base][index*n] disp[base][index*n]说明:base、index为任一32位通用寄存器(index不能取ESP)。n为比例因子,取1、2、4或8。若包含base且base为EBP或ESP,则隐含段地址在SS;否则,隐含段地址在DS。若在16位CPU上编程,则不能使用这些寻址方式。11/4/202280x86汇编语言程序设计3.2.232位CPU扩展的操作数形式1.立即数:343.3指令系统介绍设计完整程序所需的常用指令,对于其余指令,一部分在后续章节中讲授,一部分自学。介绍常用指令的格式、功能以及对CF、OF、SF、ZF的影响。11/4/202280x86汇编语言程序设计3.3指令系统介绍设计完整程序所需的常用指令,对于其余5为了描述方便,采用下列符号约定:dest —目的操作数src —源操作数oprdn —第n个操作数,如oprd1,oprd2,oprd3= —赋值/ —或者reg8 —8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DLreg16 —16位通用寄存器AX/BX/CX/DX/SI/DI/BP/SPreg32 —32位通用寄存器EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESPreg —reg8/reg16/reg32seg —段寄存器CS/DS/SS/ES/FS/GSmem8 —8位内存操作数mem16 —16位内存操作数mem32 —32位内存操作数mem —mem8/mem16/mem32mem64 —64位内存操作数imm8 —8位立即数imm16 —16位立即数imm32 —32位立即数imm —imm8/imm16/imm3211/4/202280x86汇编语言程序设计为了描述方便,采用下列符号约定:mem —mem8/me63.3.1数据传送指令1.MOV(Move):传送一般形式: MOV dest,src ;dest=src。将源操作数src复制到目的操作数dest,src不变。语法格式: MOV reg/mem/seg,reg/mem/seg/imm对标志位的影响:无。说明:dest与src不能作如下搭配: MOV mem,mem ;错误 MOV seg,seg ;错误 MOV seg,imm ;错误dest不能是CS。dest与src必须类型匹配,即同时是字节、字或双字类型。11/4/202280x86汇编语言程序设计3.3.1数据传送指令1.MOV(Move):传73.3.1数据传送指令2.XCHG(Exchange):交换一般形式: XCHG oprd1,oprd2 ;交换oprd1与oprd2的内容语法格式: XCHG reg/mem,reg/mem对标志位的影响:无。说明:oprd1与oprd2不能作如下搭配: XCHG mem,mem ;错误oprd1与oprd2类型必须匹配。、【例】

xchg ebx,edx xchg [ebp][eax*4],edx11/4/202280x86汇编语言程序设计3.3.1数据传送指令2.XCHG(Exchang83.3.1数据传送指令3.LEA(LoadEffectiveAddress):装入有效地址

语法格式: LEA reg16,mem ;reg16=mem的有效地址 对标志位的影响:无。【例】设BX=5678H,EAX=1,EDX=2。 lea si,2[bx] ;执行后,SI=567AH lea si,2[eax][edx] ;执行后,SI=54.LDS、LES

语法格式: LDS reg16,mem32 ;reg16=mem32的低字,DS=mem32的高字 LES reg16,mem32 ;reg16=mem32的低字,ES=mem32的高字 对标志位的影响:无。11/4/202280x86汇编语言程序设计3.3.1数据传送指令3.LEA(LoadEffe93.3.1数据传送指令5.堆栈操作指令 80x86系统的堆栈具有如下特点:堆栈是在内存的堆栈段中,具有“先进后出”的特点。堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单元。堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反。堆栈操作只能以字或双字为单位。SS:SP指向栈顶。11/4/202280x86汇编语言程序设计3.3.1数据传送指令5.堆栈操作指令11/2/2103.3.1数据传送指令(1)PUSH与POP:进栈与出栈

语法格式: PUSH reg16/seg/mem16/reg32/mem32 POP reg16/seg/mem16/reg32/mem32 ;操作数不能是CS PUSH imm ;286新增功能描述: PUSH指令(16位): SP=SP-2 SS:[SP]=16位操作数 POP指令(16位): 16位操作数=SS:[SP] SP=SP+2 PUSH指令(32位): SP=SP-4 SS:[SP]=32位操作数 POP指令(32位): 32位操作数=SS:[SP] SP=SP+4对标志位的影响:无。11/4/202280x86汇编语言程序设计3.3.1数据传送指令(1)PUSH与POP:进栈与出栈113.3.1数据传送指令(2)PUSHF与POPF:标志寄存器进栈和出栈语法格式: PUSHF ;FLAGS进栈 POPF ;栈顶字出栈到FLAGS对标志位的影响:只有POPF指令会以弹出值设置标志寄存器。

【例】设SP=100H,EBX=12345678H,给出下列指令依次执行后的结果。 push bx ;ss:[00ffh]=56h,ss:[00feh]=78h,sp=0feh pop ax ;ax=5678h,sp=100h push ebx ;ss:[00feh]=1234h,ss:[00fch]=5678h,sp=0fch pop ax ;ax=5678h,sp=0feh pop ax ;ax=1234h,sp=100h

【例】交换AX与CX的值。 push ax push cx pop ax pop cx11/4/202280x86汇编语言程序设计3.3.1数据传送指令(2)PUSHF与POPF:标志寄123.3.1数据传送指令6.标志寄存器传送指令(1)LAHF(LoadAHfromFlags) 语法格式: LAHF ;AH=FLAGS的低8位 对标志位的影响:无。

(2)SAHF(StoreAHintoFlags) 语法格式: SAHF ;FLAGS的低8位=AH 对标志位的影响:由新装入值确定。

11/4/202280x86汇编语言程序设计3.3.1数据传送指令6.标志寄存器传送指令11/2133.3.1数据传送指令符号扩展与零扩展指令 对标志位的影响:无。(1)CBW、CWD、CWDE与CDQ 语法格式: CBW ;AL符号扩展为AX CWD ;AX符号扩展为32位数DX:AX CWDE ;AX符号扩展为EAX;386新增 CDQ ;EAX符号扩展为64位数EDX:EAX;386新增【例】设AL=0FEH,给出依次执行下列指令后的结果。 cbw ;ax=0fffeh cwd ;dx=0ffffh,ax不变,即dx:ax=-2 cwde ;eax=0fffffffeh(-2) cdq ;edx=0ffffffffh,eax不变,即edx:eax=-2

11/4/202280x86汇编语言程序设计3.3.1数据传送指令符号扩展与零扩展指令11/2/20143.3.1数据传送指令(2)MOVSX一般形式: MOVSX dest,src ;src符号扩展为dest;386新增语法格式: MOVSX reg16,reg8/mem8 MOVSX reg32,reg8/mem8/reg16/mem16功能描述:MOVSX是CBW、CWD和CWDE的一般形式,用来将8位数符号扩展为16位或32位数,或者将16位数符号扩展为32位数。【例】CBW和CWDE的功能可由MOVSX指令实现。 movsx ax,al ;等价于cbw movsx eax,ax ;等价于cwde movsx eax,al ;等价于顺序执行cbw与cwde

11/4/202280x86汇编语言程序设计3.3.1数据传送指令(2)MOVSX11/2/2022153.3.1数据传送指令(3)MOVZX一般形式: MOVZX dest,src ;src零扩展为dest;386新增语法格式: MOVZX reg16,reg8/mem8 MOVZX reg32,reg8/mem8/reg16/mem16

11/4/202280x86汇编语言程序设计3.3.1数据传送指令(3)MOVZX11/2/2022163.3.1数据传送指令8.XLAT(Translate):换码语法格式: XLAT ;AL=DS:[BX+AL]功能描述:将DS:BX所指内存区中、由AL指定位移处的一个字节赋给AL。对标志位的影响:无。

11/4/202280x86汇编语言程序设计3.3.1数据传送指令8.XLAT(Translat173.3.2算术指令1.加法一般形式: ADD dest,src ;dest=dest+src ADC dest,src ;dest=dest+src+CF INC dest ;dest=dest+1语法格式: ADD reg/mem,reg/mem/imm ADC reg/mem,reg/mem/imm INC reg/mem对标志位的影响:ADD、ADC:按一般规则影响CF、OF、SF和ZF。INC:不影响CF,其它同ADD。说明:ADD与ADC的2个操作数必须类型匹配,且不能同时是内存操作数。11/4/202280x86汇编语言程序设计3.3.2算术指令1.加法11/2/202280x86183.3.2算术指令2.减法一般形式: SUB dest,src ;dest=dest–src SBB dest,src ;dest=dest-src–CF CMP dest,src ;dest–src。与SUB的区别在于,不将减法结果存入dest。 DEC dest ;dest=dest-1 NEG dest ;dest=0–dest语法格式: SUB reg/mem,reg/mem/imm SBB reg/mem,reg/mem/imm CMP reg/mem,reg/mem/imm DEC reg/mem NEG reg/mem对标志位的影响:SUB、SBB、CMP、NEG:按一般规则影响CF、OF、SF和ZF。CF表示借位。DEC:不影响CF,其它同SUB。说明:2个操作数必须类型匹配,且不能同时是内存操作数。11/4/202280x86汇编语言程序设计3.3.2算术指令2.减法11/2/202280x86193.3.2算术指令3.乘法(1)MUL(UnsignedMultiplication):无符号乘法一般形式: MUL src 语法格式: MUL reg8/mem8 ;AX=AL×src MUL reg16/mem16 ;DX:AX=AX×src MUL reg32/mem32 :EDX:EAX=EAX×src对标志位的影响:若8位×8位、16位×16位或32位×32位的结果分别能由8、16或32位容纳(即结果的高一半为0),则CF=OF=0,否则,CF=OF=1;其余标志无定义。说明:由于2个n位数的乘积可能需要2n位,因此,若操作数是8位,则结果为16位;同样,16位操作数相乘结果为32位,32位数相乘结果为64位。11/4/202280x86汇编语言程序设计3.3.2算术指令3.乘法11/2/202280x86203.3.2算术指令(2)IMUL(IntegerMultiplication):带符号乘法一般形式: IMUL src 语法格式: IMUL reg8/mem8 ;AX=AL×src。执行带符号乘法,下同。 IMUL reg16/mem16 ;DX:AX=AX×src IMUL reg32/mem32 :EDX:EAX=EAX×src对标志位的影响:若结果的高一半为低一半的符号扩展,则CF=OF=0,否则,CF=OF=1;其余标志无定义。说明:由于2个n位数的乘积可能需要2n位,因此,若操作数是8位,则结果为16位;同样,16位操作数相乘结果为32位,32位数相乘结果为64位。【例】对于同一个二进制数,采用MUL与IMUL执行的结果可能不同。设AL=0FFH,BL=1,分别执行下列指令,会得出不同结果。 mul bl ;ax=0ffh(255) imul bl ;ax=0ffffh(-1)11/4/202280x86汇编语言程序设计3.3.2算术指令(2)IMUL(IntegerMul213.3.2算术指令4.除法一般形式: DIV src ;无符号数除法 IDIV src ;带符号数除法语法格式: DIV reg/mem IDIV reg/mem 功能描述:src是8位:AX÷src,结果商在AL、余数在AH。src是16位:DX:AX÷src,结果商在AX、余数在DX。src是32位:EDX:EAX÷src,结果商在EAX、余数在EDX。对标志位的影响:无定义。11/4/202280x86汇编语言程序设计3.3.2算术指令4.除法11/2/202280x86223.3.2算术指令5.十进制调整指令

(1)压缩BCD码调整指令语法格式: DAA ;调整AL中的和为压缩BCD码 DAS ;调整AL中的差为压缩BCD码功能描述:DAA:通常先执行ADD/ADC指令,将2个压缩BCD码相加,结果存放在AL中。然后使用该指令将AL调整为压缩BCD码格式。DAS:通常先执行SUB/SBB指令,将2个压缩BCD码相减,结果存放在AL中。然后使用该指令将AL调整为压缩BCD码格式。对标志位的影响:OF不确定;CF反映压缩BCD码相加/相减的进位/借位状态;按一般规则影响SF和ZF。说明:若使用DAA/DAS指令,则参加加法/减法运算的操作数应该是压缩BCD码。如果将任意2个二进制数相加/减,然后调整,将得不到正确结果。11/4/202280x86汇编语言程序设计3.3.2算术指令5.十进制调整指令11/2/2022233.3.2算术指令DAA的调整算法如下:if(AL低4位>9或AF=1)then AL=AL+6; AF=1;endifif(AL高4位>9或CF=1)then AL=AL+60H; CF=1;endifDAS的调整算法如下:if(AL低4位>9或AF=1)then AL=AL–6; AF=1;endifif(AL高4位>9或CF=1)then AL=AL-60h; CF=1;endif11/4/202280x86汇编语言程序设计3.3.2算术指令DAA的调整算法如下:DAS的调整算法243.3.2算术指令(2)非压缩BCD码调整指令语法格式: AAA ;调整AL中的和为非压缩BCD码 ;调整后,AL高4位=0,AH=AH+产生的CF AAS ;调整AL中的差为非压缩BCD码 ;调整后,AL高4位=0,AH=AH-产生的CF AAM ;AH=AXdiv10,AL=AXmod10 AAD ;AL=AH×10+AL,AH=0功能描述:AAA:通常先执行ADD/ADC指令,以AL为目的操作数,将2个非压缩BCD码(高4位无关)相加。然后使用AAA将AL调整为非压缩BCD码格式,且高4位=0,同时将调整产生的进位加到AH中。AAS:通常先执行SUB/SBB指令,以AL为目的操作数,将2个非压缩BCD码(高4位无关)相减。然后使用AAS将AL调整为非压缩BCD码格式,且高4位=0,同时将调整产生的借位从AH中减去。AAM与AAD:略。对标志位的影响:AAA与AAS:CF反映非压缩BCD码加/减的进位/借位;OF、SF和ZF不确定。11/4/202280x86汇编语言程序设计3.3.2算术指令(2)非压缩BCD码调整指令11/2/253.3.2算术指令AAA的调整算法如下:if(AL低4位>9或AF=1)then AL=AL+6; AH=AH+1; AF=1; CF=1;else AF=0; CF=0;endifAL=ALAND0FH;AL高4位清0AAS的调整算法如下:if(AL低4位>9或AF=1)thenAL=AL–6;AH=AH–1;AF=1;CF=1;elseAF=0;CF=0;endifAL=ALAND0FH;AL高4位清011/4/202280x86汇编语言程序设计3.3.2算术指令AAA的调整算法如下:AAS的调整算法263.3.3位操作指令1.逻辑指令一般形式: AND dest,src ;dest=destandsrc OR dest,src ;dest=destorsrc XOR dest,src ;dest=destxorsrc NOT dest ;dest=notdest TEST dest,src ;destandsrc,执行AND操作但不存储结果到dest语法格式: AND reg/mem,reg/mem/imm OR reg/mem,reg/mem/imm XOR reg/mem,reg/mem/imm NOT reg/mem TEST reg/mem,reg/mem/imm 对标志位的影响:NOT:无。其它指令:CF=OF=0,按一般规则影响SF和ZF。11/4/202280x86汇编语言程序设计3.3.3位操作指令1.逻辑指令11/2/202280273.3.3位操作指令1.移位指令

移位指令包括:SHL(ShiftLeft):逻辑左移SAL(ShiftArithmeticLeft):算术左移SHR(ShiftRight):逻辑右移SAR(ShiftArithmeticRight):算术右移其中,SHL与SAL完全相同,只是同一指令的不同助记符而已。一般形式: SHL dest,count ;dest左移。其中,count为移位次数(下同) SAL dest,count ;同SHL SHR dest,count ;dest逻辑右移 SAR dest,count ;dest算术右移语法格式: SHL reg/mem,1/CL SHL reg/mem,imm8 ;286新增 SAL、SHR与SAR格式同SHL11/4/202280x86汇编语言程序设计3.3.3位操作指令1.移位指令11/2/202280283.3.3位操作指令功能描述:SHL/SAL:左移。最高位移出到CF,最低位移入0。SAR:算术右移。最低位移入CF,最高位不变。SHR:逻辑右移。最低位移入CF,最高位移入0。对标志位的影响:若移位后符号位发生了变化,则OF=1,否则OF=0;CF为最后移入位;按一般规则影响ZF与SF。然而,若移位次数为0,则不影响标志位;若移位次数>1,则OF无定义。【例】设AX的值为一个2字节非压缩BCD码,将其转换为1字节压缩BCD码存入AL。 mov cl,4 shl ah,cl ;ah低4位移到高4位 and al,0fh ;al高4位清0 or al,ah 11/4/202280x86汇编语言程序设计3.3.3位操作指令功能描述:11/2/202280x8293.3.3位操作指令2.循环移位循环移位指令包括:ROL(RotateLeft):循环左移ROR(RotateRight):循环右移RCL(RotatethroughCarryLeft):带进位循环左移RCR(RotatethroughCarryRight):带进位循环右移一般形式: ROL dest,count ;dest循环左移。其中,count为移位次数(下同) ROR dest,count ;dest循环右移 RCL dest,count ;dest带CF循环左移 RCR dest,count ;dest带CF循环右移语法格式: ROL reg/mem,1/CL ROL reg/mem,imm8 ;286新增 ROR、RCL、RCR格式同ROL11/4/202280x86汇编语言程序设计3.3.3位操作指令2.循环移位11/2/202280x303.3.3位操作指令功能描述:ROL:循环左移。最高位移出到CF,并同时移入最低位。RCL:带进位循环左移。最高位移出到CF,原CF移入最低位。ROR:循环右移。最低位移出到CF,并同时移入最高位。RCR:带进位循环右移。最低位移出到CF,原CF移入最高位。对标志位的影响:若移位后符号位发生了变化,则OF=1,否则OF=0;CF为最后移入位;不影响ZF与SF。然而,若移位次数为0,则不影响标志位;若移位次数>1,则OF无定义。【例】将DX:AX中的32位数左移1位。 shl ax,1 rcl dx,111/4/202280x86汇编语言程序设计3.3.3位操作指令功能描述:11/2/202280x8313.3.3位操作指令3.位测试指令

位测试指令包括;BT(BitTest):位测试BTS(BitTestandSet):位测试并置位BTR(BitTestandReset):位测试并复位BTC(BitTestandComplement):位测试并取反)这些指令均为386新增指令。一般形式: BT dest,index ;CF=dest的第index位,dest不变 BTS dest,index ;CF=dest的第index位,dest的第index位=1 BTR dest,index ;CF=dest的第index位,dest的第index位=0 BTC dest,index ;CF=dest的第index位,dest的第index位取反11/4/202280x86汇编语言程序设计3.3.3位操作指令3.位测试指令11/2/20228323.3.3位操作指令语法格式: BT reg16/mem16,reg16/imm8 BT reg32/mem32,reg32/imm8 BTR、BTS、BTC格式同BT对标志位的影响:影响CF;其余标志无定义。【例】位测试。 bt eax,12 ;CF=eax的第12位 bts eax,12 ;CF=eax的第12位,eax的第12位=1 btr eax,12 ;CF=eax的第12位,eax的第12位=0 btc eax,12 ;CF=eax的第12位,eax的第12位取反11/4/202280x86汇编语言程序设计3.3.3位操作指令语法格式:11/2/202280x8333.3.4控制转移指令1.JMP(Jump):无条件转移

一般形式: JMP target ;转移到target指定的目标地址处根据转移的距离,JMP指令可分为下列两类:段内转移:在同一代码段内进行,又称近(Near)转移,只要修改IP的值即可实现。段间转移:可在不同代码段之间进行,又称远(Far)转移,需要同时修改CS和IP的值。根据目标地址的指定方式,JMP指令又可分为直接转移和间接转移。所谓直接转移,是指转移的目标地址直接出现在指令中,在程序执行前就已确定。所谓间接转移,指转移的目标地址是寄存器或内存操作数的值,只有执行到该条指令时才能确定。因此,JMP指令共有下列4种转移方式:段内直接转移(Intrasegment/DirectJump)段间直接转移(Intersegment/DirectJump)段内间接转移(Intrasegment/IndirectJump)段间间接转移(Intersegment/IndirectJump)在汇编语言程序中,通常使用标号(Label)来指定直接转移的目标地址。11/4/202280x86汇编语言程序设计3.3.4控制转移指令1.JMP(Jump):无条件转343.3.4控制转移指令语法格式: JMPlabel ;若label与该指令位于同一代码段:IP=label的偏移地址; ;若label与该指令不在同一代码段:CS:IP=label的分段地址 JMPreg16/mem16 ;IP=reg16/[mem16] JMPmem32 ;CS=[mem32+2],IP=[mem32]功能描述: JMP label ;段内/段间直接转移 ;目标地址:标号label处 JMP reg16/mem16;段内间接转移 ;目标地址:同一代码段,偏移地址=reg16/[mem16] JMP mem32 ;段间间接转移 ;目标地址:段地址=mem32高字,偏移地址=mem32低字对标志位的影响:无。11/4/202280x86汇编语言程序设计3.3.4控制转移指令语法格式:11/2/202280x353.3.4控制转移指令2.条件转移指令

为简化描述,用Jcc表示所有条件转移指令的助记符。一般形式: Jcc label ;若条件成立,则IP=label的偏移地址。其中,label是标号功能描述:若条件成立,则转移到目标地址label;否则,CPU忽略该条件转移,继续执行下一条指令。对标志位的影响:无。Jcc指令包括下列3类:(1)测试单个标志位的Jcc指令。(2)用于带符号数比较的Jcc指令。常用在CMP指令之后,以判断带符号数的大小。(3)用于无符号数比较的Jcc指令。常用在CMP指令之后,以判断无符号数的大小。11/4/202280x86汇编语言程序设计3.3.4控制转移指令2.条件转移指令11/2/202363.3.4控制转移指令3.JCXZ/JECXZ(JumpifCX/ECXisZero)

语法格式: JCXZ label ;若CX=0,则转移到label JECXZ label ;若ECX=0,则转移到label;386新增对标志位的影响:无说明:label相对位移量必须在-128~127之间,所有80x86CPU都一样。11/4/202280x86汇编语言程序设计3.3.4控制转移指令3.JCXZ/JECXZ(Jum373.3.4控制转移指令4.循环指令循环指令包括:LOOPLOOPE/LOOPZ(LoopwhileEqual/Zero)LOOPNE/LOOPNZ(LoopwhileNotEqual/NotZero)LOOPZ与LOOPE、LOOPNZ与LOOPNE完全等价,只是同一指令的不同助记符。语法格式: LOOP label ;CX=CX–1,若CX<>0,则转移到label LOOPZ/LOOPE label ;CX=CX–1,若CX<>0且ZF=1,则转移到label LOOPNZ/LOOPNE label ;CX=CX–1,若CX<>0且ZF=0,则转移到label对标志位的影响:无。11/4/202280x86汇编语言程序设计3.3.4控制转移指令4.循环指令11/2/20228383.3.4控制转移指令5.中断指令INT本章只简单引入软件中断调用指令INT。详细介绍参见第8章。语法格式: INT n ;调用中断n的中断服务程序。n为中断号,取值0~255。对标志位的影响:不影响CF、OF、SF、ZF。MSDOS使用中断号21H作为系统调用,为程序员提供了上百种系统服务功能,对这些功能的调用步骤如下:(1)由AH给出功能号。(2)根据相应功能的要求,设置入口参数。(3)INT21H。(4)分析和使用出口参数。其中,最常用的是功能号4CH,用来实现程序退出、并返回DOS。使用方法如下: mov ah,4ch int 21h11/4/202280x86汇编语言程序设计3.3.4控制转移指令5.中断指令INT11/2/20393.3.5标志处理指令标志处理指令包括CLC(ClearCarryFlag,CF清0)、STC(SetCarryFlag,CF置1)、CMC(ComplementCarryFlag,CF取反)、CLD(ClearDirectionFlag,DF清0)、STD(SetDirectionFlag,DF置1)、CLI(ClearInterruptFlag,关中断)和STI(SetInterruptFlag,开中断)。语法格式: CLC ;CF=0 STC ;CF=1 CMC ;CF=NOTCF CLD ;DF=0 STD ;DF=1 CLI ;IF=0 STI ;IF=1对标志位的影响:只影响指定标志。注意,在程序中应慎重使用CLI指令,错误的使用会导致系统无法正常工作。11/4/202280x86汇编语言程序设计3.3.5标志处理指令标志处理指令包括C403.3.6处理器控制指令1.NOP(NoOperation):无操作语法格式: NOP功能描述:NOP指令不做任何事情,只占用1个字节,耗费1个指令执行周期。说明:程序员经常使用NOP作为占位符(PlaceHolder),以预留内存空间。当然,可以使用其它指令实现类似功能,如XCHGAX,AX指令。事实上,NOP与XCHGAX,AX的机器码完全一样,都是90H。对标志位的影响:无。

11/4/202280x86汇编语言程序设计3.3.6处理器控制指令1.NOP(NoOperati413.3.6处理器控制指令2.HLT(Halt):暂停语法格式: HLT功能描述:使CPU进入暂停状态,这时CPU不执行任何操作,直到系统复位或发生外部中断为止。中断使CPU继续执行HLT后的下一条指令。说明:HLT不能用来终止程序。通常,应用程序不使用该指令。对标志位的影响:无。11/4/202280x86汇编语言程序设计3.3.6处理器控制指令2.HLT(Halt):暂停11423.4容易犯的错误1.操作数类型不匹配例如,将BL的值送AX。错误方法: mov ax,bl ;类型不匹配正确方法:(1)作为无符号数。 mov al,bl mov ah,0(2)作为带符号数。 mov al,bl cbw

11/4/202280x86汇编语言程序设计3.4容易犯的错误1.操作数类型不匹配11/2/202433.4容易犯的错误2.凭空构造指令例如:(1)实现AX=AL*5。错误方法: mul 5 ;MUL的操作数不能是立即数(2)将内存单元(段地址在DS,偏移地址在AX)的一个字节送BL。错误方法: mov bl,[ax] ;内存操作数不能用[AX]正确方法: mov si,ax mov bl,[si]11/4/202280x86汇编语言程序设计3.4容易犯的错误2.凭空构造指令11/2/2022443.4容易犯的错误3.对标志位的错误使用例如:判断AX的值,若AX=0FFFFH,则转移到标号L。错误方法: not ax ;NOT不影响标志位 jz l正确方法: xor ax,0ffffh jz l或 cmp ax,0ffffh je l11/4/202280x86汇编语言程序设计3.4容易犯的错误3.对标志位的错误使用11/2/20453.5实例举例说明指令的使用方法。如例3.41、3.42、3.43、3.46等。11/4/202280x86汇编语言程序设计3.5实例举例说明指令的使用方法。如例3.41、3.446本章小结80x86指令的操作数包括3种形式:立即数、寄存器(通用寄存器和段寄存器)与内存操作数。对于内存操作数,由操作数的形式可计算出有效地址。在缺省情况下,其段地址隐含在段寄存器DS或SS中,除非由段超越前缀明确给出。80386以下的16位CPU只能使用16位指令系统。32位80x86CPU在兼容16位指令系统的基础上,支持32位操作数与32位内存寻址方式。在实模式下,可以使用32位立即数、32位通用寄存器和扩展的内存操作数形式,但计算出的有效地址只能是16位。大多数指令(如传送类指令)的执行不影响标志位,某些指令(如算术指令)的执行按一般规则影响标志位,还有一部分指令(如逻辑指令)会按特定方式(清0、置1等)影响标志位。11/4/202280x86汇编语言程序设计本章小结80x86指令的操作数包括3种形式:立即数、寄存47第3章80x86指令系统讲授要点3种操作数(立即数、寄存器和内存操作数)的形式。常用指令的格式、功能以及对CF、OF、SF、ZF的影响。使用指令时容易犯的错误。11/4/202280x86汇编语言程序设计第3章80x86指令系统讲授要点3种操作数(立即数、寄483.1指令格式1.指令的书写格式 标号: 指令助记符 操作数 ;注释2.操作数的3种形式:立即操作数:指令的操作数是立即数,并直接出现在指令中。寄存器操作数:操作数是寄存器的值,指令中使用寄存器名。内存操作数:操作数是某个内存单元的值,指令中给出有效地址EA,段地址在某个段寄存器中。11/4/202280x86汇编语言程序设计3.1指令格式1.指令的书写格式11/2/202280x493.2操作数的形式3.2.18086指令的操作数形式1.立即数:8位或16位立即数。2.寄存器操作数:

8位/16位通用寄存器和段寄存器(除了FS和GS)。3.内存操作数包括下列几种形式。 Variable 或[Variable] [reg] disp[reg] [base][index] disp[base][index]

说明:Variable是变量名或变量名±整数表达式。reg为BX、BP、SI、DI。disp可以是常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。base为BX或BP,index为SI或DI。有效地址为各项之和。如disp[base][index]形式,EA=base+index+disp。若使用了BP,则隐含段地址在SS,否则在DS。当段地址不在隐含的段寄存器时,可使用段超越前缀,形式为: 段寄存器名:11/4/202280x86汇编语言程序设计3.2操作数的形式3.2.18086指令的操作数形式503.2.232位CPU扩展的操作数形式1.立即数:32位立即数。2.寄存器操作数:32位通用寄存器以及FS和GS。3.内存操作数包括下列几种形式。 [base] disp[base] [base][index] disp[base][index] [index*n] disp[index*n] [base][index*n] disp[base][index*n]说明:base、index为任一32位通用寄存器(index不能取ESP)。n为比例因子,取1、2、4或8。若包含base且base为EBP或ESP,则隐含段地址在SS;否则,隐含段地址在DS。若在16位CPU上编程,则不能使用这些寻址方式。11/4/202280x86汇编语言程序设计3.2.232位CPU扩展的操作数形式1.立即数:3513.3指令系统介绍设计完整程序所需的常用指令,对于其余指令,一部分在后续章节中讲授,一部分自学。介绍常用指令的格式、功能以及对CF、OF、SF、ZF的影响。11/4/202280x86汇编语言程序设计3.3指令系统介绍设计完整程序所需的常用指令,对于其余52为了描述方便,采用下列符号约定:dest —目的操作数src —源操作数oprdn —第n个操作数,如oprd1,oprd2,oprd3= —赋值/ —或者reg8 —8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DLreg16 —16位通用寄存器AX/BX/CX/DX/SI/DI/BP/SPreg32 —32位通用寄存器EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESPreg —reg8/reg16/reg32seg —段寄存器CS/DS/SS/ES/FS/GSmem8 —8位内存操作数mem16 —16位内存操作数mem32 —32位内存操作数mem —mem8/mem16/mem32mem64 —64位内存操作数imm8 —8位立即数imm16 —16位立即数imm32 —32位立即数imm —imm8/imm16/imm3211/4/202280x86汇编语言程序设计为了描述方便,采用下列符号约定:mem —mem8/me533.3.1数据传送指令1.MOV(Move):传送一般形式: MOV dest,src ;dest=src。将源操作数src复制到目的操作数dest,src不变。语法格式: MOV reg/mem/seg,reg/mem/seg/imm对标志位的影响:无。说明:dest与src不能作如下搭配: MOV mem,mem ;错误 MOV seg,seg ;错误 MOV seg,imm ;错误dest不能是CS。dest与src必须类型匹配,即同时是字节、字或双字类型。11/4/202280x86汇编语言程序设计3.3.1数据传送指令1.MOV(Move):传543.3.1数据传送指令2.XCHG(Exchange):交换一般形式: XCHG oprd1,oprd2 ;交换oprd1与oprd2的内容语法格式: XCHG reg/mem,reg/mem对标志位的影响:无。说明:oprd1与oprd2不能作如下搭配: XCHG mem,mem ;错误oprd1与oprd2类型必须匹配。、【例】

xchg ebx,edx xchg [ebp][eax*4],edx11/4/202280x86汇编语言程序设计3.3.1数据传送指令2.XCHG(Exchang553.3.1数据传送指令3.LEA(LoadEffectiveAddress):装入有效地址

语法格式: LEA reg16,mem ;reg16=mem的有效地址 对标志位的影响:无。【例】设BX=5678H,EAX=1,EDX=2。 lea si,2[bx] ;执行后,SI=567AH lea si,2[eax][edx] ;执行后,SI=54.LDS、LES

语法格式: LDS reg16,mem32 ;reg16=mem32的低字,DS=mem32的高字 LES reg16,mem32 ;reg16=mem32的低字,ES=mem32的高字 对标志位的影响:无。11/4/202280x86汇编语言程序设计3.3.1数据传送指令3.LEA(LoadEffe563.3.1数据传送指令5.堆栈操作指令 80x86系统的堆栈具有如下特点:堆栈是在内存的堆栈段中,具有“先进后出”的特点。堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单元。堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反。堆栈操作只能以字或双字为单位。SS:SP指向栈顶。11/4/202280x86汇编语言程序设计3.3.1数据传送指令5.堆栈操作指令11/2/2573.3.1数据传送指令(1)PUSH与POP:进栈与出栈

语法格式: PUSH reg16/seg/mem16/reg32/mem32 POP reg16/seg/mem16/reg32/mem32 ;操作数不能是CS PUSH imm ;286新增功能描述: PUSH指令(16位): SP=SP-2 SS:[SP]=16位操作数 POP指令(16位): 16位操作数=SS:[SP] SP=SP+2 PUSH指令(32位): SP=SP-4 SS:[SP]=32位操作数 POP指令(32位): 32位操作数=SS:[SP] SP=SP+4对标志位的影响:无。11/4/202280x86汇编语言程序设计3.3.1数据传送指令(1)PUSH与POP:进栈与出栈583.3.1数据传送指令(2)PUSHF与POPF:标志寄存器进栈和出栈语法格式: PUSHF ;FLAGS进栈 POPF ;栈顶字出栈到FLAGS对标志位的影响:只有POPF指令会以弹出值设置标志寄存器。

【例】设SP=100H,EBX=12345678H,给出下列指令依次执行后的结果。 push bx ;ss:[00ffh]=56h,ss:[00feh]=78h,sp=0feh pop ax ;ax=5678h,sp=100h push ebx ;ss:[00feh]=1234h,ss:[00fch]=5678h,sp=0fch pop ax ;ax=5678h,sp=0feh pop ax ;ax=1234h,sp=100h

【例】交换AX与CX的值。 push ax push cx pop ax pop cx11/4/202280x86汇编语言程序设计3.3.1数据传送指令(2)PUSHF与POPF:标志寄593.3.1数据传送指令6.标志寄存器传送指令(1)LAHF(LoadAHfromFlags) 语法格式: LAHF ;AH=FLAGS的低8位 对标志位的影响:无。

(2)SAHF(StoreAHintoFlags) 语法格式: SAHF ;FLAGS的低8位=AH 对标志位的影响:由新装入值确定。

11/4/202280x86汇编语言程序设计3.3.1数据传送指令6.标志寄存器传送指令11/2603.3.1数据传送指令符号扩展与零扩展指令 对标志位的影响:无。(1)CBW、CWD、CWDE与CDQ 语法格式: CBW ;AL符号扩展为AX CWD ;AX符号扩展为32位数DX:AX CWDE ;AX符号扩展为EAX;386新增 CDQ ;EAX符号扩展为64位数EDX:EAX;386新增【例】设AL=0FEH,给出依次执行下列指令后的结果。 cbw ;ax=0fffeh cwd ;dx=0ffffh,ax不变,即dx:ax=-2 cwde ;eax=0fffffffeh(-2) cdq ;edx=0ffffffffh,eax不变,即edx:eax=-2

11/4/202280x86汇编语言程序设计3.3.1数据传送指令符号扩展与零扩展指令11/2/20613.3.1数据传送指令(2)MOVSX一般形式: MOVSX dest,src ;src符号扩展为dest;386新增语法格式: MOVSX reg16,reg8/mem8 MOVSX reg32,reg8/mem8/reg16/mem16功能描述:MOVSX是CBW、CWD和CWDE的一般形式,用来将8位数符号扩展为16位或32位数,或者将16位数符号扩展为32位数。【例】CBW和CWDE的功能可由MOVSX指令实现。 movsx ax,al ;等价于cbw movsx eax,ax ;等价于cwde movsx eax,al ;等价于顺序执行cbw与cwde

11/4/202280x86汇编语言程序设计3.3.1数据传送指令(2)MOVSX11/2/2022623.3.1数据传送指令(3)MOVZX一般形式: MOVZX dest,src ;src零扩展为dest;386新增语法格式: MOVZX reg16,reg8/mem8 MOVZX reg32,reg8/mem8/reg16/mem16

11/4/202280x86汇编语言程序设计3.3.1数据传送指令(3)MOVZX11/2/2022633.3.1数据传送指令8.XLAT(Translate):换码语法格式: XLAT ;AL=DS:[BX+AL]功能描述:将DS:BX所指内存区中、由AL指定位移处的一个字节赋给AL。对标志位的影响:无。

11/4/202280x86汇编语言程序设计3.3.1数据传送指令8.XLAT(Translat643.3.2算术指令1.加法一般形式: ADD dest,src ;dest=dest+src ADC dest,src ;dest=dest+src+CF INC dest ;dest=dest+1语法格式: ADD reg/mem,reg/mem/imm ADC reg/mem,reg/mem/imm INC reg/mem对标志位的影响:ADD、ADC:按一般规则影响CF、OF、SF和ZF。INC:不影响CF,其它同ADD。说明:ADD与ADC的2个操作数必须类型匹配,且不能同时是内存操作数。11/4/202280x86汇编语言程序设计3.3.2算术指令1.加法11/2/202280x86653.3.2算术指令2.减法一般形式: SUB dest,src ;dest=dest–src SBB dest,src ;dest=dest-src–CF CMP dest,src ;dest–src。与SUB的区别在于,不将减法结果存入dest。 DEC dest ;dest=dest-1 NEG dest ;dest=0–dest语法格式: SUB reg/mem,reg/mem/imm SBB reg/mem,reg/mem/imm CMP reg/mem,reg/mem/imm DEC reg/mem NEG reg/mem对标志位的影响:SUB、SBB、CMP、NEG:按一般规则影响CF、OF、SF和ZF。CF表示借位。DEC:不影响CF,其它同SUB。说明:2个操作数必须类型匹配,且不能同时是内存操作数。11/4/202280x86汇编语言程序设计3.3.2算术指令2.减法11/2/202280x86663.3.2算术指令3.乘法(1)MUL(UnsignedMultiplication):无符号乘法一般形式: MUL src 语法格式: MUL reg8/mem8 ;AX=AL×src MUL reg16/mem16 ;DX:AX=AX×src MUL reg32/mem32 :EDX:EAX=EAX×src对标志位的影响:若8位×8位、16位×16位或32位×32位的结果分别能由8、16或32位容纳(即结果的高一半为0),则CF=OF=0,否则,CF=OF=1;其余标志无定义。说明:由于2个n位数的乘积可能需要2n位,因此,若操作数是8位,则结果为16位;同样,16位操作数相乘结果为32位,32位数相乘结果为64位。11/4/202280x86汇编语言程序设计3.3.2算术指令3.乘法11/2/202280x86673.3.2算术指令(2)IMUL(IntegerMultiplication):带符号乘法一般形式: IMUL src 语法格式: IMUL reg8/mem8 ;AX=AL×src。执行带符号乘法,下同。 IMUL reg16/mem16 ;DX:AX=AX×src IMUL reg32/mem32 :EDX:EAX=EAX×src对标志位的影响:若结果的高一半为低一半的符号扩展,则CF=OF=0,否则,CF=OF=1;其余标志无定义。说明:由于2个n位数的乘积可能需要2n位,因此,若操作数是8位,则结果为16位;同样,16位操作数相乘结果为32位,32位数相乘结果为64位。【例】对于同一个二进制数,采用MUL与IMUL执行的结果可能不同。设AL=0FFH,BL=1,分别执行下列指令,会得出不同结果。 mul bl ;ax=0ffh(255) imul bl ;ax=0ffffh(-1)11/4/202280x86汇编语言程序设计3.3.2算术指令(2)IMUL(IntegerMul683.3.2算术指令4.除法一般形式: DIV src ;无符号数除法 IDIV src ;带符号数除法语法格式: DIV reg/mem IDIV reg/mem 功能描述:src是8位:AX÷src,结果商在AL、余数在AH。src是16位:DX:AX÷src,结果商在AX、余数在DX。src是32位:EDX:EAX÷src,结果商在EAX、余数在EDX。对标志位的影响:无定义。11/4/202280x86汇编语言程序设计3.3.2算术指令4.除法11/2/202280x86693.3.2算术指令5.十进制调整指令

(1)压缩BCD码调整指令语法格式: DAA ;调整AL中的和为压缩BCD码 DAS ;调整AL中的差为压缩BCD码功能描述:DAA:通常先执行ADD/ADC指令,将2个压缩BCD码相加,结果存放在AL中。然后使用该指令将AL调整为压缩BCD码格式。DAS:通常先执行SUB/SBB指令,将2个压缩BCD码相减,结果存放在AL中。然后使用该指令将AL调整为压缩BCD码格式。对标志位的影响:OF不确定;CF反映压缩BCD码相加/相减的进位/借位状态;按一般规则影响SF和ZF。说明:若使用DAA/DAS指令,则参加加法/减法运算的操作数应该是压缩BCD码。如果将任意2个二进制数相加/减,然后调整,将得不到正确结果。11/4/202280x86汇编语言程序设计3.3.2算术指令5.十进制调整指令11/2/2022703.3.2算术指令DAA的调整算法如下:if(AL低4位>9或AF=1)then AL=AL+6; AF=1;endifif(AL高4位>9或CF=1)then AL=AL+60H; CF=1;endifDAS的调整算法如下:if(AL低4位>9或AF=1)then AL=AL–6; AF=1;endifif(AL高4位>9或CF=1)then AL=AL-60h; CF=1;endif11/4/202280x86汇编语言程序设计3.3.2算术指令DAA的调整算法如下:DAS的调整算法713.3.2算术指令(2)非压缩BCD码调整指令语法格式: AAA ;调整AL中的和为非压缩BCD码 ;调整后,AL高4位=0,AH=AH+产生的CF AAS ;调整AL中的差为非压缩BCD码 ;调整后,AL高4位=0,AH=AH-产生的CF AAM ;AH=AXdiv10,AL=AXmod10 AAD ;AL=AH×10+AL,AH=0功能描述:AAA:通常先执行ADD/ADC指令,以AL为目的操作数,将2个非压缩BCD码(高4位无关)相加。然后使用AAA将AL调整为非压缩BCD码格式,且高4位=0,同时将调整产生的进位加到AH中。AAS:通常先执行SUB/SBB指令,以AL为目的操作数,将2个非压缩BCD码(高4位无关)相减。然后使用AAS将AL调整为非压缩BCD码格式,且高4位=0,同时将调整产生的借位从AH中减去。AAM与AAD:略。对标志位的影响:AAA与AAS:CF反映非压缩BCD码加/减的进位/借位;OF、SF和ZF不确定。11/4/202280x86汇编语言程序设计3.3.2算术指令(2)非压缩BCD码调整指令11/2/723.3.2算术指令AAA的调整算法如下:if(AL低4位>9或AF=1)then AL=AL+6; AH=AH+1; AF=1; CF=1;else AF=0; CF=0;endifAL=ALAND0FH;AL高4位清0AAS的调整算法如下:if(AL低4位>9或AF=1)thenAL=AL–6;AH=AH–1;AF=1;CF=1;elseAF=0;CF=0;endifAL=ALAND0FH;AL高4位清011/4/202280x86汇编语言程序设计3.3.2算术指令AAA的调整算法如下:AAS的调整算法733.3.3位操作指令1.逻辑指令一般形式: AND dest,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论