移位和迴圈移位指令如下表:
shl左移
shr右移
sal算術左移
sar算術右移
rol迴圈左移
ror迴圈右移
rcl帶進製的迴圈左移
rcr帶進製的迴圈右移
shld
雙精度左移
shrd
雙精度右移
移位運算元的位有兩種方法,一種是邏輯移位,另一種是算術移位。
邏輯移位:空出來的位用0填充
算術移位:空出來的位用原資料的符號來填充
shl指令:
shl destination,count
位元乘法:數值進行左移即執行了位元乘法。任何運算元左移n位,即將該數乘以2的n次方。
shr指令:
位元除法:數值進行右移即執行了位元除法。任何運算元右移n位,即將該數除以2的n次方。
sal和sar指令:sal的指令和shl一樣,不同的是sar指令,算術右移最高位要保留。
ax符號擴充套件到eax:設ax中有符號數,現將其符號位擴充套件到eax。首先把eax左移16位,再將其算術右移16位。
如下:
mov eax,-128 ;eax=????ff80h
shl eax,16 ;eax=ff800000h
sar eax,16 ;eax=ffffff80h
rol指令:
位元迴圈:以迴圈方式來移位
rol:迴圈左移,指令把所有位都向左移。最高位複製到進製標誌位和最低位。
位組交換:利用rol可以交換乙個位元組的高四位和低四位。
當多位元組整數以四位為單位進行迴圈移位時,其效果相等於一次向右或向左移動乙個十六進製制位。
ror指令:
ror:迴圈右移,指令把所有位都向右移,最低為複製到進製標誌位和最高位。
rcl和rcr指令:
rcl:帶進製的迴圈左移,指令把每一位都左移,進製標誌位複製到最低位,最高位複製到進製標誌位。
從進製標誌位恢復位:rcl可以恢復之前移入進製標誌位的位。
rcr指令:帶進製的迴圈右移。
有符號數溢位:如果有符號數迴圈移動一位生成的結果超過了目的運算元的有符號數範圍,則溢位標誌位置1。
shld/shrd指令:
shld:雙精度左移,指令將目的運算元左移指定位數。移動形成的空位由源運算元的高位填充。源運算元不變,但是符號標誌位,零標誌位,輔助進製標誌位,奇偶標誌位和進製標誌位會受影響。
shld dest,source,count
shrd::雙精度右移,指令將目的運算元右移指定位數。移動形成的空位由源運算元的低位填充。源運算元不變,但是符號標誌位,零標誌位,輔助進製標誌位,奇偶標誌位和進製標誌位會受影響。
二進位制乘法:
舉例如果要乘以36,將36化為2的5次方加上2的平方,再用分配率解決。用彙編可以這樣解決:
mov eax,123
mov ebx,eax
shl eax,5
shl ebx,2
add eax,ebx
mul指令:
mul reg/mem8
mul reg/mem16
mul reg/me32
mul運算元:
被乘數乘數
乘積al
reg/mem8
axax
reg/mem16
dx:ax
eaxreg/mem32
edx:eax
imul指令:
有符號數乘法。imul會保留乘積的符號
單運算元格式:
imul reg/mem8 ;ax=al*reg/mem8
imul reg/mem16 ;dx;ax=ax*reg/mem16
imul reg/mem32 ;edx;eax=eax*reg/mem32
雙運算元格式
imul reg32,reg/mem32
imul reg32,imm8
imul reg32,imm32
三運算元格式:第二個數和第三個數 相乘放在第乙個暫存器中
imul reg32,reg/mem32,imm8
imul reg32,reg/mem32,imm32
div指令:
div reg/mem8
div reg/mem16
div reg/mem32
被除數除數商
餘數ax
reg/mem8
alah
dx:ax
reg/mem16
axdx
edx:eax
reg/mem8
eaxedx
有符號數除法:
幾乎和無符號數相同,但是要進行符號擴充套件
如下**:
.data
wordval sword -101 ;009bh
.code
mov dx,0
mov ax,wordval; dx:ax=0000009bh
cwd ;dx:ax=fffff9bh
mov bx,2
idiv bx
有符號擴充套件指令(cwd,cbw,cdq)擴充套件加減法cbw:位元組轉字,指令將al的符號擴充套件到ah,保留了資料的符號
cwd:字轉雙字,指令將ax的符號位擴充套件到dx
cdq:雙字轉四字,指令將eax的符號位擴充套件到edx
adc指令:帶進製加法,指令將源運算元和進製標誌位的值都與目的運算元相加。
mov dl,0
mov al,0ffh
add al,0ffh
adc dl,0
sbb指令:帶借位減法。指令從目的運算元中減去源運算元和進製標誌位的值。
ascii和非壓縮十進位制的運算
aaa執行加法後進行ascii調整
aas執行減法後進行ascii調整
aam執行乘法後進行ascii調整
aad執行除法後進行ascii調整
組合語言 手記4
簡單的彙編指令 cpu執行後,暫存器中的資料改變為如下 cpu訪問記憶體單元時要給出記憶體單元的位址。所有的記憶體單元構成的儲存空間是乙個一維的線性空間。這個唯一的位址就是實體地址。16位結構描述了乙個cpu具有一下幾個方面特徵 1 運算器一次最多可以處理16位的資料。2 暫存器的最大寬度為16位。...
組合語言 手記4
簡單的彙編指令 cpu執行後,暫存器中的資料改變為如下 cpu訪問記憶體單元時要給出記憶體單元的位址。所有的記憶體單元構成的儲存空間是乙個一維的線性空間。這個唯一的位址就是實體地址。16位結構描述了乙個cpu具有一下幾個方面特徵 1 運算器一次最多可以處理16位的資料。2 暫存器的最大寬度為16位。...
組合語言 AT T組合語言
這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...