170 likes | 305 Views
3.3.2 算术指令. 算术运算指令包括二进制运算和十进制运算指令, 指令有双操作数,有单操作数, 双操作数时,源操作数可以是立即数,如果源操作数不是立即数,两个操作数中必须有一个操作数是寄存器, 单操作数时,不允许使用立即数方式, 1. 加法指令 4 条 ( 1 ) ADD 加法指令 格式: ADD DST , SRC 操作 ( DST ) ( DST ) + ( SRC ) ( 2 ) ADC 带进位加法指令 格式: ADC DST , SRC 操作( DST ) ( DST ) + ( SRC ) +CF ; CF 是进位标志位的值.
E N D
3.3.2 算术指令 • 算术运算指令包括二进制运算和十进制运算指令, • 指令有双操作数,有单操作数, • 双操作数时,源操作数可以是立即数,如果源操作数不是立即数,两个操作数中必须有一个操作数是寄存器, • 单操作数时,不允许使用立即数方式, • 1. 加法指令 • 4条 • (1)ADD加法指令 • 格式:ADD DST,SRC • 操作(DST)(DST)+(SRC) • (2)ADC带进位加法指令 • 格式:ADC DST,SRC • 操作(DST) (DST)+(SRC)+CF;CF是进位标志位的值
(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个标志位有影响。
加法指令举例 • 寄存器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
实现两个双精度数的加法 • 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对中,结果没有溢出,正确的。
交换加法指令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 溢出
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)且影响标志位
(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。
(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指令一样。
(7)CMPXCHG8B 并交换8字节指令 • 用于PENTIUM机型,(略) • 加减法指令举例 • 例3.50 设X、Y、Z均为双精度数,它们分别存放在X,X+2;Y,Y+2;Z,Z+2存储单元中。存放时高位字存放在高地址中,低位字在低地址中。W也是双精度数,编写程序段完成 • W X+Y+24Z • 分两类机型:16位机8086和80286一种,另外32位机80386以上的机型。
操作数:寄存器对(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
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 WX+Y+24-Z
乘法指令 • 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。 • 对其他条件码影响不确定。
(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。对其他标志位无定义。
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)的余数 • 对条件码影响无定义
(2)IDIV 带符号除法指令 • 格式:IDIV SRC • 操作与 DIV ,相同操作数和结果的存放也与 DIV 指令相同,不同的是,这些数据都是带符号数,且余数的符号一定和被除数相同。 • 对标志位的影响不确定。 • 例题3.56 计算 (V—(X*Y+Z—540))/ X • 已知X、Y、Z、V均为16位带符号数的单元名,要求结果商存入AX,余数存入DX。
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中。
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调整指令