關於組合語言中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
還有疑問的可以去檢視一下指令手冊,講解的比較細緻