32位組合語言學習筆記 4 移位操作

2021-06-27 01:36:49 字數 1962 閱讀 6024



sal k, d

,d = d << k

,左移。

shl,與

sal相同。

sar k, d

,d = d >> k

,算術右移。

shr k, d

,d = d >>(l) k

,邏輯右移。

算術右移是指左邊空出來的位填符號位。

邏輯右移是指左邊空出來的位填0。

示例:/*shift.c*/

int shift_left2_rightn(int x, int n)

gcc -o1 -s -m32 shift.c

shift_left2_rightn:

pushl

%ebp n

movl

%esp, %ebp

movl

8(%ebp), %eax //

把引數1:x

的值裝入

eax。

sall

$2, %eax // eax = eax << 2

。movl

12(%ebp), %ecx //

把引數2:n

的值裝入

ecx。

sarl

%cl, %eax //ecx的低8

位就是cl

,所以cl=n

,eax = eax>> n

。popl

%ebp

retint arith(int x,

int y,

int z)

gcc -o1 -s -m32 arith.c

arith:

pushl

%ebp

movl

%esp, %ebp

movl

16(%ebp), %eax

//eax = z

leal

(%eax,%eax,2), %eax // eax= 3*z

sall

$4, %eax // eax = 3*16*z =48*z = t2

movl

12(%ebp), %edx // edx = y

addl

8(%ebp), %edx // edx = x +y = t1

andl

$65535, %edx // edx = t1& 65535 = t1 & 0xffff = t3

imull

%edx, %eax //eax = t3 * t2= t4

popl

%ebp

ret反彙編練習:

假設函式引數壓棧順序從右到左,函式宣告是

int func(int x, int y, int z);

movl 12(%ebp), %eax //eax = y

xorl 8(%ebp), %eax //eax = y ^x = t1

sarl $3, %eax // eax = (y^x)<<3 = t2= t1 << 3

notl %eax // eax = ~((y^x)<<3) = t3 =~t2

subl 16(%ebp), %eax // eax = eax – z = t4 =t3 - z

最終函式的**如下:

int func(int x, int y, int z)

進行反彙編驗證:

gcc -o1 -s -m32 func.c

func:

pushl

%ebp

movl

%esp, %ebp

movl

12(%ebp), %eax

xorl

8(%ebp), %eax

sall

$3, %eax

notl

%eax

subl

16(%ebp), %eax

popl

%ebp

ret

32位組合語言學習筆記 6 設定條件碼

條件碼儲存在條件碼暫存器中,用於描述算術和最近邏輯操作的屬性。最常用的條件碼有 cf 進製標誌。zf 零標誌。sf 符號標誌。of 溢位標誌。算術和邏輯操作指令都會修改條件碼的值,但是 leal 指令不會修改條件碼的值。此外,cmp 指令和test 指令也會修改條件碼。cmp s2,s1 將s1 s...

組合語言學習筆記

學習參考資料 大灰狼 講彙編 資料匯流排,位址匯流排,控制匯流排。位址匯流排有多少條就決定了cpu最大的記憶體使用量。80386有32位位址匯流排,所以它的定址能力就是4g.暫存器 通用暫存器,段暫存器,ax暫存器 通用暫存器,存放資料。高位位元組ah,低位位元組al。實體地址表示方法 位址加法器,...

組合語言學習筆記

cs ip是指向程式執行的位置 code segment ds 儲存記憶體中取資料的位址,data segment ss sp是指向堆疊的位置 stack segment cx 裡儲存的是loop執行的標誌 loop執行時,cx cx 1,若此時cx裡值為0,則跳出loop,否則繼續loop 初始 ...