《組合語言》王爽,學習筆記(標誌暫存器下)

weixin_34292287發表於2016-04-02

cmp指令

cmp是比較指令,相當於減法指令,只是不儲存結果,cmp執行之後只會對標誌暫存器產生影響,cmp指令格式:cmp 運算元1,運算元2。

通過cmp指令可以很輕易的比較出兩個資料的大小,舉幾個例子:

(1)如果兩個資料相等,那麼他們相減之後必定是0,那麼標誌位ZF的值就是1。

(2)如果是無符號數,運算元1比運算元2大,那麼標誌位CF就為0,因為不會產生借位,同理,CF位為1,表示2比1大,需要借位。

(3)如果是有符號數,觀察標誌位SF與OF即可,SF表示了最後的結果是正是負,而OF表示了這個結果是否是由溢位而得到的,因為SF只記錄實際結果的最高位,這不能說明這是在邏輯上所得的正確結果,而OF可以表示這個實際結果是否正確。

inc,dec指令

一開始介紹add,sub指令之時就提到了inc和dec指令,他們分別對應自增和自減操作,那時特提到了,inc和dec與add,sub之間有一點的不同,就是inc與dec不影響標誌暫存器的值,所以在一些特定的場合,你需要不干涉標誌暫存器,但是要改變地址的話,就只能多用幾個inc指令了。

條件跳轉指令

由於cmp指令的存在,我們可以比較兩個資料的大小,也就出現了條件跳轉指令,和C語言中的if語句很類似。

je                等於則轉移(ZF = 1)

jne              不等於則轉移(ZF = 0)

jb                小於則轉移,無符號數(CF = 1)

jnb              不小於則轉移,無符號數(CF = 0)

ja                大於則轉移,無符號數(CF = 0 && ZF = 0)

jna              小於等於則轉移,無符號數(CF = 1 || ZF = 1)

這些一些無符號數常用的條件轉移語句。

DF與串傳送指令

DF是標誌暫存器的第10位,方向標誌位,他與串傳送指令(movsb,movsw)相關,控制每次操作後的SI,DI的增減。

DF = 0,正向,每次操作後SI,DI遞增,DF = 1,反向,每次操作後SI,DI遞減。

串傳送指令按照一次傳送的位元組數分為兩種,一次傳送一個位元組,movsb,一次傳送一個字,movsw。

串傳送指令是將DS:SI指向的記憶體單元中的內容傳入ES:DI中,根據DF來增減SI,DI,用CX來控制次數。

pushf和popf

pushf的功能是將標誌暫存器的值入棧,popf是從棧中彈出資料送入標誌暫存器中,這兩個指令不需要運算元,pushf也是在呼叫子程式的時候需要做的一步,popf在程式結束的時候恢復標誌暫存器。

相關文章