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

2021-06-27 04:37:45 字數 3190 閱讀 6123



條件碼儲存在條件碼暫存器中,用於描述算術和最近邏輯操作的屬性。最常用的條件碼有:

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。實體地址表示方法 位址加法器,...