條件碼儲存在條件碼暫存器中,用於描述算術和最近邏輯操作的屬性。最常用的條件碼有:
cf:進製標誌。
zf:零標誌。
sf:符號標誌。
of:溢位標誌。
算術和邏輯操作指令都會修改條件碼的值,但是
leal
指令不會修改條件碼的值。
此外,cmp
指令和test
指令也會修改條件碼。
cmp s2, s1
將s1-s2
的結果與
0進行比較,分別對應大於
0,等於
0和小於
0三種情況,不同比較結果會設定不同的條件碼的值。
test s2, s1
測試s1 & s2
結果值,分別對應大於
0,等於
0和小於
0三種情況,不同比較結果會設定不同的條件碼的值。
set系列指令會根據條件碼的值設定目的暫存器的值:
sete d
,等於0
,d=zf
。setz d
,與sete
相同。setne d
,不等於0,
d=~zf
。setnz d
,與setne
相同。sets d
,負數,
d=sf
。setns d
,非負數,
d=~sf
。setg d
,有符號大於,
d=~(sf ^ of)& ~zf
。setnle d
,與setg d
相同。setge d
,有符號大於等於,
d=~(sf ^ of)
。setnl d
,與setge
相同。setl d
,有符號小於,
d=sf ^ of
。setnge d
,與setl d
相同。setle d
,有符號小於等於,
d=(sf ^ of)| zf
。setng d
,與setle d
相同。seta d
,無符號大於,
d=~cf &~zf
。setnbe d
,與seta d
相同。setae d
,無符號大於等於,
d=~cf
。setnb d
,與setae d
相同。setb d
,無符號小於,
d= cf
。setnae d
,與setb d
相同。setbe d
,無符號小於等於,
d= cf | zf
。setna d
,與setbe
相同。示例:
char ctest_1(int a, int b)
gcc -o1 -s -m32 ctest_1.c
ctest_1:
pushl
%ebp
movl
%esp, %ebp
movl
12(%ebp), %eax
cmpl
%eax, 8(%ebp)
//比較a和
bsetl
%al //
如果a,
al會設定成
1,否則設定成0。
movzbl
%al, %eax //eax
的高位3
位元組用0
來填充。
popl
%ebp
retchar ctest(int a, int b, int c)
gcc -o1 -s -m32 ctest.c
ctest:
pushl
%ebp
movl
%esp, %ebp
pushl
%esi
pushl
%ebx
movl
8(%ebp), %ebx//ebx = a
movl
12(%ebp), %ecx // ecx = b
movl
16(%ebp), %esi //esi = c
cmpl
%ecx, %ebx //比較a
和bsetl
%al //al = (a < b)
= t1
testl
%ebx, %ebx //測試a
的值是正數、負數還是
0setg
%dl //dl = (a > 0) = t6
addl
%edx, %eax //al = t1 + t6
cmpl
%ebx, %ecx //比較b
和asetb
%dl //dl = (b <(unsigned) a) = t2
addl
%edx, %eax //al = t1 + t6+ t2
cmpl
%ecx, %esi //比較c
和bsetg
%dl //dl = (c > b) = t5
addl
%edx, %eax // al = t1 + t6 + t2 + t5
cmpw
%bx, %si //把c
和a強轉成16
位整數後進行比較
setge
%dl //dl = ((short)c>=(short) a) = t3
addl
%edx, %eax // al = t1 + t6+ t2 + t5 + t3
movl
%esi, %edx //把c
的值裝入
edxcmpb
%dl, %bl //把a
和c強轉成8
位整數後進行比較
setne
%dl // dl = ((char) a !=(char) c) = t4
addl
%edx, %eax // al = t1 + t6+ t2 + t5 + t3 + t4
movsbl
%al,%eax //
對eax高位3
位元組用0
來填充popl
%ebx
popl
%esi
popl
%ebp
ret
組合語言學習筆記 6
63.一般來說,需要暫存的資料,我們都應該使用棧.64.offset是由編譯器處理的符號,它的功能是取得標號的偏移位址.65.ret和retf指令 ret指令用棧中的資料,修改ip的內容,從而實現近遷移 retf指令用棧中的資料,修改cs和ip的內容,從而實現遠遷移.實際上乙個是段內遷移,乙個則可用...
32位組合語言學習筆記 4 移位操作
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 g...
組合語言學習筆記
學習參考資料 大灰狼 講彙編 資料匯流排,位址匯流排,控制匯流排。位址匯流排有多少條就決定了cpu最大的記憶體使用量。80386有32位位址匯流排,所以它的定址能力就是4g.暫存器 通用暫存器,段暫存器,ax暫存器 通用暫存器,存放資料。高位位元組ah,低位位元組al。實體地址表示方法 位址加法器,...