本文最后更新于:2024年8月16日 下午
x32汇编位运算
- 有符号数的乘法和除法可以用算术移位
- 无符号数的乘法和除法可以用逻辑移位
算数移位指令
指令格式:ASL/SAR Reg/Mem, CL/Lmm
SAL(算数左移)
1 2 3 4 5 6 7 8 9 10 11
| SAL eax,1 SAL ax,1 SAL al,1
;操作 eax寄存器操作修改al寄存器位0x81 SAL al,1 0x81 10000001 << 1 == 0000 0010 CF:1 0x02
|
SAR(算数右移)
1 2 3 4 5 6 7 8 9 10 11
| SAR eax,1 SAR ax,1 SAR al,1
;操作 eax寄存器操作修改al寄存器位0x81 SAR al,1 0x81 1000 0001 >> 1 == 1100 0000 CF = 1 0xC0
|
逻辑移位指令
指令格式SHL/SHR Reg/Mem, CL/Imm
SHL(逻辑左移)
1 2 3 4 5 6 7 8 9 10 11 12
| SHL eax,1 SHL ax,1 SHL al,1
;操作 eax寄存器操作修改al寄存器位0x81 SHL al,1 0x81 1000 0001 << 1 == 0000 0010
CF:1 0x02
|
SHR(逻辑右移)
1 2 3 4 5 6 7 8 9 10 11 12
| SHR eax,1 SHR ax,1 SHR al,1
;操作 eax寄存器操作修改al寄存器位0x81 SHR al,1 0x81 1000 0001 >> 1 == 0100 0000
CF:1 0x40
|
循环移位指令
指令格式ROL r/m, i8 ROR r/m, CL
ROL(逻辑左移)
1 2 3 4 5 6 7 8 9 10 11 12
| RCL eax,1 RCL ax,1 RCL al,1
;操作 eax寄存器操作修改al寄存器位0x81 RCR al,1 0x81 1000 0001 -> 1 == 1100 0000
CF:1 0xC0
|
ROR(逻辑右移)
1 2 3 4 5 6 7 8 9 10 11 12
| ROL eax,1 ROL ax,1 ROL al,1
;操作 eax寄存器操作修改al寄存器位0x81 ROL al,1 0x81 1000 0001 -> 1 == 1100 0000
CF:1 0xC0
|
带进位的循环移位指令
指令格式RCL r/m, i8 RCR r/m, CL
RCL( 带进位循环左移)
1 2 3 4 5 6 7 8 9 10 11 12
| RCL eax,1 RCL ax,1 RCL al,1
;操作 eax寄存器操作修改al寄存器位0x81 RCL al,1 0x81 1000 0001 <-- 1 == 0000 0010
CF:1 0x02
|
RCR( 带进位循环右移)
1 2 3 4 5 6 7 8 9 10 11 12
| RCR eax,1 RCR ax,1 RCR al,1
;操作 eax寄存器操作修改al寄存器位0x81 RCR al,1 0x81 1000 0001 --> 1 == 0100 0000
CF:1 0x40
|
练习1
1、定义一个unsiged char 类型,通过程序为第3、5、7位赋值,赋值时不能影响到其它位原来的值.(使用位操作指令、比如:& | ! ^ << >>等)
1 2 3 4 5
| unsigned char bit = 0;
|