標誌寄存器flag
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
0 0 0 0 of df if tf sf zf 0 af 0 pf 0 cf
ZF是flag的第6位,零標誌位,判斷結果是否為0,結果為0,ZF=1
PF是flag的第2位,奇偶標誌位,運算結果二進制數中1的個數為偶數,PF=1
SF是flag的第7位,符號標誌位,有符號數 運算結果為負數,SF=1
CF是flag的第0位,進位標誌位,無符號數 運算結果有進/借位,CF=1
OF是flag的第11位,溢出標誌位,有符號數 運算結果溢出,OF=1
DF是flag的第10位,方向標誌位,DF=0 每次操作後 si,di遞增
DF=1 每次操作後 si,di遞減
TF是flag的第8位,TF=1,產生單步中斷,引發中斷過程
IF是flag的第9位,IF=1,CPU響應中斷,引發中斷過程
IF=0,不響應可屏蔽中斷
add、sub、mul、div 、inc、or、and等運算指令影響flag
mov、push、pop等傳送指令對flag沒影響
abc 帶位加法指令,利用CF位上記錄的進位值
abc ax,bx 實現功能(ax)=(ax)+(bx)+CF
sbb 帶位減法指令,利用CF位上記錄的借位值
sbb ax,bx 實現功能(ax)=(ax)-(bx)-CF
cmp 比較指令,相當於減法指令,不保存結果,隻影響flag相關各位
cmp ax,bx 如果(ax)=(bx), 則 zf=1
如果(ax)≠(bx), 則 zf=0
如果(ax)<(bx), 則 cf=1
如果(ax)≥(bx), 則 cf=0
如果(ax)>(bx), 則 cf=0且zf=0
如果(ax)≤(bx), 則 cf=1或zf=1
如果因為溢出導致了實際結果為負,那麼邏輯上真正的結果必然為正
如果因為溢出導致了實際結果為正,那麼邏輯上真正的結果必然為負
cmp指令和條件轉移指令配合使用
指令 含義 檢測的相關標誌位
je 等於則轉移 zf=1
jne 不等於則轉移 zf=0
ja 高於則轉移 cf=0且zf=0
jb 低於則轉移 cf=1
jna 不高於則轉移 cf=1或zf=1
jnb 不低於則轉移 cf=0
[…]是閉區間,包括兩端點的值
(…)是開區間,不包括兩端點的值
DF標誌和串傳送指令
DF 方向標誌位,在串處理指令中,控制每次操作後si、di的增減
df=0 每次操作後si、di遞增
df=1 每次操作後si、di遞減
movsb:
相當於mov es:[di],byte ptr ds:[si]
如果 df=0 如果 df=1
inc di dec di
inc si dec si
movsw:
相當於mov es:[di],word ptr ds:[si]
如果 df=0 如果 df=1
add si,2 sub si,2
add di,2 sub di,2
movsb或movsw和rep配合使用,格式如下:
rep movsb
相當於
s:movsb
loop s
rep的作用是根據cx的值,重複執行rep後面的串傳送指令
cld 將標誌寄存器中的DF位置0,(配合movsb,則是正向傳送)
std 將標誌寄存器中的DF位置1,(配合movsb,則是反向傳送)
pushf 標誌寄存器的值壓棧
popf 標誌寄存器的值出棧
標誌位在debug中的表示
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=**** ES=**** SS=**** CS=**** IP=0100 NV UP EI PL NZ NA PO NC
flag of df sf zf pf cf
值為1的標記 OV DN NG ZR PE CY
值為0的標記 NV UP PL NZ PO NC
確定補碼:
Xh為8位,X∈(80h,ffh),則Xh是(Xh-256)的補碼
Xh為16位,X∈(8000h,ffffh),則Xh是(Xh-65535)的補碼