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 初始 ...