5.2指令系统2

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 ?

D 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。指令的执行不影响任何标志位。

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

受影响的标志位: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

下面是学习和理解算术移位指令的控件。它简单、直观地表达了该移位指令的功能,通过它,学习者可准确地掌握计算机系统中该移位指令的含义。

在该控件中,操作者可随机生成第一操作数,也可自行输入之。为了便于比较,在执行指令前,把原操作数的内容存入“操作前的数据”中。

2、逻辑移位指令

此组指令有:逻辑左移SHL(Shift Logical Left)和逻辑右移SHR(Shift Logical Right)。它们的指令格式如下:

SHL/SHR Reg/Mem, CL/Imm

受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。

逻辑左移/右移指令只有它们的移位方向不同,移位后空出的位都补0。

例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位来填补,但第二操作数自己也不移动、不改变。

受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)

下面是几个双精度移位的例子及其执行结果。

双精度移位指令 指令操作数的初值 指令执行后的结果

SHLD  AX, BX, 1 (AX)=1234H,(BX)=8765H (AX)=2469H

SHLD  AX, BX, 3 (AX)=1234H,(BX)=8765H (AX)=91A4H

SHRD  AX, BX, 2 (AX)=1234H,(BX)=8765H (AX)=448DH

SHRD  AX, BX, 4 (AX)=1234H,(BX)=8765H (AX)=5123H

学习和理解双精度移位指令的控件。

4、循环移位指令

循环移位指令有:循环左移ROL(Rotate Left)和循环右移ROR(Rotate Right)。

指令的格式:ROL/ROR Reg/Mem, CL/Imm

受影响的标志位:CF和OF

循环左移/右移指令只是移位方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。

下面是几个循环移位的例子及其执行结果。

循环移位指令 指令操作数的初值 指令执行后的结果

ROL  AX, 1 (AX)=6789H (AX)=0CF12H

ROL  AX, 3 (AX)=6789H (AX)=3C4BH

ROR  AX, 2 (AX)=6789H (AX)=59E2H

ROR  AX, 4 (AX)=6789H (AX)=9678H

学习和理解不带进位的循环移位指令的控件。

5、带进位的循环移位指令

带进位的循环移位指令有:带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。

指令的格式:RCL/RCR Reg/Mem, CL/Imm

受影响的标志位:CF和OF

带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。具体功能如下图(a)、(b)所示。

下面是几个带进位循环移位的例子及其执行结果。

双精度移动指令 指令操作数的初值 指令执行后的结果

RCL  AX, 1 CF=0,(AX)=0ABCDH (AX)=579AH

RCL  AX, 1 CF=1,(AX)=0ABCDH (AX)=579BH

RCR  AX, 2 CF=0,(AX)=0ABCDH (AX)=AAF3H

RCR  AX, 2 CF=1,(AX)=0ABCDH (AX)=EAF3H

例5.12 编写指令序列把由DX和AX组成的32位二进制算术左移、循环左移1位。

解:

(DX,AX)算术左移1位指令序列 (DX,AX)循环左移1位指令序列

SHL  AX, 1 SHLD  DX, AX, 1

RCL  DX, 1 RCL   AX, 1

学习和理解带进位的循环移位指令的控件。

5.2.6 位操作指令

1、位扫描指令(Bit Scan Instruction)

指令的格式:BSF/BSR Reg, Reg/Mem     ;80386+

受影响的标志位:ZF

位扫描指令是在第二个操作数中找第一个“1”的位置。如果找到,则该“1”的位置保存在第一操作数中,并置标志位ZF为1,否则,置标志位ZF为0。

根据位扫描的方向不同,指令分二种:正向扫描指令和逆向扫描指令。

正向扫描指令BSF(Bit Scan Forward)从右向左扫描,即:从低位向高位扫描;

逆向扫描指令BSR(Bit Scan Reverse)从左向右扫描,即:从高位向低位扫描

例如:

MOV AX, 1234H

BSF CX, AX       ;指令执行后,(CX)=2

BSR CX, AX       ;指令执行后,(CX)=12

2、位检测指令(Bit Test Instruction)

指令的格式:BT/BTC/BTR/BTS Reg/Mem, Reg/Imm    ;80386+

受影响的标志位:CF

位检测指令是把第一个操作数中某一位的值传送给标志位CF,具体的哪一位由指令的第二操作数来确定。

根据指令中对具体位的处理不同,又分一下几种指令:

BT:把指定的位传送给CF;

BTC:把指定的位传送给CF后,还使该位变反;

BTR:把指定的位传送给CF后,还使该位变为0;

BTS:把指定的位传送给CF后,还使该位变为1;

例如:假设(AX)=1234H,分别执行下面指令。

BT  AX, 2      ;指令执行后,CF=1,(AX)=1234h

BTC AX, 6       ;指令执行后,CF=0,(AX)=1274h

BTR AX, 10      ;指令执行后,CF=0,(AX)=1234h

BTS AX, 14      ;指令执行后,CF=0,(AX)=5234h

3、检测位指令TEST(Test Bits Instruction)

检测位指令是把二个操作数进行逻辑“与”操作,并根据运算结果设置相应的标志位,但并不保存该运算结果,所以,不会改变指令中的操作数。在该指令后,通常用JE、JNE、JZ和JNZ等条件转移指令。

指令的格式:TEST  Reg/Mem, Reg/Mem/Imm

受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)

例如:

TEST AX, 1       ;测试AX的第0位

TEST CL, 10101B    ;测试CL的第0、2、4位

5.2.7 比较运算指令

在程序中,我们要时常根据某个变量或表达式的取值去执行不同指令,从而使程序表现出有不同的功能。为了配合这样的操作,在CPU的指令系统中提供了各种不同的比较指令。通过这些比较指令的执行来改变有关标志位,为进行条件转移提供依

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
是徐英浩脑袋的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容