460 likes | 630 Views
指令系统( 2 ). 算术运算、十进制调整指令. 算术运算指令. 加法指令 ADD ADC INC XADD. 减法指令 SUB SBB DEC NEG CMP CMPXCHG CMPXCHG8B. 乘法指令 MUL IMUL. 除法指令 DIV IDIV.
E N D
指令系统(2) 算术运算、十进制调整指令
算术运算指令 加法指令 ADD ADC INC XADD 减法指令 SUB SBB DEC NEG CMP CMPXCHG CMPXCHG8B 乘法指令 MUL IMUL 除法指令 DIV IDIV
算术运算指令可对4种类型操作数运算: 1、无符号二进数 字节可表示范围:0----255 字可表示范围:0----65535 2、有符号二进数 字节可表示范围:-128----+127 字可表示范围:-32768----+32767 3、非压缩十进数 一个字节存放一位十进数的BCD码, 高4位为0000。 例:十进数57表示为: 00000101 (5) 00000111 (7) 4、压缩十进数 一个字节存放两位十进数的 BCD码 例:十进数57表示为: 01010111
以8位数加法为例讨论溢出 1、无符号数,有符号数都不溢出 无符号数 有符号数 04H 4 4 +0BH + 11 + 11 0FH 15 15 CF=0 OF=0 2、无符号数溢出,有符号数不溢出 07H 7 7 +FBH +251 +(-5) 1 02H 258 +2 (>255) CF=1 OF=0
3、有符号数溢出,无符号数不溢出 无符号数 有符号数 09H 9 9 +7CH +124 +124 85H 133 133 (>127) CF=0 OF=1 4、无符号数,有符号数都溢出 87H 135 -121 +F5H +245 +( -11) 1 7CH 380 -132 (>255) (<-128) CF=1 OF=1 结论:OF——表示有符号数的溢出 CF——表示无符号数的溢出
ADD 常规加指令 格式:ADD DST, SRC 操作:DST<--(DST)+(SRC) 指令构成方式: ADD reg,imme ;寄存器与立即数相加 ADD reg,reg ;寄存器之间 ADD reg,mem ;寄存器加存储器操作数 ADD mem,imme ;存储器加立即数 ADD mem,reg ;存储器操作数加寄存器
[例3-3-1] ADD指令示例1 ADD DX, BX 设(DX)=4652H, (BX)=0F0F0H 0100 0110 0101 0010 + 1111 0000 1111 0000 1 0011 0111 0100 0010 4652H + F0F0H 1 3742H 进位 进位 执行后 (DX)=3742HZF=0 结果不为0 SF=0 结果为正 CF=1 有进位 OF=0 不溢出
[例3-3-2] ADD指令示例2 ADD WORD PTR[BX], 9F76H 设(DS)=2000H, (BX)=1000H 执行前: 21000 88H A988H A9H + 9F76H 1 48FEH 执行后: 进位 21000 FEH CF=1 有进位 48H OF=1 溢出 ZF=0 结果不为0 SF=0 结果为正
ADC 带进位加指令 格式:ADC DST, SRC 操作:DST<--(DST)+(SRC)+(CF) 说明:该指令除了多一个进位标志外,同ADD指令 常用于多字节运算 INC 增1指令 格式:INC DST 操作:DST<--(DST)+1 说明:DST可以是寄存器或存储器操作数 DST不允许是立即数
[例3-3-3] ADC指令示例——双字加法 设目的操作数存放在DX和AX中,DX存放高位字 源操作数存放在BX和CX中,BX存放高位字 CF ADC ADD DX AX + BX CX DX AX 指令序列为: ADD AX, CX ;低位加 ADC DX, BX ;高位加
执行前(DX)=0418H, (AX)=0F365H (BX)=1005H, (CX)=0E024H 0418H DX 0F365H AX 1005H BX + 0E024H CX + 1 CF 141EH DX 1D389H AX CF=1
[例3-3-4] INC指令示例 LEA BX, ARRAY MOV AL, [BX] …… INC BX ARRAY a1 +1 a2 +2 a3 +3 a4 MOV BX, 0 MOV AL, ARRAY[BX] …… INC BX
XADD 交换并相加指令 格式: XADD DST, SRC 操作:TEMP(SRC)+(DST) SRC(DST) DST(TEMP) 说明:仅用于486及其后继机型 源操作数只能是寄存器 [例3-3-5] XADD指令示例 XADD BL, DL 如执行前 (BL)=12H, (DL)=02H 则执行后 (BL)=14H, (DL)=12H
SUB 常规减指令 格式:SUB DST, SRC 操作:DST<--(DST)-(SRC) 指令构成如下: SUB reg, imme ;寄存器减立即数 SUB reg, reg ;寄存器之间相减 SUB reg, mem ;寄存器减存储器操作数 SUB mem, imme ;存储器操作数减立即数 SUB mem, reg ;存储器操作数减寄存器
[例3-3-5] SUB指令示例 SUB BX, CX 执行前: (BX)=9543H (CX)=28A7H 9543H - 28A7H 6C9CH 执行后: (BX)=6C9CH CF=0 OF=1 ZF=0 SF=0
SBB带进位减指令 格式:SBB DST, SRC 操作:DST<--(DST)-(SRC)-(CF) 说明:该指令除了多一个进位标志外,同ADD指令 常用于多字节运算 [例3-3-6] SBB指令示例——双字减法 SUB AX, CX ;低位减 SBB DX, BX ;高位减 7456H AX 0012H DX - 9428H CX 0010H BX 1 E11EH - 1H CF 0001H CF=1
DEC 减1指令 格式:DEC DST 操作:DST<--(DST)-1 说明:用法同INC指令 NEG 求补指令 格式:NEG DST 操作:DST <-- -(DST) 说明: -(DST)表示操作数按位求反后末位加1 执行时,用零减去操作数
[例3-3-7] NEG指令示例1 NEG DX 执行前: (DX)=6780H 0000 - 6780 1 9880 执行后: (DX)=9880H CF=1借位 [例3-3-8] NEG指令示例2 NEG AL;AL求补 ADD AL, 100 ;(AL)+100-->AL 实现的功能为: 100-(AL)
CMP 比较指令 格式 :CMP DST, SRC 操作:(DST)-(SRC) 说明: 1、两个操作数相减,但结果不回送 2、影响标志位的值,下一指令常是条件转移指令 3、必须区分无符号数比较与有符号数比较 如 比较 11111111B 与 00000000B 无符号数比较: 255 > 0 有符号数比较: -1 < 0 4、比较两数是否相等,根据标志位ZF判断 若相等,则ZF=1;否则ZF=0
比较两数的大小 CMP DST, SRC 1、无符号数比较 DST>SRC DST<SRC DST=80H SRC=58H DST=58H SRC=80H 80H 58H -58H -80H 28H D8H CF=0 够减 CF=1 不够减 结论:用标志位CF判断无符号数的大小 CF=0,则 DST>SRC CF=1,则 DST<SRC
2、有符号数比较 (1)DST>0, SRC>0 (必不溢出) DST=5AH, SRC=46H DST=46H, SRC=5AH 5AH 46H - 46H - 5AH 14H ECH SF=0, DST>SRC SF=1, DST<SRC (2)DST>0, SRC<0 (必有DST>SRC) DST=10H SRC=95H DST=62H SRC=95H 10H 62H - 95H - 95H 7BH CDH SF=0, OF=0 SF=1, OF=1
(3)DST<0, SRC>0 (必有DST<SRC) DST=D3H SRC=38H DST=BFH SRC=55H D3H BFH - 38H - 55H 9BH 6AH SF=1, OF=0 SF=0, OF=1 (4)DST<0, SRC<0 (必不溢出) DST=B5H SRC=9CH DST=9CH SRC=B5H B5H 9CH - 9CH - B5H 19H E7H SF=0, DST>SRC SF=1, DST<SRC 结论:用标志位SF和OF判断有符号数的大小 SF、OF符号相同,则DST>SRC SF、OF符号不同,则DST<SRC
[例3-3-9] CMP指令示例1 CMP AL, BL 令 (AL)= -64 (BL)=10 - 64 - 10 - 74 OF=0 SF=1结论: (DST)<(SRC) [例3-3-10] CMP指令示例2 CMP CL, [100H] 令 (CL)= -100 (DS:100)= -110 -100 - (-110) 10 OF=0 SF=0结论: (DST)>(SRC)
CMPXCHG 比较并交换指令 格式:CMPXCHG DST, SRC 操作:累加器AC与DST比较 如 (AC)=(DST) 则 ZF1,DST(SRC) 否则 ZF0,AC(DST) 说明:只用于486及其后继机型 累加器可为AL、AX或EAX寄存器 SRC只能用寄存器,DST可用寄存器或存储器寻址方式
[例3-3-11] CMPXCHG指令示例 CMPXCHG CX, DX (1)若 执行前(AX)=2300H,(CX)=2300H, (DX)=2400H 则 执行后 将 DX 复制到 CX: (CX)=2400H, ZF=1 (2)若执行前(AX)=2500H, (CX)=2300H, (DX)=2400H 则执行后将 CX 复制到AX: (AX)=2300H, ZF=0
CMPXCHG8B 比较并交换8字节指令 格式:CMPXCHG8B DST 操作:EDX, EAX与DST比较 如 (EDX, EAX)=(DST) 则 ZF1,DST(ECX, EBX) 否则 ZF0,EDX, EAX(DST) 说明:只用于Pentium及其后继机型 DST是64位存储器操作数
MUL 无符号数乘指令 格式: MUL SRC IMUL 符号数乘指令 格式: IMUL SRC 操作: 字节数乘, AX<--(AL)*(SRC)byte 字数据乘, DX:AX<--(AX)*(SRC)word 双字数乘,EDX:EAX(EAX)*(SRC)DW 说明: 无符号数乘与有符号数乘不同 如 (11111111B)*(11111111B) 无符号数乘: 255*255 有符号数乘: (-1)*(-1)
[例3-3-12] MUL, IMUL指令示例 MUL BL (AL)=0B4H=180 (BL)=11H=17 IMUL BL (AL)=0B4H=-76, (BL)=11H=17 76=4CH 1011 0100 * 0001 0001 1011 0100 1011 0100 101111110100 0100 1100 * 00010001 0100 1100 0111 1100 0101 00001100 (AX)=0BF4H=3060 (AX)=(050C)补 =FAF4H=-1292
格式:IMUL REG, SRC 操作:REG16(REG16)*(SRC) REG32(REG32)*(SRC) 格式:IMUL REG, SRC, IMM 操作:REG16(SRC)*IMM REG32(SRC)*IMM 说明:乘积的字长和源、目的操作数的字长一致 可能溢出
DIV 无符号数除指令 格式:DIV SRC IDIV 符号数除指令 格式:IDIV SRC 操作:AL(商), AH(余数)<--(AX)/(SRC)byte AX(商), DX(余数)<--(DX:AX)/(SRC)word EAX(商), EDX(余数)<--(EDX:EAX)/(SRC)DW 说明: 被除数的长度是指令中操作数的两倍 乘、除法中,源操作数可用除立即数以外的寻址方式
[例3-3-12] DIV指令示例 MOV AX, 0000H ;装入被除数 10000H MOV DX, 0001H MOV BX, 100H ;装入除数 DIV BX ;10000H/100H MOV N1, AX ;存商 MOV N2, DX ;存余数
[例3-3-13] IDIV指令示例 计算-127/15,商存入RESULT单元 MOV AL, -127 ;装入被除数 CBW ;字节扩充到字 MOV BL, 15 ;装入除数 IDIV BL ;-127/15 MOV RESULT, AL ;存商
[例3-3-14]算术运算指令综合例 计算(V-(X*Y+Z))/X,其中X,Y,Z,V均为16位 有符号数,要求商存入AX,余数存入DX MOV AX, X IMUL Y ; X*Y MOV CX, AX MOV BX, DX ;积存 BX, CX MOV AX, Z CWD;Z扩展 ADD CX, AX ;X*Y+Z ADC BX, DX MOV AX, V CWD;V扩展 SUB AX, CX ;相减 SBB DX, BX IDIV X ;除以X
十进制运算调整指令 为什么需要调整? 例:非压缩十进数6和7相加 0000 0110 + 0000 0111 0000 1101 + 110 ;调整 0001 0011 调整指令有两类: 1、非压缩BCD码调整指令 AAA AAS AAM AAD 2、压缩BCD码调整指令 DAA DAS
AAA 非压缩BCD码加调整 格式:AAA 操作:将AL中的两个非压缩BCD码的和 进行调整, 正确和在AX中 调整过程: 如果 (AL&0FH)>9 或 (AF)=1 则 (AL)+6-->AL (AH)+1-->AH 1-->AF, AF-->CF (AL)&0FH-->AL 否则 (AL)&0FH-->AL 0-->AF, (AF)-->CF 说明: 该指令放在二进制加法指令ADD之后
[例3-3-15] AAA指令示例 计算十进制数9+4 MOV AL, 9H 09 MOV BL, 4H + 04 ADD AL, BL 0D ;>9 AAA + 06 ;调整 13H 结果: (AH)=01H (AL)=03H CF=AF=1
AAS 非压缩BCD码减调整指令 格式:AAS 操作:将AL中的两个非压缩BCD码的差 进行调整,正确结果送AX中 调整过程: 如果 (AL&0FH)>9 或 (AF)=1 则 (AL)-6-->AL (AH)-1-->AH (AL)&0FH-->AL 1-->AF, AF-->CF 否则 (AL)&0FH-->AL 0-->AF, (AF)-->CF
[例3-3-16] AAS指令示例 计算十进制数6-7 MOV AL, 6H 06 MOV BL, 7H - 07 SUB AL, BL FF ; (AL)&0FH>9 AAS - 6 ;调整 F9 结果: (AL)=09H CF=AF=1
AAM 非压缩BCD码乘调整指令 格式:AAM 操作:将AX中的两个非压缩BCD码之积进行调整 调整过程: 将AL除以10, 商送AH, 余数送AL [例3-3-17]AAM指令示例 MOV AL, 07H ;取被乘数 MOV CL, 09H ;取乘数 0111 MUL CL * 1001 AAM ;调整 0111 0000 0000 0111 00111111 调整后,(AH)=6 (AL)=3
AAD 非压缩BCD码除调整指令 格式:AAD 操作:在除法运算前,用该指令将AX中 的非压缩BCD码形式的被除数调整 为二进制数,然后做除法运算 调整过程: (AL)+(AH)*10-->AL 0-->AH (AX)/除数,商-->AL,余数-->AH
[例3-3-18] AAD指令示例 MOV AX, 0208H ;AX<--被除数 MOV CL, 4 ;除数 AAD;调整,(AX)=28 DIV CL 结果:(AL)=7 (AH)=0
DAA 压缩的BCD码加调整 格式:DAA 操作:对AL寄存器中的压缩BCD码之和 进行调整 调整过程: 如果 (AL & 0FH)>9 或 (AF)=1 则(AL)+6-->AL 1-->AF 如果(AL)>9FH 或 (CF)=1 则(AL)+60H-->AL 1-->CF
[例3-3-19] DAA指令示例1 计算十进制数29+18 MOV AL, 29H 29 MOV BL, 18H + 18 ADD AL, BL 41 ;AF=1 DAA + 6 ; 调整 47H [例3-3-20] DAA指令示例2 计算十进制数54+63 MOV AL, 54H 54 MOV BL, 63H + 63 ADD AL, BL B7 ;>9F DAA + 60 ; 调整 1 17H
DAS 压缩的BCD码减调整 格式:DAS 操作:对AL中的压缩BCD码差进行调整 调整过程: 如果 (AL&0FH)>9 或 (AF)=1 则 (AL)-6-->AL 1-->AF 如果(AL)>9FH 或 (CF)=1 则 (AL)-60H-->AL 1-->CF
[例3-3-21] DAS指令示例 计算十进数A-B A=4612 B=3576 MOV AL, A 12 SUB AL, B - 76 DAS 1 9C MOV D, AL - 66 ;调整 MOV AL, A+1 36 D SBB AL, B+1 CF=1 DAS MOV D+1, AL 46 35 - 1 10 D+1
作业: 3.15 (3) (4) 3.16 (1) (2) 3.17 (2) (3)