1. 程式人生 > >匯編第六日

匯編第六日

進位 中斷處理 修改 logs 跳轉 strong flag width 之前

flag寄存器:

技術分享

ZF=1表示計算結果為0,反之

PF = 0表示計算結果二進制表示中1的個數為奇數,反之

SF = 0表示計算結果為正,反之

CF為1,在加法中表明結果出現僅為,在減法中表明結果出現借位,反之

OF = 1表示計算結果溢出,反之

對於無符號數,CPU用CF位記錄計算結果是否產生進位

對於有符號數,CPU用OF位記錄計算結果是否產生溢出

兩者計算結果都用SF位記錄符號

adc指令:帶進位加法指令

例如:

技術分享

sbb指令:帶借位指令

sbb ah 0:(ah) = (ah) - 0 - (cf)

cmp ax, bx指令

實際上執行了(ax)-(bx),但是結果並不保存在ax中

僅僅改變標誌寄存器中相應的位

若 ax=bx 那麽ZF = 1;反之

但是對於cmp ax, bx後發現SF = 1,即結果符號為負,能否說明(ax) < (bx)?

否,例如對於有符號數,ah = 22H(補碼表示34),bh = 0A0H(補碼表示-96)

(ah) - (bh) = 34 - (-96) = 130 = 82H,82H是-126的補碼,所以SF = 1,但是ah明顯大於bh

要考慮OF和SF得兩者大小:

技術分享

1.對於無符號數cmp,要檢查ZF,CF位

2.對於有符號數cmp,要檢查SF,OF,ZF位

對於標識寄存器中位的jmp指令,該指令可以配合cmp(無符號數)使用,cmp比較之前兩對象大小會修改flag寄存器中對應位,之後使用對應的jmp指令實現跳轉

je(e:equal,表明上面cmp兩對象相等):ZF = 1轉移,反之

jne(ne:not equal,表明上面cmp兩對象不相等,下同):ZF = 0轉移,反之

jb:CF = 1轉移,反之

jnb:CF = 0轉移,反之

ja:CF = 1,ZF = 0轉移,反之

jna:CF = 1或ZF = 1轉移,反之

DF標誌位

DF = 0 si和di寄存器內容會遞增1

DF = 1 si和di寄存器內容會遞減1

例如:

movsb指令:以字節單位傳遞數據

實現:((es)*16+(di)) = ((ds)*16+(si))

之後如果DF = 0,di和si內容加1(1個內存單元);反之

movsw指令:以單位傳遞數據

實現:((es)*16+(di)) = ((ds)*16+(si))

之後如果DF = 0,di和si內容加2(2個內存單元);反之

rep movsb指令:

根據cx寄存器中字數,反復執行“movsb” (cx)次,實現(cx)個字節傳遞

cld指令:將DF置為0(clear)

std指令:將DF置為1(set)

pushf指令:將標誌寄存器內容壓棧

popf指令:將棧頂內容彈出標識寄存器

中斷處理程序一直存在內存中,以防止CP隨時調用

iret指令:將返回到中斷前進程執行(將CS:IP出棧,flag出棧)

mov ax, 8 - 4 = mov ax, 4

設置TF = 1將產生單步中斷,CPU將當前進程執行一條指令,之後去執行單步中斷的中斷處理程序(例如debug)

Done!!!

匯編第六日