位移运算指令:SHL逻辑移位,SAR算术移位, ROR循环右移
1. SHL 逻辑移位
Shift Left, SHL代表向左移位,SHR代表向右移位
指令格式:shl op1, op2
- 目的操作数 op1:寄存器/内存地址
- 源操作数 op2:寄存器(通常是低8位寄存器CL)/立即数(表示移位的位数,在32位系统中立即数通常限制为1-32之间的值)
指令释义:向左移动指定位数,高位丢弃,低位补0(二进制按位移动)
- 任何因移位产生的新的位都会自动填充位0(零扩展)
实例理解
1. 指令 shl eax, 0x10(向左移动16位)
- 假设eax的值是0x0000ffff,
- 位移运算前的二进制表示:0000 0000 0000 0000 1111 1111 1111 1111
- 位移运算后的二进制表示:1111 1111 1111 1111 0000 0000 0000 0000
2. 指令 shl [ebx], cl
- 将内存地址[ebx]中的值向左移动CL寄存器中的指定位数
2. SAR 算术移位
Shift Arithmetic Right,SAR算术右移,SAL算术左移
指令格式:sar op1, op2
- 目的操作数 op1:寄存器/内存地址
- 源操作数 op2:寄存器/立即数
指令释义:用于对寄存器或内存中的值进行算术右移操作,算术右移是一种特殊的位移操作,它在移位时会保留符号位(最高位),因此适用于有符号整数的移位操作。
- SAR操作会对值进行符号扩展,所有新的位会以最高有效位1来填充;
- SAL与SHL指令操作相同,都是对值进行零扩展,新的位用0来填充
实例理解
1. sar al, 3
- 假设位移运算前为:1000 0000
- 那么位移运算后为:1111 0000
- sar进行符号扩展,复制最高有效位1
3. ROR 循环右移
Rotate Right,循环右移
指令格式:ror op1, op2
- 目的操作数 op1:寄存器/内存地址
- 源操作数 op2:寄存器/立即数
指令释义:将目标操作数向右循环移位,常用于生成字符串哈希(通过逐字符处理一个字符串,右旋转打乱当前值的位顺序)
实例理解
1. ror edx, 0x0c(向右循环位移12次)
- 假设位移运算前edx的值为0x87654321
- 位移运算前二进制表示:1000 0111 0110 0101 0100 0011 0010 0001
- 位移运算后二进制表示:0011 0010 0001 1000 0111 0110 0101 0100
- 位移运算后的十六进制表示为 0x32187654
位移运算的指令格式
- 目的操作数 operand1:寄存器或内存地址
- 源操作数 operand2:寄存器(通常是低8位寄存器CL),或立即数(表示移位的位数,在32位系统中立即数通常限制为1-32之间的值),目前看的例子中源操作数用立即数更常见;