收藏 分享(赏)

第2章 80X86汇编语言与汇编程序(3)—算术逻辑运算指令.ppt

上传人:dreamzhangning 文档编号:5753314 上传时间:2019-03-15 格式:PPT 页数:65 大小:415.50KB
下载 相关 举报
第2章 80X86汇编语言与汇编程序(3)—算术逻辑运算指令.ppt_第1页
第1页 / 共65页
第2章 80X86汇编语言与汇编程序(3)—算术逻辑运算指令.ppt_第2页
第2页 / 共65页
第2章 80X86汇编语言与汇编程序(3)—算术逻辑运算指令.ppt_第3页
第3页 / 共65页
第2章 80X86汇编语言与汇编程序(3)—算术逻辑运算指令.ppt_第4页
第4页 / 共65页
第2章 80X86汇编语言与汇编程序(3)—算术逻辑运算指令.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

1、Glut _C 2013-08,1,80X86指令系统(续),Glut _C 2013-08,2,算术运算指令包括加、减、乘、除基本运算指令,十进制运算的调整指令。 可以进行带符号数的运算,也可以进行无符号数的运算。,Glut _C 2013-08,3,2.3.2 加减法运算,加减法运算结果可以存放在通用寄存器中,也可以存放在存储器中。,结果保存在通用寄存器中,结果保存在存储器中,Glut _C 2013-08,4,加法运算指令有,非压缩BCD码调整,按结果设置标志,不影响该标志位,Glut _C 2013-08,5,减法运算指令有,Glut _C 2013-08,6,乘法运算指令有,Glut

2、 _C 2013-08,7,除法运算指令有,Glut _C 2013-08,8,2.3.2.1 加法运算指令,1. 不带进位加法指令 (1) 格式: ADD dst, src (2) 功能: 两个数相加,结果送 dst(dst) = (dst) + (scr) (3) 说明: 操作数可以是字节型,也可以是16位、32位。 源操作数可以使用立即数、寄存器操作数,或存储器操作数 目的操作数可以使用寄存器操作数或存储器操作数,不能是立即数。 例如: ADD AX, 3A5FH ; ADD AX, BX+1000H;ADD BX+DI, AX;,Glut _C 2013-08,9,2. 带进位加法指令

3、,(1)格式: ADDC dst, src (2)功能:除了两个操作数相加外,再加上进位信号(将进位位加到最低位)。(dst) = (dst)+(src)+CF ;CF是进位标志。例如: ADDC AX,BX ; (AX)(AX)+(BX)+CF ADC AL, BL ;(AL)(AL)+(BL)+CF ADC AX, 0100HBX ; (AX)(AX)+(0100H+BX)+CF,Glut _C 2013-08,10,ADC指令的用途是可以进行多字长的加法运算。例如对于8086,两个32位的数进行相加,第一个数存放在存储器中以符号地址DAT1开始的存储空间,第二个数存放在DAT2开始的存储

4、空间。计算它们的和,并存放在DAT1。,Glut _C 2013-08,11,Glut _C 2013-08,12,程序代码LEA SI, DAT1 ; 地址 SILEA DI, DAT2 ;地址 DIMOV AX, SI ;取低16位数据ADD AX, DI ;不带进位位的加法MOV SI, AX ;保存低16位结果MOV AX, SI+2 ;取高16位ADC AX, DI+2 ;(AX)=(SI+2)+(DI+2)+CFMOV SI+2, AX ;保存高16位结果,对于任意字长的数的加法,都可以这样进行。,Glut _C 2013-08,13,这里我们没有判断溢出标志位OF,第一字节有进位

5、或溢出,表明超过16位的表示范围,将进位信号加到高16位上,如果高16位出现溢出,需要看我们结果字长了:如果保留3个字长,则将进位再加到更高位上否则判断产生溢出错误。,ADD ,ADC指令影响标志位:CF, OF, ZF, SF, AF, PF,Glut _C 2013-08,14,当然,对于80386Pentium,可以直接使用32位运算ADD EAX,EBX64位运算等,还是这样先做低32位加法,然后再用带进位加法指令做高32位运算。,Glut _C 2013-08,15,加一指令 (1)格式 INC dst (2)功能将目标操作数的内容+1,再送回目标操作数。(dst) (dst)+1

6、例如: INC CX ; (CX) (CX)+1 说明:INC指令影响标志位,但不影响标志CF。,Glut _C 2013-08,16,4. 压缩BCD码加法调整指令,(1)格式: DAA (2)功能:对压缩的两位十进制加法结果进行调整。计算机内部的所有运算,都是按照二进制运算规则进行的。对于两位BCD数据相加,例如,显然,结果不是正确的BCD码,BCD码,Glut _C 2013-08,17,DAA指令就是对这样的加法运算进行调整,使得它变为正确的BCD运算结果。,调整方法:如果表示BCD的四位二进制位 9,或产生向高位的进位,则在相应的BCD位+6。 例如上面的结果, 低4位=1101,大

7、于9,Glut _C 2013-08,18,进位=1,进位=1,Glut _C 2013-08,19,我们设计程序时,如果参与运算的数据是压缩的BCD码数据,则在做完加法运算后,需要使用一条DAA指令进行调整。注意这时的加法运算,应该使用8位的加法运算ADD AL, src 目的操作数是AL。ADD AX, src 对高8位无法进行调整。 DAA 指令影响标志位,但对OF没有定义。对CF的影响高4位大于9,或原来加法运算CF=1,则CF=1,作为向高位的进位信号。,Glut _C 2013-08,20,5. 非压缩BCD码加法运算调整指令,(1)格式: AAA (2)功能: 对非压缩的BCD码

8、加法运算进行调整。 (3)对标志位的影响:只影响AF,CF 。与DAA类似,它也是跟在以AL为目的操作数的字节性加法指令后面使用。,Glut _C 2013-08,21,计算机中的数据格式,是我们在编写程序时确定的,因此,是否在加法指令后使用DAA或AAA指令,是由我们设计程序时确定的数据是BCD格式,一定需要调整,是压缩的BCD码,则用DAA调整,是非压缩的BCD码,则使用AAA调整。加法指令,使用8位的加法运算,以AL作为目的操作数。,Glut _C 2013-08,22,6. 交换及相加指令,(1) 格式XADD dest, reg (2)功能:将目的操作数和源操作数的数据进行交换,然后

9、把源操作数中的数据和目的操作数中的数据相加后送入目的操作数。destregdest+regdest 相当于两条指令XCHG dest, regADD dest, reg,Glut _C 2013-08,23,2.3.2.2 减法指令,无借位的减法指令 (1)格式: SUB dst , src (2)功能: (dst) (dst) (src) 对操作数的限制同加法指令ADD, ADC。 例如:SUB AX , 0200H ; 目的操作数寄存器,原操;作数为立即数SUB AX, BX ;都是寄存器操作数SUB AL, BHSUB DI+100H, BX ;相对寻址 该指令影响标志位。此时的CF是借

10、位标志位。,Glut _C 2013-08,24,2. 带进位位的减法指令,(1)格式: SBB dst, src (2)功能:(dst)(dst)-(src)-CF它与减法指令SUB的区别在于还减去借位信号CF。它与带进位位的加法指令一样,用于做多字(字节)的减法。 例如 SBB AX, 2100HSUB AL, BL 等。对标志位的影响同SUB指令。,Glut _C 2013-08,25,3. 减一指令,(1)格式: DEC dst (2)功能: (dst) (dst)-1 例如: 如果(AX)=1234H,执行DEC AX 后,(AX)=1233HDEC WORD PTR BP对于堆栈区

11、间BP指向的一个字内容-1。WORD PTR 告诉编译程序,是字操作数。该指令影响标志位,但不影响CF。,Glut _C 2013-08,26,4. 求补码指令,(1) 格式: NEG dst (2)功能:执行 (dst) 0- (dst) 的操作,它实际上就是将(dst)的内容逐位取反+1。 (3)操作数可以8位,也可以是16位、32位。注意:补码的定义。在编写程序时,要判断待求补的数据(原码),如果是正数(或0),补码就等于原码,如果是负数,则除符号位外,逐位取反+1。 因此,将负数的符号位先取反(变为0),再使用NEG指令。,Glut _C 2013-08,27,如果一个正数调用NEG指

12、令,实际上求出的是它的机器负数。例如 (AL)=14H, 执行NEG AL 指令执行后 (AL) = 0 ECH -14H 如果一个负数,如果不先保存符号位,使用NEG指令后,实际上变成了他的绝对值。 例如: MOV AL, 0ECH ;(al)= -14hNEG AL ;(al)= 14h,Glut _C 2013-08,28,例:内存数据段存放了200个带符号数(字节),首地址为TAB1,要求将各数取绝对值后存入以TAB2为首址的内存区。由于200个带符号数中可能既有正数,又有负数,因此先要判断正负。如为正数,可以原封不动地传送到另一内存区;如为负数,则需先求补即可得到负数的绝对值,然后再

13、传送。程序流程框图如下:,Glut _C 2013-08,29,Glut _C 2013-08,30,LEA SI,TAB1 ;(SI)源地址指针LEA DI,TAB2 ;(DI)目标地址指针MOV CX,200 ;(CX)循环次数CHECK: MOV AL,SI ;取一个带符号数到ALOR AL,AL ;AL内容不变,但使之影响标志JNS NEXT ;若(SF)=0,则转NEXTNEG AL ;否则求补 NEXT:MOV DI,AL ;传送到目标地址INC SI ;源地址加1INC DI ;目标地址加1DEC CX ;循环次数减1JNZ CHECK ;如不等于零,则转CHECKHLT ;停止

14、,Glut _C 2013-08,31,5. 比较指令,(1)格式: CMP dst ,src (2)功能: 做 (dst)于 (src) 的比较,设置标志位。 (实际上是进行(dst) (src) 运算,但不保存结果,只是改变标志位)该指令一般用于比较两个数的大小,依据比较结果进行程序的转移控制,是程序转到不同的分支。,Glut _C 2013-08,32,6 . 压缩的BCD码减法调整指令,(1)格式: DAS (2)功能:对压缩的BCD减法运算结果进行调整。 (3)对标志位的影响:影响 CF,AF,PF,SF,ZF,但不影响CF。 它类似于DAA指令,用于8位的压缩BCD数据减法指令之后

15、。,Glut _C 2013-08,33,7 . 非压缩的BCD减法调整指令,(1)格式: AAS (2)功能:对非压缩的BCD减法运算结果进行调整。 (3)对标志位的影响: 只影响AF, CF 注意:调整指令都跟在8位的加法、减法运算指令后面。,Glut _C 2013-08,34,1. 无符号乘法指令 (1)格式: MUL src src 可以是字节数据,也可以是16位、32的字数据。 (2)功能: 将原操作数与默认的目的操作数(AX或AL)相乘,结果保存在AX或DX,AX中。如果src是字节操作数,则 (AX) (AL)(src) 例如: MUL BL ; (AX) (AL) (BL)M

16、UL BYTE PTR SI ;(AX) (AL) ( (SS)+(SI) ) SI所指存储单元内容,2.3.2.3 乘法指令,Glut _C 2013-08,35,如果src是字操作数, 对于8086:则 (DX,AX)(AX) (src) 其中,DX保存结果的高16位,AX保存结果的低16位。 例如:MUL BX ;(DX,AX) (AX) (BX)MUL WORD PTR DI+100H 对于80386: EAX(AX) (src),Glut _C 2013-08,36,对标志位的影响:影响CF,OF.如果乘积的高半部分不为0,则CF=1,OF=0,否则CF-0,OF=0.实际上始终 O

17、F=0。,Glut _C 2013-08,37,2. 带符号的乘法指令 (1)格式: IMUL src (2)功能:与MUL相同,仅两个数是带符号的数。 (3)对标志位的影响:同MUL,运算结果只影响状态标志CF、OF。,Glut _C 2013-08,38,3. 非压缩BCD乘法调整指令,(1)格式: AAM (2)功能:对AX中的两个非压缩BCD码乘法的结果进行调整。注意,两个非压缩的BCD码相乘,才能进行调整得到正确的结果8位乘法。 例如: MOV AL, 09HMOV CL, 04HMUL CLAAM ;(AX)=36H-AH=3H,AL=6H,Glut _C 2013-08,39,2

18、.3.2.4 除法指令,1. 无符号除法指令 (1)格式: DIV src src 可以是字节数据,也可以是16位/32位的字数据。 (2)功能: 将两个无符号数做除法运算,商和余数分别保存在指定位置。如果src是字节操作数,则 被除数在AX,(AL) (AX)/(src)(商)(AH) 余数 例如: DIV BL ; DIV BYTE PTR SI 对于Pentium,可以使用32位操作数。,Glut _C 2013-08,40,如果src是字操作数,则被除数在寄存器对DX,AX中,DX为高16位,AX为低16位,作 (DX,AX)/(src)运算, (AX)保存商 , (DX) 保存余数。

19、 例如:DIV BX ;DIV WORD PTR DI+100H (3) 对标志位的影响:不产生有效标志位,即CF,AF,OF,SF,ZF都是不确定的。,Glut _C 2013-08,41,2. 带符号除法指令,(1)格式: IDIV srcsrc 可以是字节数据,也可以是16位的字数据。 (2)功能: 将两个带符号数做除法运算,商和余数分别保存在指定位置。 其它与DIV指令相同。 (3)当被除数位数不够时,需要进行扩展。,Glut _C 2013-08,42,3. 字节扩展指令,(1)格式: CBW (2)功能:把AL中的带符号数扩展为16为字长(符号位扩展到AH中)。 例如 (AL)=

20、35H, (AH=0),执行CBW指令后,(AX)=0035H(AL)=84H(-60), 则执行CWB指令后(AX)=0FF84H(-60)。,Glut _C 2013-08,43,4. 字扩展指令,(1)格式: CWD (2)功能:将AX中的符号位扩展到DX中。 例如: (AX)=8FF3H, (DX)=0,执行CWD后(DX)=0FFFFH,(AX)=8FF3H,Glut _C 2013-08,44,8086/8088CPU执行除法时规定:除数只能是被除数的一半字长。当被除数为16位时,除数应为8为;当被除数为32位时,除数应为16为,Glut _C 2013-08,45,对于无符号的数

21、,只要将高位清0,对于带符号的数的除法,将补码扩展,必须考虑符号。用符号扩展指令可以方便的进行扩展。 扩展指令主要用于在除法指令前,将被除数扩展到所需要的字长。例如-47/5 -47=10101111B, 补码:11010001B(0D1H)MOV AL, 0D1HMOV BL,05HCWB ;带符号扩展为16位。IDIV BL,Glut _C 2013-08,46,当除数是字节数据时,被除数必须放在AX中;当除数是字数据时,被除数必须放在DX,AX中。 除法指令运算结果对状态标志无定义。 8086/8088规定IDIV指令运算结果余数的符号与被除数相同。 带符号数除法运算中,当被除数位数不够

22、时,需要进行带符号扩展。,Glut _C 2013-08,47,5. 非压缩BCD码除法调整指令,(1)格式: AAD (2)功能:将被除数AX的非压缩BCD码调整为二进制数,在相除。 该指令应该放在除法指令前面。 例如:103/6MOV AX,0103MOV BL,06AAD DIV BL,Glut _C 2013-08,48,几点注意: 一条指令中可以包含一个或多个操作数 涉及一个操作数的指令称为单操作数指令 如位移量或立即数为16位,那么低位在前,高位在后,Glut _C 2013-08,49,2.3.3 逻辑运算,逻辑运算指令 基本逻辑运算:求补与或非异或逻辑指令影响标志位。,Glut

23、 _C 2013-08,50,1. 求补指令 NEG,(1) 格式NEG DEST ; (2)功能将操作数DEST 连同符号位取反,在最低位+1. 注意: 该指令不是求补码指令。如果DEST是一个补码,则NEG DEST是求DEST的负数。DEST: 可以是通用寄存器(AX DX,AL,AHDL,DH)也可以是存储器操作数(可以使用各种寻址方式),Glut _C 2013-08,51,例如 3 它的原码 0000 0011 补码 0000 0011MOV AL, 00000011BNEG AL ; 1111 1100+00000001;=1111 1101B 它就是-3的补码NGE指令实际上是

24、求操作数的机器负数。 再例如: BL=1100 1110B (-50) NEG BL ;BL= 0011 0001+00000001=00110010B; = 50 得到的是 50的负数。,Glut _C 2013-08,52,NEG 与求补码的区别: 无论操作数是正还是负数,均是连同符号位一起,每一位都取反,最低位+1. 操作数寻址:通用寄存器,存储器(可以使用各种寻址方式)。 操作数位数:8086: 8位、16位80386等32位处理器:8、16、32位 教材上给出的例子:AX FFFBH (-5) 执行 NEG AX 后 AX 0005H (5),Glut _C 2013-08,53,2

25、. 逻辑非 NOT,(1) 书写格式NOT DEST (2)功能: 将DEST逐位取反。 例如:AX= 0005h (0000 0000 0000 0101B) 执行 NOT AX ; AX=1111 1111 1111 1010BBL=0F6H (1111 0110B) 执行 NOT BL 后, BL= 0000 1001B (09H),Glut _C 2013-08,54,3. 逻辑与(AND)、或(OR)、异或(XOR)运算指令,(1) 书写格式AND DEST, SOURCE ;DEST=DEST And SOURCEOR DEST, SOURCE ;DEST=DEST Or SOUR

26、CE XOR DEST, SOURCE ;DEST=DEST Xor SOURCE (2)逻辑运算:逐位进行。 (3)应用例 AND指令通常用于清除DEST的某些位。 比如:AL= 10010101BAND AL,0FH ;AL中内容和0FH相与,结果在AL;AL=0000 0101B 清除高4位;只要是SOURCE=0的位就被清为0,Glut _C 2013-08,55,逻辑或可用于将DEST的某些位设置为1 例如: BL=0001 1101B,现需要将高4位全设为1OR BL,0F0H ; BL= 1111 1101B 只要是SOURCE=1的位就被置为1异或指令可用于对某些位取反 例如:

27、 AX= 1101 0001 1011 1000BXOR AX, 1111 0000 0000 1111B ;将最高和最低4位取反;AX= 0010 0001 1011 0111B 只要是SOURCE=1的位就被取反。XOR AX,AX ;AX内容本身进行异或,结;果AX清零,Glut _C 2013-08,56,4. 测试指令 TEST,TEST和AND执行同样操作,但TEST指令不送回操作结果,而仅仅影响标志位。 如:TEST AX,8000H ;如AX的最高位为1,则ZF;0,否则ZF1,Glut _C 2013-08,57,2.3.4 移位指令,1. 非循环移位指令4条移位指令: 算术

28、左移指令SAL 逻辑左移指令SHL 算术右移指令SAR 逻辑右移指令SHR,Glut _C 2013-08,58,移位指令SAL算数左移SHL逻辑左移SAR算术右移SHR 逻辑右移,Glut _C 2013-08,59,2. 循环移位指令,4条循环移位指令 循环左移指令ROL 循环右移指令ROR 带进位位的循环左移指令RCL 带进位位的循环右移指令RCR,Glut _C 2013-08,60,循环移位指令 ROL 循环左移 (b)ROR 循环右移 (c) RCL 带进位位的循环左移 (d)RCR 带进位位的循环右移,Glut _C 2013-08,61,2.3.5 位搜索指令,(1) 格式BS

29、F REG , SOURCE ;由低向高搜索BSR REG , SOURCE ;由高向低搜索 (2)功能:将搜到的第一个为1的位的位置值送REG,并设置标志ZF=0。如果SOURCE=0(搜不到=1的位),则设置标志ZF=1.注: SOURCE可以是寄存器或存储器操作数目的操作数只能是16位或32位寄存器REG。该指令只有80386及以后的32位处理器才有。,Glut _C 2013-08,62,2.3.6 位测试指令 BT,(1)格式BT DEST, SOURCE ;测试指定位BTC DEST, SOURCE ;测试完取反指定位BTR DEST, SOURCE ;测试完清零指定位BTS DE

30、ST, SOURCE ;测试完置1指定位(2)功能:将DEST的指定位送CF(测试DEST的指定位,=1,CF置1,=0,CF=0,实际上就是将指定位送CF). 该指令通常放在条件转移指令JC(或JNC)前. DEST: 可以是REG、MEM操作数,16位或32位 SOURCE:立即数或REG, 取值范围与DEST匹配。,Glut _C 2013-08,63,2.3.7 输入输出指令,1. 直接寻址的I/O指令 直接的输入输出指令提供端口号。 如: IN AL,50H ;将50H端口的字节读入AL IN AX,70H ;分别将70H、71H;端口的内容读入AL、AH OUT 44H,AL ;将

31、AL中的内容输出到44H端口 OUT 80H,AX ;将AL、AH中的内容分别输出;到80H、81H两端口,Glut _C 2013-08,64,2. 间接的输入输出指令,如: IN AL,DX ;从DX所指的端口中读取 IN AX,DX ;从DX和DX+1所指出的两个端口;中读取 OUT DX,AL ;将AL中的字节输出到DX所指的;端口中 OUT DX,AX ;将AL中的字节输出到DX所指的;端口中,同时将AH中的字节输;出到DX+1所指的端口中,Glut _C 2013-08,65,输入输出指令注意点: 输入输出端口只能与累加器之间进行数据输入输出操作 寻址范围:直接输入输出指令为0255间接输入输出指令为065 535。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报