除法指令功能是用显式操作数去除隐含操作数,可得到商和余数。当除数为0 ,或商超 出数据类型所能表示的范围时,系统会自动产生0 号中断。 、无符号数除法指令DIV(Unsigned Divide Instruction) 指令的格式:DIV Reg/Mem
指令的功能是用显式操作数去除隐含操作数(都作为无符号数),所得商和余数按表 5.3的对应关系存放。指令对标志位的影响无定义。
、有符号数除法指令IDIV(Signed Integer Di vide Instruction) 指令的格式:IDIV Reg/Mem
受影响的标志位:AF、CF、OF、PF、SF和ZF
指令的功能是用显式操作数去除隐含操作数(都作为有符号数),所得商和余数的对应关 系见表5.3。
表5.3 除法指令除数、被除数、商和余数的对应关系 除数位数隐含的被除数商余数举例 8 位 AX AL AH DIV BH 16位 DX-AX AX DX DIV BX
32位 EDX-EAX EAX EDX DIV ECX
5 、类型转换指令
在作有符号除法时,有时需要把短位数的被除数转换成位数更长的数据类型。比如,要 用BL中的数据去除 AL,但根据除法指令的规定:除数是8 位,则被除数必须是 AX,于是 就涉及到AH的取值问题。
为了方便说明,假设:(AH)=1H ,(AL)=90H=-112D ,(BL)=10H。 1) 、在作除法运算前,必须处理AH的原有内容
假设在作除法时,不管AH 中的值,这时,(AH 、AL)/BL的商是19H ,但我们知道:
AL/BL 的商应是-7 ,这就导致:计算结果不是所预期的结果,所以,在作除法运算前,程序
员必须要处理AH中的值。 2) 、作无符号数除法时
可强置AH的值为0 ,于是,可得到正确的结果。 3) 、作有符号数除法时
如果强置AH为0 ,则AX=0090H ,这时,AX/BL的商为9 ,显然结果也不正确。 如果把AL的符号位1 ,扩展到 AH中,得:AX=0FF90H=-112D,这时,AX/BL的商就 是我们所要的正确结果。
综上所述,因为在进行有符号数除法时存在隐含操作数数据类型转换的问题,所以,系 统提供了四条数据类型转换指令:CBW、CWD、CWDE 和CDQ。 、字节转换为字指令CBW(Convent Byte to Word) 指令的格式:CBW
该指令的隐含操作数为AH 和AL。其功能是用AL的符号位去填充AH,即:当 AL为正数,则AH=0,否则,AH=0FFH。 指令的执行不影响任何标志位。
、字转换为双字指令CWD(Convent Word to Doubleword) 指令的格式:CWD
该指令的隐含操作数为DX 和AX,其功能是用AX 的符号位去填充DX。指令的
执行不影响任何标志位。
、字转换为扩展的双字指令CWDE(Convent Word to Extended Doubleword) 指令的格式:CWDE ;80386+
该指令的隐含操作数为DX和AX,其功能是用AX的符号位填充EAX的高字位。 指令的执行不影响任何标志位。
、双字转换为四字指令CDQ(Convent Doubleword to Quadword) 指令的格式:CDQ ;80386+
该指令的隐含操作数为EDX和EAX,指令的功能是用EAX的符号位填充EDX。 指令的执行不影响任何标志位。
下面是学习和掌握除法类指令的控件,可模拟执行 DIV 、IDIV、CBW、CWD、CWDE 和CDQ等指令。
例5.5 编写程序段,完成下面计算公式,并把所得的商和余数分别存入 X 和Y 中(其中:A ,
B ,C ,X 和Y 都是有符号的字变量)。 (C - 120 + A*B) / C 解: ?
A DW ? B DW ? C DW ? X DW ? Y DW ? ? MO V AX, C
SUB AX, 120D ;书写指令“ADD AX, -120D”也可以 CWD MO V
CX, DX MO V
BX, AX ;(CX, BX)←(DX, AX) ,调度寄存器,为作乘法准备必要的寄存器 MO V AX, A IMU L
B ;(DX, AX) ←A*B AD D
AX, BX ;计算32位二进制之和,为作除法作准备
AD C
DX, CX IDI V
C ;AX是商,DX是余数
MO X, AX ;分别保存商和余数到指定的字变量单元里 V MO V Y, DX
?
汇编入门(8 讲)
时间:2009-5-16 8:19:24
核心提示:5.2.4 逻辑运算指令逻辑运算指令是另一组重要的指令,它包括:逻辑与 (AND) 、逻辑或(OR)、逻辑非(NOT) 和异或指令(XOR) ,逻辑运算指令也是经常使用的指令。 1 、逻辑与操作指令AND(Logical AND Instruction) 指令的格式:AND Reg/Mem, Reg/Mem/Im... 5.2.4 逻辑运算指令
逻辑运算指令是另一组重要的指令,它包括:逻辑与(AND)、逻辑或(OR)、逻辑非(NOT) 和异或指令(XOR),逻辑运算指令也是经常使用的指令。 1 、逻辑与操作指令AND(Logical AND Instruction) 指令的格式:AND Reg/Mem, Reg/Mem/Imm
受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF 无定义)
指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑 “与操作”,操作结果存入目标操作数中。
例5.6 已知(BH)=67H ,要求把其的第0、1 和5 位置为0 。
解:可以构造一个立即数,其第0 、1和5 位的值为0 ,其它位的值 为1 ,该立即数即为:0DCH 或11011100B ,然后用指令\ BH, 0DCH \来实现此功能。 其计算过程如右图所示。
2 、逻辑或操作指令OR(Logical OR Instruction) 指令的格式:OR Reg/Mem, Reg/Mem/Imm
受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF 无定义)
指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑\或操作\,操作结果存入目标操作数中。
例5.7 已知(BL)=46H,要求把其的第1、3 、4 和6 位置为1 。
解:构造一个立即数,使其第1 、3 、4 和6 位的值为1 ,其它位的 值为0 ,该立即数即为:5AH 或01011010B ,然后用指令\
BL, 5AH\来实现此功能。 其计算过程如右图所示。
3 、逻辑非操作指令NOT(Logical NOT Instruction) 指令的格式:NOT Reg/Mem
其功能是把操作数中的每位变反,即:1 ←0 ,0←1 。指令的执行不影响任何标志位。 例5.8 已知(AL)=46H,执行指令“NOT AL”后,AL的值是什么? 解:执行该指令后,(AL)=0B9H 。其计算过程如下所示。 4 、逻辑异或操作指令XOR(Exclusive OR Instruction) 指令的格式:XOR Reg/Mem, Reg/Mem/Imm
受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF 无定义)
指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑\异或操作\,操作结果存入目标操作数中。
例5.9 已知(AH)=46H ,要求把其的第0、2 、5 和7 位的二进制值变反。 解:构造一个立即数,使其第0 、2 、5 和7 位的值为1 ,其它位的 值为0 ,该立即数即为:0A5H 或10100101B ,然后再用指令 \ AH, 0A5H\来实现此功能。 其计算过程如右图所示。
5 、逻辑操作指令的小结
下面是学习和掌握逻辑类指令的控件,可模拟执行AND、OR、NOT和XOR等指令。
5.2.5 移位操作指令
移位操作指令是一组经常使用的指令,它包括算术移位、逻辑移位、双精度移位、循环 移位和带进位的循环移位等五大类。
移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或 CL的值。在8086 中,该立即数只能为1 ,但在其后的 CPU 中,该立即数可以是1··31之内的数。 1、算术移位指令
算术移位指令有:算术左移SAL(Shift Algebraic Left)和算术右移SAR (Shift Algebraic Right)。它们的指令格式如下: SAL/SAR Reg/Mem, CL/Imm
受影响的标志位:CF、OF、PF、SF和ZF(AF 无定义)。
算术移位指令的功能描述如下,具体功能下图(a)、(b)所示。
算术左移SAL 把目的操作数的低位向高位移,空出的低位补0 ;
算术右移 SAR 把目的操作数的高位向低位移,空出的高位用最高位(符号位)填补。
例5.10 已知(AH)=12H ,(BL)=0A9H ,试给出分别用算术左移和右移指令移动1 位后,寄存 器AH和BL的内容。
解:用算术左移和右移指令移动1 位后,寄存器 AH和BL的结果如下表所示。 操作数的初值执行的指令执行后操作数的内容 (AH)=12H SAL AH, 1 (AH)=24H (BL)=0A9H SAL BL, 1 (BL)=52H (AH)=12H SAR AH, 1 (AH)=09H
(BL)=0A9H SAR BL, 1 (BL)=0D4H
下面是学习和理解算术移位指令的控件。它简单、直观地表达了该移位指令的功能,通 过它,学习者可准确地掌握计算机系统中该移位指令的含义。
在该控件中,操作者可随机生成第一操作数,也可自行输入之。为了便于比较,在执行
指令前,把原操作数的内容存入“操作前的数据”中。
思考题:下面有两组指令序列,问每组指令执行后,寄存器AX的不会变化吗? SAL AX, 1 SAR AX, 1 或
SAR AX, 1 SAL AX, 1
2、逻辑移位指令
此组指令有:逻辑左移 SHL(Shift Logical Left) 和逻辑右移 SHR (Shift Logical Right) 。它 们的指令格式如下:
SHL/SHR Reg/Mem, CL/Imm
受影响的标志位:CF、OF、PF、SF和ZF(AF 无定义)。
逻辑左移/ 右移指令只有它们的移位方向不同,移位后空出的位都补0 。它们的具体功能 下图(a)、(b)所示。
例5.11 已知(AH)=12H ,(BL)=0A9H ,试给出分别用逻辑左移和右移指令移动1 位后,寄存
器AH和BL的内容。
解:用算术左移和右移指令移动1 位后,寄存器 AH和BL的结果如下表所示。 操作数的初值执行的指令 执行后操作数的内 容
(AH)=12H SHL AH, 1 (AH)=24H (BL)=0A9H SHL BL, 1 (BL)=52H (AH)=12H SHR AH, 1 (AH)=09H (BL)=0A9H SHR BL, 1 (BL)=54H 学习和理解逻辑移位指令的控件。
3、双精度移位指令
此组指令有:双精度左移SHLD(Shift Left Double) 和双精度右移SHRD(Shift Right Double)。它们都是具有三个操作数的指令,其指令的格式如下: SHLD/SHRD Reg/Mem, Reg, CL/Imm ;80386+
其中:第一操作数是一个16位/32 位的寄存器或存储单元;第二操作数(与前者具有相同 位数)一定是寄存器;第三操作数是移动的位数,它可由CL或一个立即数来确定。
在执行SHLD 指令时,第一操作数向左移n 位,其“空出”的低位由第二操作数的高n 位来填补,但第二操作数自己不移动、不改变。
在执行SHRD 指令时,第一操作数向右移n 位,其“空出”的高位由第二操作数的低n 位来填补,但第二操作数自己也不移动、不改变。 SHLD 和SHRD 指令的移位功能示意图如图5.8所示。