Loading... # 基本指令系统2 ## 位操作指令 逻辑运算、移位等功能 ### 逻辑运算指令 完成与、或、非、异或 #### 逻辑与 格式:AND DEST, SRC 功能:DEST←(DEST)$\land$(SRC) #### 逻辑或 格式:OR DEST, SRC 功能:DEST←(DEST)$\lor$(SRC) #### 逻辑异或 格式:XOR DEST, SRC 功能:DEST←(DEST)$\oplus$(SRC) 前三个操作均为双操作数指令 #### 逻辑非 格式:NOT DEST 功能:DEST←$\neg$(DEST) #### 逻辑运算应用 **取位操作** AND AL, 0FH : 将(AL)的高4位清0,保留低4位(相当于提取AL值的低4位),0FH相当于取位模板 AL:10100011B→**0000**0011B **置位操作** OR AL, 11H : 通过或运算把(AL)的第0、4位置为1,同时不影响其他位,11H相当于置位模板 AL:00001000B→000**1**100**1**B **位变反操作** XOR AL, 00100010B : 通过异或运算把(AL)的第1、5位变反,同时不影响其他数据位 AL:01110101B→01**0**101**1**1B eg: 1. 实现AL高4位和BL低4位组合 ~~~assembly AND AL, F0H AND BL, 0FH OR AL, BL ~~~ 2. 寄存器的第3、4位变反 ~~~assembly XOR AL, 18H ~~~ 3. 寄存器AL的第3、4位清0,其余位保持不变 ~~~assembly AND AL, E7H ~~~ 4. 将寄存器AL的第3、4位置1,其余位保持不变 ~~~assembly OR AL, 18H ~~~ ### 测试指令 格式:TEST DEST, SRC 功能:(DEST)$\land$(SRC),与AND指令几乎完全一样,唯一区别是TEST指令不保存运算结果 **可以用来判断第几位是否为0或1**,通过ZF标志来判别(AL)的某一位上是0还是1,通常与条件转移指令结合使用 **CMP使用数值比较来影响标志位,TEST通过数据位测试来影响标志位** ### 移位/循环移位指令 共同指令格式:OPR DEST, COUNT * OPR:操作助记符,指明移位的方式 * DEST:目的操作数地址,必须为通用寄存器或存储单元,可以为字节、字 * COUNT:移位次数 #### 算术移位指令 **算术左移** 格式:SAL DEST, COUNT 功能:将(DEST)左移COUNT位,移出的最低位保存到CF标志,空出的低位补0 COUNT为1时可以用常数表示,大于1需要用CL寄存器中的内容表示 ==**每左移一位相当于操作数乘以2**==(左移后被舍弃的高位不含1) ![image-20220416205937222.png](http://xherlock.top/usr/uploads/2022/04/233581904.png) eg:AL:10100011B $\stackrel{左移3位}{\rightarrow}$ 10011000B,CF=1(最开始的第三位) **算术右移** 格式:SAR DEST, COUNT 功能:将(DEST)右移COUNT位,移出的最高位保存到CF标志,空出的高位则补充原来的符号位 eg:AL:10100011B $\stackrel{右移2位}{\longrightarrow}$ 11101000B,CF=1(倒数第2位) #### 逻辑移位指令 针对无符号数 **逻辑左移** 格式:SHL DEST, COUNT 功能:将(DEST)左移COUNT位,移出的最低位保存到CF标志,空出的低位补0 与SAL实际上是同一条指令,机器指令代码完全一致 **逻辑右移** 格式:SHR DEST, COUNT 功能:将(DEST)右移COUNT位,移出的最高位保存到CF标志,空出的高位则补充0 #### 循环移位指令 **循环左移** 格式:ROL DEST, COUNT 功能:把(DEST)循环左移COUNT位,从高位移出的数据位补充到低位,移出的最低位保存在CF ![image-20220416210655223.png](http://xherlock.top/usr/uploads/2022/04/283364368.png) eg:AL:10100011B $\stackrel{循环左移1位}{\longrightarrow}$ 01100111B,CF=1 **循环右移** 格式:ROR DEST, COUNT 功能:把(DEST)循环右移COUNT位,从低位移出的数据位补充到高位,移出的最高位保存在CF ![image-20220416211110776.png](http://xherlock.top/usr/uploads/2022/04/1221734218.png) eg:AL:10100011B $\stackrel{循环右移2位}{\longrightarrow}$ 10101100B,CF=1 ### 处理器控制指令 用于设置标志位、控制CPU运转、空操作指令 #### 标志位操作指令 **清除进位标志** 格式:CLC 功能:将CF标志清0 **进位标志置位** 格式:STC 功能:将CF标志置1 **进位标志取反** 格式:CMC 功能:CF标志位取反 **清楚方向标志** 格式:CLD 功能:DF标志位清0 **方向标志置位** 格式:STD 功能:DF标志位置1 **清除中断标志** 格式:CLI 功能:IF标志位清0,关闭CPU处理可屏蔽中断的硬件开关 **中断标志置位** 格式:STI 功能:IF标志位置1,打开CPU处理可屏蔽中断的硬件开关 ==小结==: * 进位标志CF:清除、置位、取反指令 * 方向标志DF:清除、置位指令 * 中断标志IF:清除、置位指令 #### 空操作指令 格式:NOP 功能:使CPU执行一次空操作,占有山歌节拍,不做任何操作,不影响任何寄存器、内存单元和标志位 可用于时延较短的延时程序中,也可以在**调试程序时用于覆盖其他指令** 最后修改:2022 年 07 月 29 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏