CPU指令系统2

来源:互联网 发布:2017ssh项目源码 编辑:程序博客网 时间:2024/05/17 08:29

1、逻辑运算指令

逻辑运算指令是另一组重要的指令,它包括:逻辑与(AND)、逻辑或(OR)、逻辑非(NOT)和异或指令(XOR),逻辑运算指令也是经常使用的指令。

①逻辑与操作指令AND(Logical AND Instruction)

指令的格式:AND Reg/Mem, Reg/Mem/Imm
受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)
指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑“与操作”,操作结果存入目标操作数中。

截图01

②逻辑或操作指令OR(Logical OR Instruction)

指令的格式:OR Reg/Mem, Reg/Mem/Imm
受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)
指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑"或操作",操作结果存入目标操作数中。

截图01

③逻辑非操作指令NOT(Logical NOT Instruction)

指令的格式:NOT Reg/Mem
其功能是把操作数中的每位变反,即:1←0,0←1。指令的执行不影响任何标志位。

截图01

④逻辑异或操作指令XOR(Exclusive OR Instruction)

指令的格式:XOR Reg/Mem, Reg/Mem/Imm
受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)
指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑"异或操作",操作结果存入目标操作数中。

截图01

2、移位操作指令

移位操作指令是一组经常使用的指令,它包括算术移位、逻辑移位、双精度移位、循环移位和带进位的循环移位等五大类。

移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的值。在8086中,该立即数只能为1,但在其后的CPU中,该立即数可以是1··31之内的数。

2.1、算术移位

①算术左移SAL(Shift Algebraic Left):把目的操作数的低位向高位移,空出的低位补0.

截图01

②算术右移SAR(Shift Algebraic Right):把目的操作数的高位向低位移,空出的高位用最高位(符号位)填补.

截图01

它们的指令格式如下:

SAL/SAR Reg/Mem, CL/Imm

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

2.2、逻辑移位

①逻辑左移SHL(Shift Logical Left)

截图01

②逻辑右移SHR(Shift Logical Right)

截图01

它们的指令格式如下:

SHL/SHR Reg/Mem, CL/Imm

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

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

2.3、双精度移位指令

①双精度左移SHLD(Shift Left Double):第一操作数向左移n位,其“空出”的低位由第二操作数的高n位来填补,但第二操作数自己不移动、不改变。

截图01

②双精度右移SHRD(Shift Right Double):第一操作数向右移n位,其“空出”的高位由第二操作数的低n位来填补,但第二操作数自己也不移动、不改变。

截图01

其指令的格式如下:

SHLD/SHRD  Reg/Mem, Reg, CL/Imm ;80386+

其中:

第一操作数是一个16位/32位的寄存器或存储单元。

第二操作数(与前者具有相同位数)一定是寄存器。

第三操作数是移动的位数,它可由CL或一个立即数来确定。

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

2.4、循环移位指令

①循环左移ROL(Rotate Left)

截图01

②循环右移ROR(Rotate Right)

截图01

指令的格式:

ROL/ROR Reg/Mem, CL/Imm

受影响的标志位:CF和OF

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

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

①带进位的循环左移RCL(Rotate Left Through Carry)

截图01

②带进位的循环右移RCR(Rotate Right)

截图01

指令的格式:

RCL/RCR Reg/Mem, CL/Imm

受影响的标志位:CF和OF

带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF

3、位操作指令

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

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

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

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

指令的格式:

BSF/BSR Reg, Reg/Mem ;80386+

受影响的标志位:ZF

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

截图01 

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

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

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

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

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

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

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

指令的格式:

BT/BTC/BTR/BTS Reg/Mem, Reg/Imm ;80386+

受影响的标志位:CF

截图01

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

检测位指令是把两个操作数进行逻辑“与”操作,并根据运算结果设置相应的标志位,但并不保存该运算结果,所以,不会改变指令中的操作数。

指令的格式:

TEST  Reg/Mem, Reg/Mem/Imm

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

4、循环指令

汇编语言提供了多种循环指令,这些循环指令的循环次数都是保存在计数器CX或ECX中。有的循环指令还可由标志位ZF来决定是否结束循环。

在汇编语言中,CX或ECX只能递减,所以,循环计数器只能从大到小。在程序中,必须先把循环次数赋给循环计数器。

汇编语言的循环指令都是放在循环体的下面。在循环时,首先执行一次循环体,然后把循环计数器CX或ECX减1。当循环终止条件达到满足时,该循环指令下面的指令将是下一条被执行的指令,否则,程序将向上转到循环体的第一条指令。

在循环未终止,而向上转移时,规定:该转移只能是一个短转移,即偏移量不能超过128,也就是说循环体中所有指令码的字节数之和不能超过128。如果循环体过大,可以用后面介绍的“转移指令”来构造循环结构。

循环指令本身的执行不影响任何标志位。

4.1、循环指令(Loop Until Complete)

LOOP 标号
LOOPW 标号 ;CX作为循环计数器,80386+
LOOPD 标号 ;ECX作为循环计数器,80386+

截图01

执行过程:

①(CX)=(CX)-1或(ECX)=(ECX)-1;

②如果(CX)≠0或(ECX)≠0,转向“标号”所指向的指令;否则,终止循环,执行该指令下面的指令。

4.2、相等或为零循环指令(Loop While Equal or Loop While Zero)

相等或为零循环指令的一般格式:

LOOPE/LOOPZ 标号
LOOPEW/LOOPZW 标号 ;CX作为循环计数器,80386+
LOOPED/LOOPZD 标号 ;ECX作为循环计数器,80386+

这是一组有条件循环指令,它们除了要受CX或ECX的影响外,还要受标志位ZF的影响。其具体规定如下:

①(CX)=(CX)-1或(ECX)=(ECX)-1; (不改变任何标志位)

②如果循环计数器≠0且ZF=1,则程序转到循环体的第一条指令,否则,程序将执行该循环指令下面的指令。

截图01

4.3、不等或不为零循环指令(Loop While Not Equal or Loop While Not Zero)

不等或不为零循环指令的一般格式:

LOOPNE/LOOPNZ 标号
LOOPNEW/LOOPNZW 标号 ;CX作为循环计数器,80386+
LOOPNED/LOOPNZD 标号 ;ECX作为循环计数器,80386+

这也是一组有条件循环指令,它们与相等或为零循环指令在循环结束条件上有点不同。其具体规定如下:

①(CX)=(CX)-1或(ECX)=(ECX)-1; (不改变任何标志位)

②如果循环计数器≠0且ZF=0,则程序转到循环体的第一条指令,否则,程序将执行该循环指令下面的指令。

截图01 

5、转移指令

转移指令分无条件转移指令和有条件转移指令两大类。

5.1、无条件转移指令(Transfer Unconditionally)

①JMP(Unconditional Jump):从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个短(short)转移(偏移量在[-128, 127]范围内),近(near)转移(偏移量在[-32K, 32K]范围内)或远(far)转移(在不同的代码段之间转移)。

短和近转移是段内转移,JMP指令只把目标指令位置的偏移量赋值指令指针寄存器IP。

远转移是段间转移,JMP指令不仅会改变指令指针寄存器IP的值,而且还会改变代码段寄存器CS的值。

JMP指令的一般形式:

JMP  标号/Reg/Mem

5.2、条件转移指令(Transfer Conditionally)

条件转移指令是一组极其重要的转移指令,它根据标志寄存器中的一个(或多个)标志位来决定是否需要转移,这就为实现多功能程序提供了必要的手段。

条件转移指令又分三大类:

①基于无符号数的条件转移指令

截图01

②基于有符号数的条件转移指令

截图01

③基于特殊算术标志位的条件转移指令。

截图01

原创粉丝点击