1. 程式人生 > >關於組合語言中cmp指令的小筆記

關於組合語言中cmp指令的小筆記

cmp是比較指令,cmp的功能是相當於減法指令,只是不儲存結果.cmp指令執行後,將對標誌暫存器產生影響.其他相關指令通過識別這些被影響的標誌暫存器來得知比較結果.

cmp指令格式: cmp  操作物件1,操作物件2

功能: 計算操作物件1 - 操作物件2 但不儲存結果,僅僅根據計算結果對標誌暫存器進行設定.比如cmp ax,ax  是做ax - ax 的運算,結果為0,但並不在ax中儲存,僅影響flag的相關各位.

指令執行後: zf = 1,pf = 1,sf = 0,cf = 0,of = 0;

下面的指令:

   mov ax,8

   mov bx,3

   mov ax,bx

執行後: (ax)= 8,zf = 0,pf = 1,sf = 0, cf = 0, of = 0

如果 ax = bx 則 ax - bx = 0 ,所以 : zf = 1 

如果 ax != bx 則ax - bx != 0,所以 : zf = 0

如果ax < bx 則ax - bx 將產生錯位,所以 : cf = 1

如果 ax >= bx 則 ax - bx 將不必借位,所以 : cf = 0

如果ax > bx 則 ax - bx 既不必借位,結果又不為0, 所以 : cf = 0 並且 zf = 0

如果 ax <= bx 則ax - bx 既可能借位,結果可能為0,所以 :  cf = 1 或 zf =1

檢測比較結果的條件轉移指令

je     等於則轉移         zf=1

jne   不等於則轉移     zf=0

jb      低於則轉移        cf=1

jnb    不低於則轉移    cf=0

ja       高於則轉移        cf=0且zf=0

jna     不高於則轉移    cf=1或zf=1

e : equal

ne : not equal

b: below

nb : not below

a : above

na : not above

程式設計: 統計data段中數值小於8的位元組的個數,用ax儲存統計結果

        mov  ax,data 

        mov  ds,ax

        mov  ax,0                                ;初始化累加器

        mov  bx,0                                ;ds:bx指向第一個位元組

        mov  cx,8

    s : cmp byte ptr [bx] , 8              ;和8進行比較

         jnb next                                  ;如果不小於8轉到next,繼續迴圈

         inc  ax                                     ;如果小於8就將計數值加1

next:inc  bx 

        loop s

程式執行後: ax = 2

還有疑問的可以去檢視一下指令手冊,講解的比較細緻