1. 程式人生 > >第012課 彙編-af,zf,sf,of及標誌位操作指令

第012課 彙編-af,zf,sf,of及標誌位操作指令

AF,ZF,SF,OF
標誌傳送指令


內容綱要
1.AF,ZF,OF
2.LAHF,SAHF
3.PUSHF,POPF

4.PUSHFD,POPFD

5.STC,CLC,STD,CLD,CMC

6.32位,16位和8位暫存器


詳細內容
1.AF
AF(Auxiliary_Flag):輔助進位標誌位。運算過程中看最後四位,不論長度為多少。最後四位向前有進位或者借位,AF=1,否則AF=0;

2.ZF
ZF(Zero_FLag):零標誌位。運算結果為零則ZF=1,否則ZF=0;

3.SF
SF(Sign_Flag):符號標誌位。根據具體的長度,指令執行之後將該長度的最高位的值賦給SF

4.OF
OF(overflow):溢位標誌位。
mov ds:[0x0012ff40],0x33
add ds:[0x0012ff40],0x4f  //of = 1,sf = 1,af = 1,pf=1,cf = 0
兩個運算元做運算,只要結果在-128~127中,of = 0,否則of=1(一個位元組),長度改變,範圍也隨之發生改變.

5.LAHF,SAHF
LAHF(Load Flag to AH):將EFL暫存器的最後一個位元組放到AH暫存器中
SAHF(Store AH into Flags):將AH的內容放入EFL的最後一個位元組,其中需要注意的是第二位預設為1,第4、6位為0.

6.PUSHF,POPF

16位,PUSHF是將暫存器中的值(後16位寫入記憶體),

POPF是將記憶體中16位數值寫入EFL的後兩個位元組,還是要注意標誌位預設值的問題


7.PUSHFD,POPFD
32位,PUSHFD是將暫存器的值寫入記憶體,而POPFD是將記憶體中的32位數值寫入EFL,具體是哪一記憶體單元值由ESP決定。


8.STD,CLD,STC,CLC,CMC

STD(SeT Direction flag):格式如下:

STD

該條指令使方向標誌DF為1.

CLD(Clear Direction flag)格式如下:

CLD

該條指令使方向標誌DF為0.

STC,CLC同上。

CMC(CoMplement Carry flag)格式如下:

CMC

該條指令使進位標誌取反。


8.通用暫存器
32位: EAX  ECX  EDX  EBX  ESP  EBP  ESI  EDI
16位:AX   CX   DX   BX   SP   BP   SI   DI
8位: AL   CL   DL   BL   AH   CH   DH   BH


課堂練習:
1.練習各標誌位的值的改變
mov DWORD PTR ds:[0x0012ff40],0x3333
sub DWORD PTR ds:[0x0012ff40],0x3f  //af=1

mov DWORD PTR ds:[0x0012ff40],0x3333
add DWORD PTR ds:[0x0012ff40],0x3f  //af=1

mov WORD ptr ds:[0x0012ff40],0x3333
sub WORD ptr ds:[0x0012ff40],0x3f  //af=1

mov ds:[0x0012ff40],0x33
sub ds:[0x0012ff40],0xf3 //af=0

2.LAHF,SAHF,PUSHF,POPF,PUSHFD,POPFD,STD,CLD,STC,CLC,CMC