匯編第六日
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!!!
匯編第六日