組合語言(4)整數運算

2021-09-26 04:53:18 字數 3141 閱讀 6100

移位和迴圈移位指令如下表:

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 常數 立即運算元...