概述
汇编语言(六)—— 位操作类指令
- 位操作类指令
- 逻辑运算指令
- 逻辑与指令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
逻辑运算的屏蔽作用
-
AND用于复位(清0)某些位(同0与),不影响其他位(同1与)。
; e.g. and bl, 11110110B ; 将 bl 中 D0 与 D3 清 0 ,其余位不变
-
OR用于置位(置1)某些位(同1或),不影响其他位(同0或)。
; e.g. or bl, 00001001B ; 将 bl 中 D0 与 D3 置 1 ,其余位不变
-
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。
- 大写 = 小写 and dfH ; 即大写 = 小写 and 11011111,将小写字母的第五位置0。
- 小写 = 大写 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汇编语言程序设计
最后
以上就是缥缈吐司为你收集整理的汇编语言(六)—— 位操作类指令的全部内容,希望文章能够帮你解决汇编语言(六)—— 位操作类指令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复