1 / 46

指令系统( 2 )

指令系统( 2 ). 算术运算、十进制调整指令. 算术运算指令. 加法指令 ADD ADC INC XADD. 减法指令 SUB SBB DEC NEG CMP CMPXCHG CMPXCHG8B. 乘法指令 MUL IMUL. 除法指令 DIV IDIV.

norman-kemp
Download Presentation

指令系统( 2 )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 指令系统(2) 算术运算、十进制调整指令

  2. 算术运算指令 加法指令 ADD ADC INC XADD 减法指令 SUB SBB DEC NEG CMP CMPXCHG CMPXCHG8B 乘法指令 MUL IMUL 除法指令 DIV IDIV

  3. 算术运算指令可对4种类型操作数运算: 1、无符号二进数 字节可表示范围:0----255 字可表示范围:0----65535 2、有符号二进数 字节可表示范围:-128----+127 字可表示范围:-32768----+32767 3、非压缩十进数 一个字节存放一位十进数的BCD码, 高4位为0000。 例:十进数57表示为: 00000101 (5) 00000111 (7) 4、压缩十进数 一个字节存放两位十进数的 BCD码 例:十进数57表示为: 01010111

  4. 以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

  5. 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——表示无符号数的溢出

  6. ADD 常规加指令 格式:ADD DST, SRC 操作:DST<--(DST)+(SRC) 指令构成方式: ADD reg,imme ;寄存器与立即数相加 ADD reg,reg ;寄存器之间 ADD reg,mem ;寄存器加存储器操作数 ADD mem,imme ;存储器加立即数 ADD mem,reg ;存储器操作数加寄存器

  7. [例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 不溢出

  8. [例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 结果为正

  9. ADC 带进位加指令 格式:ADC DST, SRC 操作:DST<--(DST)+(SRC)+(CF) 说明:该指令除了多一个进位标志外,同ADD指令 常用于多字节运算 INC 增1指令 格式:INC DST 操作:DST<--(DST)+1 说明:DST可以是寄存器或存储器操作数 DST不允许是立即数

  10. [例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 ;高位加

  11. 执行前(DX)=0418H, (AX)=0F365H (BX)=1005H, (CX)=0E024H 0418H DX 0F365H AX 1005H BX + 0E024H CX + 1 CF 141EH DX 1D389H AX CF=1

  12. [例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

  13. 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

  14. SUB 常规减指令 格式:SUB DST, SRC 操作:DST<--(DST)-(SRC) 指令构成如下: SUB reg, imme ;寄存器减立即数 SUB reg, reg ;寄存器之间相减 SUB reg, mem ;寄存器减存储器操作数 SUB mem, imme ;存储器操作数减立即数 SUB mem, reg ;存储器操作数减寄存器

  15. [例3-3-5] SUB指令示例 SUB BX, CX 执行前: (BX)=9543H (CX)=28A7H 9543H - 28A7H 6C9CH 执行后: (BX)=6C9CH CF=0 OF=1 ZF=0 SF=0

  16. 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

  17. DEC 减1指令 格式:DEC DST 操作:DST<--(DST)-1 说明:用法同INC指令 NEG 求补指令 格式:NEG DST 操作:DST <-- -(DST) 说明: -(DST)表示操作数按位求反后末位加1 执行时,用零减去操作数

  18. [例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)

  19. CMP 比较指令 格式 :CMP DST, SRC 操作:(DST)-(SRC) 说明: 1、两个操作数相减,但结果不回送 2、影响标志位的值,下一指令常是条件转移指令 3、必须区分无符号数比较与有符号数比较 如 比较 11111111B 与 00000000B 无符号数比较: 255 > 0 有符号数比较: -1 < 0 4、比较两数是否相等,根据标志位ZF判断 若相等,则ZF=1;否则ZF=0

  20. 比较两数的大小 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

  21. 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

  22. (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

  23. [例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)

  24. CMPXCHG 比较并交换指令 格式:CMPXCHG DST, SRC 操作:累加器AC与DST比较 如 (AC)=(DST) 则 ZF1,DST(SRC) 否则 ZF0,AC(DST) 说明:只用于486及其后继机型 累加器可为AL、AX或EAX寄存器 SRC只能用寄存器,DST可用寄存器或存储器寻址方式

  25. [例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

  26. CMPXCHG8B 比较并交换8字节指令 格式:CMPXCHG8B DST 操作:EDX, EAX与DST比较 如 (EDX, EAX)=(DST) 则 ZF1,DST(ECX, EBX) 否则 ZF0,EDX, EAX(DST) 说明:只用于Pentium及其后继机型 DST是64位存储器操作数

  27. 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)

  28. [例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

  29. 格式:IMUL REG, SRC 操作:REG16(REG16)*(SRC) REG32(REG32)*(SRC) 格式:IMUL REG, SRC, IMM 操作:REG16(SRC)*IMM REG32(SRC)*IMM 说明:乘积的字长和源、目的操作数的字长一致 可能溢出

  30. DIV 无符号数除指令 格式:DIV SRC IDIV 符号数除指令 格式:IDIV SRC 操作:AL(商), AH(余数)<--(AX)/(SRC)byte AX(商), DX(余数)<--(DX:AX)/(SRC)word EAX(商), EDX(余数)<--(EDX:EAX)/(SRC)DW 说明: 被除数的长度是指令中操作数的两倍 乘、除法中,源操作数可用除立即数以外的寻址方式

  31. [例3-3-12] DIV指令示例 MOV AX, 0000H ;装入被除数 10000H MOV DX, 0001H MOV BX, 100H ;装入除数 DIV BX ;10000H/100H MOV N1, AX ;存商 MOV N2, DX ;存余数

  32. [例3-3-13] IDIV指令示例 计算-127/15,商存入RESULT单元 MOV AL, -127 ;装入被除数 CBW ;字节扩充到字 MOV BL, 15 ;装入除数 IDIV BL ;-127/15 MOV RESULT, AL ;存商

  33. [例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

  34. 十进制运算调整指令 为什么需要调整? 例:非压缩十进数6和7相加 0000 0110 + 0000 0111 0000 1101 + 110 ;调整 0001 0011 调整指令有两类: 1、非压缩BCD码调整指令 AAA AAS AAM AAD 2、压缩BCD码调整指令 DAA DAS

  35. 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之后

  36. [例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

  37. 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

  38. [例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

  39. 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

  40. AAD 非压缩BCD码除调整指令 格式:AAD 操作:在除法运算前,用该指令将AX中 的非压缩BCD码形式的被除数调整 为二进制数,然后做除法运算 调整过程: (AL)+(AH)*10-->AL 0-->AH (AX)/除数,商-->AL,余数-->AH

  41. [例3-3-18] AAD指令示例 MOV AX, 0208H ;AX<--被除数 MOV CL, 4 ;除数 AAD;调整,(AX)=28 DIV CL 结果:(AL)=7 (AH)=0

  42. DAA 压缩的BCD码加调整 格式:DAA 操作:对AL寄存器中的压缩BCD码之和 进行调整 调整过程: 如果 (AL & 0FH)>9 或 (AF)=1 则(AL)+6-->AL 1-->AF 如果(AL)>9FH 或 (CF)=1 则(AL)+60H-->AL 1-->CF

  43. [例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

  44. DAS 压缩的BCD码减调整 格式:DAS 操作:对AL中的压缩BCD码差进行调整 调整过程: 如果 (AL&0FH)>9 或 (AF)=1 则 (AL)-6-->AL 1-->AF 如果(AL)>9FH 或 (CF)=1 则 (AL)-60H-->AL 1-->CF

  45. [例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

  46. 作业: 3.15 (3) (4) 3.16 (1) (2) 3.17 (2) (3)

More Related