位移運算指令: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之間的值),目前看的例子中源操作數用立即數更常見;
前序文章
x86匯編語言入門基礎(三)匯編指令篇1 邏輯位運算-CSDN博客
x86匯編語言入門基礎(三)匯編指令篇2 算術運算-CSDN博客