我是靠谱客的博主 缥缈吐司,最近开发中收集的这篇文章主要介绍汇编语言(六)—— 位操作类指令,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

汇编语言(六)—— 位操作类指令

    • 位操作类指令
      • 逻辑运算指令
        • 逻辑与指令AND
        • 测试指令TEST
        • 逻辑或指令OR
        • 逻辑非指令NOT
        • 逻辑异或指令OR
          • 逻辑运算的屏蔽作用
          • 逻辑运算用于大小写转换
          • 逻辑运算用于清0
      • 移位指令
        • 逻辑左移指令SHL / / /算术左移指令SAL
        • 逻辑右移指令SHR
        • 算术右移指令SAR
      • 循环移位指令
        • 不带进位循环左移指令ROL
        • 不带进位循环右移指令ROR
        • 带进位循环左移指令RCL
        • 带进位循环右移指令RCR
    • 参考

位操作类指令

计算机中最基本的数据单位是二进制位,针对二进制位进行操作、实现位控制的指令由逻辑运算指令、移位指令、循环移位指令等。在进行一位或若干位处理时,采用位操作类指令。

逻辑运算指令

逻辑运算指令有五条:① 逻辑与指令 AND;② 逻辑或指令 OR;③ 逻辑非指令 NOT;④ 逻辑异或指令 XOR;⑤ 测试指令 TEST。
AND、OR、XOR、TEST指令均使OF = CF = 0(位运算中,进位与溢出标志无意义),并根据结果按定义影响ZF、SF和PF标志,只有NOT指令不影响标志。

逻辑与指令AND

逻辑与(逻辑乘)运算规则:两位都是逻辑1,则结果是1;否则,结果是0。
指令:and dest, src ; 按位进行逻辑与,结果返回目的操作数。

and reg, imm/reg/mem   ; reg <- reg and imm/reg/mem
and mem, imm/reg       ; mem <- mem and imm/reg

; e.g. 
     01000101
and  00110001
 =   00000001

测试指令TEST

进行逻辑与运算但不回送结果,根据运算对标志位的影响进行后续操作,不改变操作数。

逻辑或指令OR

逻辑或运算规则:两位都是逻辑0,则结果是0;否则,结果是1(有一个1则为1)。
指令:or dest, src ; 按位进行逻辑或,结果返回目的操作数。

or reg, imm/reg/mem   ; reg <- reg or imm/reg/mem
or mem, imm/reg       ; mem <- mem or imm/reg

; e.g. 
    01000101
 or 00110001
 =  01110101

逻辑非指令NOT

逻辑非(逻辑反)运算规则:原来为0的位变成1,原来为1的位变成0。
指令:not dest ; 按位进行逻辑非,结果返回目的操作数。NOT指令不影响状态标志位。

not reg, reg/mem   ; reg <- reg not reg/mem

; e.g. 
not 01000101
 =  10111010

逻辑异或指令OR

逻辑异或(逻辑半加)运算规则:两位都不同(相异),则结果是1;否则,结果是0(有一个1一个0则为1)。
指令:xor dest, src ; 按位进行逻辑异或,结果返回目的操作数。

xor reg, imm/reg/mem   ; reg <- reg xor imm/reg/mem
xor mem, imm/reg       ; mem <- mem xor imm/reg

; e.g. 
    01000101
xor 00110001
 =  01110100
逻辑运算的屏蔽作用
  1. AND用于复位(清0)某些位(同0与),不影响其他位(同1与)。

     ; e.g. 
     and bl, 11110110B      ; 将 bl 中 D0 与 D3 清 0 ,其余位不变
    
  2. OR用于置位(置1)某些位(同1或),不影响其他位(同0或)。

     ; e.g. 
     or bl, 00001001B       ; 将 bl 中 D0 与 D3 置 1 ,其余位不变
    
  3. XOR用于求反某些位(同1异或)(1与1异或结果为0,1与0异或结果为1),不影响其他位(同0异或)(0与1异或结果为1,0与0异或结果为0)。

     ; e.g. 
     xor bl, 00001001B       ; 将 bl 中 D0 与 D3 求反 ,其余位不变
    
逻辑运算用于大小写转换

大写字母ASCII码值的第5位均为0,小写字母的ASCII码值的第五位均为1。

  1. 大写 = 小写 and dfH ; 即大写 = 小写 and 11011111,将小写字母的第五位置0。
  2. 小写 = 大写 or 20H ; 即小写 = 大写 or 00100000,将大写字母的第五位置1。
逻辑运算用于清0

几种清0方式的比较:

xor edx, edx     ; 逻辑运算指令进行清 0 时,同时将 OF 与 CF 清 0,只影响 ZF, SF, PF
and edx, 0       ; 逻辑运算指令进行清 0 时,同时将 OF 与 CF 清 0,只影响 ZF, SF, PF
sub edx, edx     ; 减法运算清 0 时,五个标志位都可能变化
mov edx, 0       ; mov 指令清 0 时,不影响标志位

移位指令

移位指令有四条:
① 逻辑左移指令 SHL;② 逻辑右移指令 SHR(SH:SHift;L:Left;R:Right);
③ 算术左移指令 SAL;④ 算术右移指令 SAR(S:Shift;L:Left;R:Right;A:Arithmetic)。

逻辑左移指令SHL / / /算术左移指令SAL

SHL、SAL两条助记符完成的操作一样,都是将数据的每一位同时左移,最低位补0,最后移出的最高位进入CF(最高有效位MSB)。
指令:shl / / /sal dest, src ; dest为要移位的数据,src为要移位的位数(cl寄存器或整数),结果返回目的操作数。

shl reg/mem, 1/cl 
sal reg/mem, 1/cl 

; e.g. 执行前 AL = 11110101B
shl al, 1       ; 执行后 AL = 11101010B , CF = 1 

逻辑右移指令SHR

SHR 将数据的每一位同时右移,最高位补0,red最后移出的最低位进入CF。
指令:shr dest, src ; dest为要移位的数据,src为要移位的位数(cl寄存器或整数),结果返回目的操作数。

shr reg/mem, 1/cl

; e.g. 执行前 AL = 11110101B
shr al, 1       ; 执行后 AL = 01111010B , CF = 1 

算术右移指令SAR

SAR (针对有符号数)将数据的每一位同时右移,最高位不变(保持符号位不变),最后移出的最低位进入CF(最低有效位LSB)。
指令:sar dest, src ; dest为要移位的数据,src为要移位的位数(cl寄存器或整数),结果返回目的操作数。

sar reg/mem, 1/cl

; e.g. 执行前 AL = 11110101B
sar al, 1       ; 执行后 AL = 11111010B , CF = 1 

循环移位指令

循环移位指令有四条:
① 不带进位循环左移指令 ROL;② 不带进位循环右移指令 ROR(RO:ROtate;L:Left;R:Right);
③ 带进位循环左移指令 RCL;④ 带进位循环右移指令 RCR(R:Rotate;L:Left;R:Right;C:Carry flag)。

不带进位循环左移指令ROL

ROL 将数据的每一位同时左移,最高位循环进入最低位和CF。
指令:rol dest, src ; dest为要移位的数据,src为要移位的位数(cl寄存器或整数),结果返回目的操作数。

rol reg/mem, 1/cl

; e.g. 执行前 AL = 11100101B
rol al, 1       ; 执行后 AL = 11001011B , CF = 1 

不带进位循环右移指令ROR

ROR 将数据的每一位同时右移,最低位循环进入最高位和CF。
指令:ror dest, src ; dest为要移位的数据,src为要移位的位数(cl寄存器或整数),结果返回目的操作数。

ror reg/mem, 1/cl

; e.g. 执行前 AL = 11100101B , CL = 2
ror al, 1       ; 执行后 AL = 01111001B , CF = 0 

带进位循环左移指令RCL

RCL CF作为附加位,将数据的每一位同时左移,CF进入最低位,最高位进入CF(将CF进位标志的值包含到循环体中)。
指令:rcl dest, src ; dest为要移位的数据,src为要移位的位数(cl寄存器或整数),结果返回目的操作数。

rcl reg/mem, 1/cl

; e.g. 执行前 AL = 11100101B , CF = 0
rcl al, 1       ; 执行后 AL = 11001010B , CF = 1 

带进位循环右移指令RCR

RCR CF作为附加位,将数据的每一位同时右移,CF进入最高位,最低位进入CF(将CF进位标志的值包含到循环体中)。
指令:rcr dest, src ; dest为要移位的数据,src为要移位的位数(cl寄存器或整数),结果返回目的操作数。

rcr reg/mem, 1/cl
; e.g. 执行前 AL = 11100101B , CF = 0
rcr al, 4       ; 执行后 AL = 10101110B , CF = 0 

参考

中国大学MOOC汇编语言程序设计

最后

以上就是缥缈吐司为你收集整理的汇编语言(六)—— 位操作类指令的全部内容,希望文章能够帮你解决汇编语言(六)—— 位操作类指令所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部