📄 汇005.txt
字号:
、置中断允许位指令STI(Set Interrupt Flag):IF←1
其功能是恢复可屏蔽的外部中断的中断响应功能,通常是与CLI成对使用的。
4、取标志位操作指令
、LAHF(Load AH from Flags):AH←Flags的低8位
、SAHF(Store AH in Flags):Flags的低8位←AH
5、标志位堆栈操作指令
、PUSHF/PUSHFD(Push Flags onto Stack):把16位/32位标志寄存器进栈;
、POPF/POPFD(Pop Flags off Stack):把16位/32位标志寄存器出栈;
6、逻辑操作指令的小结
下面是学习标志位指令的控件,浏览者可以运用此类指令,观看标志寄存器的相应变化。
5.2.3 算术运算指令
算术运算指令是反映CPU计算能力的一组指令,也是编程时经常使用的一组指令。它包括:加、减、乘、除及其相关的辅助指令。
该组指令的操作数可以是8位、16位和32位(80386+)。当存储单元是该类指令的操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。
1、加法指令
、加法指令ADD(ADD Binary Numbers Instruction)
指令的格式:ADD Reg/Mem, Reg/Mem/Imm
受影响的标志位:AF、CF、OF、PF、SF和ZF
指令的功能是把源操作数的值加到目的操作数中。
、带进位加指令ADC(ADD With Carry Instruction)
指令的格式:ADC Reg/Mem, Reg/Mem/Imm
受影响的标志位:AF、CF、OF、PF、SF和ZF
指令的功能是把源操作数和进位标志位CF的值(0/1)一起加到目的操作数中。
、加1指令INC(Increment by 1 Instruction)
指令的格式:INC Reg/Mem
受影响的标志位:AF、OF、PF、SF和ZF,不影响CF
指令的功能是把操作数的值加1。
、交换加指令XADD(Exchange and Add)
指令的格式:XADD Reg/Mem, Reg ;80486+
受影响的标志位:AF、CF、OF、PF、SF和ZF
指令的功能是先交换两个操作数的值,再进行算术“加”法操作。
例5.3 已知有二个32位数d1和d2(用数据类型DD说明),编写程序片段把d2的值加到d1中。
解:32位数d1和d2在内存中如下所示。
…… …… ……
方法1:用16位寄存器编写程序
MOV AX, word ptr d1 ;由于d1是双字类型,必须使用强制类型说明符。以下同。
MOV DX, word ptr d1+2 ;(DX,AX)构成一个32位数据
ADD AX, word ptr d2 ;低字相加
ADC DX, word ptr d2+2 ;高字相加。在低字相加时,有可能会产生“进位”
MOV word ptr d1, AX ;低字送给d1的低字
MOV word ptr d1+2, DX ;高字送给d1的高字
方法2:用32位寄存器编写程序
MOV EAX, d1
ADD EAX, d2
MOV d1, EAX
从上面两段程序不难看出:用32位寄存器来处理32位数据显得简单、明了,而16位微机虽然也能处理32位数据,但做起来就要复杂一些。
下面是学习和掌握加法类指令的控件,可模拟执行ADD、ADC、INC、XADD、CLC、STC和CMC等指令。用鼠标左键单击寄存器列表框中指定的寄存器,则可修改其值。后面其它控件的有关操作与此相一致,不再说明。
2、减法指令
、减法指令SUB(Subtract Binary Values Instruction)
指令的格式:SUB Reg/Mem, Reg/Mem/Imm
受影响的标志位:AF、CF、OF、PF、SF和ZF
指令的功能是从目的操作数中减去源操作数。
、带借位减SBB(Subtract with Borrow Instruction)
指令的格式:SBB Reg/Mem, Reg/Mem/Imm
受影响的标志位:AF、CF、OF、PF、SF和ZF
指令的功能是把源操作数和标志位CF的值从目的操作数中一起减去。
、减1指令DEC(Decrement by 1 Instruction)
指令的格式:DEC Reg/Mem
受影响的标志位:AF、OF、PF、SF和ZF,不影响CF
指令的功能是把操作数的值减去1。
、求补指令NEG(Negate Instruction)
指令的格式:NEG Reg/Mem
受影响的标志位:AF、CF、OF、PF、SF和ZF
指令的功能:操作数=0-操作数,即改变操作数的正负号。
例5.4 已知有二个32位数d1和d2,编写程序片段从d1中减去d2的值。
解:
方法1:用16位寄存器编写程序
MOV AX, word ptr d1 ;取低字
MOV DX, word ptr d1+2 ;取高字,(DX,AX)构成一个32位数据
SUB AX, word ptr d2 ;低字相减
SBB DX, word ptr d2+2 ;高字相减。在低字相减时,有可能会产生“借位”
MOV word ptr d1, AX ;低字送给d1的低字
MOV word ptr d1+2, DX ;高字送给d1的高字
方法2:用32位寄存器编写程序
MOV EAX, d1
SUB EAX, d2
MOV d1, EAX
下面是学习和掌握减法类指令的控件,可模拟执行SUB、SBB、DEC、NEG、CLC、STC和CMC等指令。
3、乘法指令
计算机的乘法指令分为无符号乘法指令和有符号乘法指令,它们的唯一区别就在于:数据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。
乘法指令的被乘数都是隐含操作数,乘数在指令中显式地写出来。CPU会根据乘数是8位、16位,还是32位操作数,来自动选用被乘数:AL、AX或EAX。
指令的功能是把显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中。
、无符号数乘法指令MUL(Unsigned Multiply Instruction)
指令的格式:MUL Reg/Mem
受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)
指令的功能是把显式操作数和隐含操作数(都作为无符号数)相乘,所得的乘积按表5.2的对应关系存放。
表5.2 乘法指令中乘数、被乘数和乘积的对应关系
乘数位数 隐含的被乘数 乘积的存放位置 举例
8位 AL AX MUL BL
16位 AX DX-AX MUL BX
32位 EAX EDX-EAX MUL ECX
、有符号数乘法指令IMUL(Signed Integer Multiply Instruction)
指令的格式: IMUL Reg/Mem
IMUL Reg, Imm ;80286+
IMUL Reg, Reg, Imm ;80286+
IMUL Reg, Reg/Mem ;80386+
受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)
1)、指令格式1——该指令的功能是把显式操作数和隐含操作数相乘,所得的乘积按表5.2的对应关系存放。
2)、指令格式2——其寄存器必须是16位/32位通用寄存器,其计算方式为:
Reg ← Reg × Imm
3)、指令格式3——其寄存器只能是16位通用寄存器,其计算方式为:
Reg1 ← Reg2×Imm 或 Reg1 ← Mem×Imm
4)、指令格式4——其寄存器必须是16位/32位通用寄存器,其计算方式为:
Reg1 ← Reg1×Reg2 或 Reg1 ← Reg1×Mem
在指令格式2~4中,各操作数的位数要一致。如果乘积超过目标寄存器所能存储的范围,则系统将置溢出标志OF为1。
下面是学习和掌握乘法类指令的控件,可模拟执行MUL和IMUL等指令。
4、除法指令
除法指令的被除数是隐含操作数,除数在指令中显式地写出来。CPU会根据除数是8位、16位,还是32位,来自动选用被除数AX、DX-AX,还是EDX-EAX。
除法指令功能是用显式操作数去除隐含操作数,可得到商和余数。当除数为0,或商超出数据类型所能表示的范围时,系统会自动产生0号中断。
、无符号数除法指令DIV(Unsigned Divide Instruction)
指令的格式:DIV Reg/Mem
指令的功能是用显式操作数去除隐含操作数(都作为无符号数),所得商和余数按表5.3的对应关系存放。指令对标志位的影响无定义。
、有符号数除法指令IDIV(Signed Integer Divide 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 ?
…
MOV AX, C
SUB AX, 120D ;书写指令“ADD AX, -120D”也可以
CWD
MOV CX, DX
MOV BX, AX ;(CX, BX)←(DX, AX),调度寄存器,为作乘法准备必要的寄存器
MOV AX, A
IMUL B ;(DX, AX)←A*B
ADD AX, BX ;计算32位二进制之和,为作除法作准备
ADC DX, CX
IDIV C ;AX是商,DX是余数
MOV X, AX ;分别保存商和余数到指定的字变量单元里
MOV Y, DX
…
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,然后用指令"AND 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,然后用指令"OR 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,然后再用指令"XOR 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -