1 / 17

3.3.2 算术指令

3.3.2 算术指令. 算术运算指令包括二进制运算和十进制运算指令, 指令有双操作数,有单操作数, 双操作数时,源操作数可以是立即数,如果源操作数不是立即数,两个操作数中必须有一个操作数是寄存器, 单操作数时,不允许使用立即数方式, 1. 加法指令 4 条 ( 1 ) ADD 加法指令 格式: ADD DST , SRC 操作 ( DST )  ( DST ) + ( SRC ) ( 2 ) ADC 带进位加法指令 格式: ADC DST , SRC 操作( DST )  ( DST ) + ( SRC ) +CF ; CF 是进位标志位的值.

minh
Download Presentation

3.3.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. 3.3.2 算术指令 • 算术运算指令包括二进制运算和十进制运算指令, • 指令有双操作数,有单操作数, • 双操作数时,源操作数可以是立即数,如果源操作数不是立即数,两个操作数中必须有一个操作数是寄存器, • 单操作数时,不允许使用立即数方式, • 1. 加法指令 • 4条 • (1)ADD加法指令 • 格式:ADD DST,SRC • 操作(DST)(DST)+(SRC) • (2)ADC带进位加法指令 • 格式:ADC DST,SRC • 操作(DST)  (DST)+(SRC)+CF;CF是进位标志位的值

  2. (3)INC 加一指令 • 格式:INC OPR • 操作(OPR) (OPR)+1 • (4)XADD 交换并相加指令 • 格式:XADD DST,SRC • 操作: TEMP (SRC)+(DST) • (SRC) (DST) • (DST) (TEMP) • 指令ADD、INC、XADD对所有的标志位(OF、ZF、SF、AF、PF、CF)都有影响, • INC对CF位没有影响,对其它5个标志位有影响。

  3. 加法指令举例 • 寄存器DX中原数是4652H,把立即数0F0FH加到DX中, • 使用指令 ADD DX,0F0F0H • 4 652 0100 0110 0101 0010 • F0F0 + 1111 0000 1111 0000 • ----------- ----------------------------------- • 1  0011 0111 0100 0010 • 进位到 CF位 3 7 4 2 H • 结果(DX)=3742H • 影响标志位:ZF=0,SF=0,CF=1,OF=0,PF=1, • AF=0

  4. 实现两个双精度数的加法 • 8086、80286上 将两个数先放到寄存器对中:DX,AX对和BX,CX对。(DX)=0002H,(AX)=0F365H • (BX)=0005H,(CX)=0E024H • 指令序列:ADD AX,CX • ADC DX,BX • 第一条指令执行后 (AX)=0D389,CF=1,SF=1,ZF=0,OF=0 • 第二条指令执行后 (DX)=0008H,(AX)=0D389H • SF=0,ZF=0,CF=0,OF=0 • 最后结果在DX,AX对中,结果没有溢出,正确的。

  5. 交换加法指令XADD的使用 • XADD BL,DL • 如执行前 (BL)=12H,(DL)=02H, • 则执行后 (BL)=14H,(DL)=12H。 • 关于有符号数加法的溢出问题: • 相加的两个数据是合法的,如果符号相反,则和不会溢出;如果两数的符号相同,要观察和的符号,和为同号,则不溢出;和为异号则溢出。 • 0000 0100 0000 1001 0000 0111 1000 0111 • 0000 1011 0111 1100 1111 1011 1111 0101 • -------------- --------------- --------------- ------------- • 0000 1111 1000 0101 0000 0010 0111 1100 • 不溢出 溢出 1 不溢出 1 溢出

  6. 2. 减法指令 • SUB(subtract) 减法 • SBB(subtract with borrow) 带进位减法 • DEC(decrement) 减一 • NEG(negate) 求补 • CMP(compare) 比较 • CMPXCHG(compare and exchange) 比较并交换 • CMPXCHG8B(compare and exchange 8 byte) 比较并交换8字节 • (1)SUB减法指令 • 格式:SUB DST,SRC • 操作(DST)(DST)–(SRC)且影响标志位

  7. (2)SBB带进位减法 • 格式:SBB DST,SRC • 操作:(DST)(DST)—(SRC)—CF • 影响标志位 • (3)DEC 减1指令 • 格式:DEC OPR • 操作(OPR)  (OPR)—1 ;OPR不能是立即数, • 不影响CF,影响其它标志位 • (4)NEG 求补指令 • 格式:NEG OPR • 操作:(OPR)  —(OPR) ;(OPR)的取反加1 • 也可以表示为(OPR)  0FFFFH—(OPR)+1 • NEG指令对标志位的影响特殊,一般按求补的结果设置条件码(标志位)。但是对0求补时,使CF=0;对其它数求补时使CF=1。当字节运算对-128求补,以及字运算对-32768求补和双字运算时对-231求补的情况下OF=1,其他OF均为0。

  8. (5)CMP 比较指令 • 格式:CMP OPR1,OPR2 • 操作:(OPR1)—(OPR2) • 做减法,不保存结果,只设置条件标志位,除不保存结果外,其他都与SUB相同。 • (6)CMPXCHG 比较并交换指令 • 格式:CMPXCHG DST,SRC • 该指令用与486及其后续机型,只能用8、16、32位寄存器,则可以寄存器或存储器的任何一种寻址方式。 • 操作:累加器AC与DST比较, • 如(AC)=(DST) • 则 ZF  1,(DST) (SRC) • 否则 ZF=0,(AC) (DST) • 累加器AC为AL、AX、EAX • 对其他标志位的影响与CMP指令一样。

  9. (7)CMPXCHG8B 并交换8字节指令 • 用于PENTIUM机型,(略) • 加减法指令举例 • 例3.50 设X、Y、Z均为双精度数,它们分别存放在X,X+2;Y,Y+2;Z,Z+2存储单元中。存放时高位字存放在高地址中,低位字在低地址中。W也是双精度数,编写程序段完成 • W X+Y+24Z • 分两类机型:16位机8086和80286一种,另外32位机80386以上的机型。

  10. 操作数:寄存器对(DX,AX) • 存储器:双精度数X,Y,Z,W • 立即数:24 • X • X+1 • X+2 • X+3 • Y • Y+1 • Y+2 • Y+3 • Z • Z+1 • Z+2 • Z+3 • W • W+1 • W+2 • W+3

  11. 16位 32位 • MOV AX,X MOV EAX, X • MOV DX, X+2 ADD EAX, Y • ADD AX, Y X+Y ADD EAX, 24 • ADC DX, Y+2 SUB EAX, Z • ADD AX, 24 +24 MOV W, EAX • ADC DX, 0 • SUB AX, Z +Z • SBB DX, Z+2 • MOV W, AX • MOV W+2,DX WX+Y+24-Z

  12. 乘法指令 • MUL (unsigned multiple)无符号数乘法 • IMUL (signed multiple) 带符号数乘法 • (1)MUL指令 • 格式:MUL SRC • 字节操作:(AX)  (AL)*(SRC) • 字操作: (DX,AX)  (AX)*(SRC) • 双字操作:(EDX,EAX)  (EAX)*(SRC) • 目的操作数隐含使用累加器AL、AX、EAX, • 乘积的寄存器长度是操作数的长度的两倍, • 指令对条件码的影响:如果乘积的高半部分为0,则CF=0,OF=0; 如果乘积的高半部分不为0,则CF=1,OF=1。 • 对其他条件码影响不确定。

  13. (2)IMUL指令 • 格式:IMUL SRC • 操作与MUL相同 • 对条件码的设置:如果乘积的高半部分是低半部分的符号位扩展,则CF位和OF位均为0,否则就均为1 • 对80286及后续机型增加了两操作数和三操作数指令 • IMUL REG,SRC • 字操作:(REG16 ) (REG16)*(SRC) • 双字操作: (REG32)  (REG32)*(SRC) • INUL REG,SRC,IMM • 字操作: (REG16) (SRC)*IMM • 双字操作: (REG32) (SRC)*IMM • 扩充的两条指令的源操作数和目的操作数长度相同,乘积结果如果超出指定位数机器数的范围,则溢出,OF、CF为1;不超出,则CF、OF为0。对其他标志位无定义。

  14. 4. 除法指令 • DIV 无符号除法 • IDIV 带符号除法 • (1) DIV • 格式: DIV SRC • 字节操作:16位被除数在AX中,源操作数SRC可以是8位寄存器数或存储器数,结果8位商在AL中,8位余数在AH中, • (AL)  (AX)/(SRC)的商 • (AH)  (AX)/(SRC)的余数 • 字操作: (AX)  (DX,AX)/(SRC)的商 • (DX)  (DX,AX)/(SRC)的余数 • 双字操作(EAX) (EDX,EAX)/(SRC)的商 • (EDX) (EDX,EAX)/(SRC)的余数 • 对条件码影响无定义

  15. (2)IDIV 带符号除法指令 • 格式:IDIV SRC • 操作与 DIV ,相同操作数和结果的存放也与 DIV 指令相同,不同的是,这些数据都是带符号数,且余数的符号一定和被除数相同。 • 对标志位的影响不确定。 • 例题3.56 计算 (V—(X*Y+Z—540))/ X • 已知X、Y、Z、V均为16位带符号数的单元名,要求结果商存入AX,余数存入DX。

  16. MOV AX,X ;被乘数X送AX • IMUL Y ;(AX)*Y ,结果在(DX,AX)中 • MOV CX,AX ;将X*Y的乘积转移到(BX,CX)中 • MOV BX,DX • MOV AX,Z ;Z送(AX) • CWD ;AX符号位扩展到DX • ADD CX,AX ; • ADC BX,DX ;做加Z的运算 • SUB CX,540 ; • SBB BX,0 ;做减540的运算,结果在(BX,CX)中 • MOV AX,V ;V送AX • CWD ;AX符号位扩展到DX,V 在(DX,AX)中 • SUB AX,CX ; • SBB DX,BX ;(DX,AX)—(BX,CX)结果(DX,AX) • IDIV X ;上指令的结果除以X (DX,AX)/X,商 • ;在AX中,余数在DX中。

  17. 5. 十进制调整指令 • 十进制调整指令使用的背景: • 1)使用算术指令ADD,SUB,MUL,DIV • 2)用到的操作数是二十进制BCD(binary code decimal)码,即用二进制编码的十进制数。 • 3)计算机CPU执行运算始终是二进制数的运算,其结果不确保是二十进制码。 • 针对以上情况就要适当采用十进制调整指令,辅助调整运算结果或操作数,以期达到运算结果仍是BCD码。 • 十进制调整指令分两组: • (1) 压缩的BCD码调整指令 • DAA(decimal adjust for addition); 加法的十进制调整指令 • DAS( decimal adjust for subtraction); 减法的十进制调整指令 • (2) 非压缩的BCD码调整指令 • AAA(ASCII adjust for addition); 加法的ASCII调指整令 • AAS(ASCII adjust for subtraction); 减法的ASCII调整指令 • AAM(ASCII adjust for multiplication); 乘法的ASCII调整指令 • AAD(ASCII adjust for division); 除法的ASCII调整指令

More Related