彙編筆記_第十一章
title: 彙編筆記_第十一章
date: 2018-12-30 14:00:51
tags:
- 筆記
categories: 組合語言
標誌暫存器
標誌暫存器的作用:
- 用來儲存相關指令的某些執行結果
- 用來為CPU執行相關指令提供行為依據
用來控制CPU的相關工作方式
標誌暫存器由16位,按位起作用,0,2,4,6,7,8,9,10,11有特殊的含義,其他的沒有任何含義;
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OF | DF | IF | TF | SF | ZF | AF | PF | CF |
標誌位的符號
零標誌ZF(Zero flag) | ZR(1) | NZ(0) |
奇偶標誌PF(Parity flag) | PE(1) | PO(0) |
符號標誌SF(Sign flag) | NG(1) | PL(0) |
進位標誌CF(Carry flag) | CY(1) | NC(0) |
溢位標誌OF(Over flow flag) | OV(1) | NV(0) |
方向標誌DF(Direction flag) | DN(1) | UP(0) |
中斷標誌IF(Interrupt flag) | EI(1) | DI(0) |
輔助標誌AF(Auxiliary carry flag) | AC(1) | NA(0) |
零標誌ZF
flag的第6位
它記錄相關指令執行後,
- 結果為0,ZF=1;
- 結果非零,ZF=0;
例如:
mov ax,1
sub ax,1
mov ax,1
and ax,0
指令執行後,結果為0,則ZF=1;
mov ax,2
sub ax,1
mov ax,1
or ax,1
指令執行後,結果為1,則ZF=0;
在8086CPU的指令集中,有的指令的執行事影響標誌暫存器的,例如:add,sub,mul,div,inc,or,and等。有的不影響,如:mov push,pop等傳送指令;
奇偶標誌PF
flag的第二位
它記錄指令執行後,結果的所有二進位制位中1的個數:
- 為偶數,PF=1;
- 為奇數,PF=0;
例如:
mov al,1
add al,10
執行後,PF=0;
mov al,1
or al,10
執行後,PF=1;
符號標誌SF
flag的第七位
它記錄指令執行後:
- 結果為負,SF=1;
- 結果為正,SF=0;
mov al,10000001b
add al,1
執行後SF=1;
進位標誌CF
flag的第0位
在進行 無符號數運算 的時候,它記錄的運算結果的最高有效位項更高位的進位值,或從更高位的借位值;
例:
mov al,98h
add al,al ;(al)=30h,cf=1
add al,al ;(al)=30h,cf=1
溢位標誌OF
flag的第11位
在進行 有符號數運算 的時候,如果結果超出了及其所能表示的範圍稱為溢位;
溢位時OF=1;
注意:
- CF是對 無符號 數運算有意義的標誌位;
- OF是對 有符號 數運算有意義的標誌位;
例如:
mov al,0F0H
add al,78H
CF=1,OF=0;
對於無符號運算,0F0H+78H有進位,CF=1;對於有符號數運算,不發生溢位,OF=0;
例如:
sub al,al
;0h=0000 0000b
;CF=0 OF=0 SF=0 ZF=1 PF=1
mov al,10h
;10h=0001 0000b
;CF=0 OF=0 SF=0 ZF=1 PF=1
add al,90h
;90h=1001 0000b
;ans=1010 0000b
;CF=0 OF=0 SF=1 ZF=0 PF=1
mov al,80h
;80h=1000 0000b
;CF=0 OF=0 SF=1 ZF=0 PF=1
add al,80h
;80h=1000 0000b=128d
;ans=1 0000 0000b=256d
;CF=1 OF=1 SF=0 ZF=1 PF=1
mov al,0FCH
;0FCH=1111 1100b=252d
;CF=1 OF=1 SF=0 ZF=1 PF=1
add al,05h
;05h=0000 0101b
;ans=1 0000 0001b=257d
;CF=1 OF=0 SF=0 ZF=0 PF=0
mov al,7DH
;7DH=0111 1101b=125d
;CF=1 OF=0 SF=0 ZF=0 PF=0
add al,0BH
;0BH=0000 1011b=11d
;ans=1000 1000b=136d
;CF=0 OF=1 SF=1 ZF=0 PF=1
總結:
- CF只看八位二進位制計算後的第九位的值
- OF看計算後的值是否在-128~127內
- SF只看有符號數的第8位
- ZF看8位是否都為0
- PF看8位裡的1的個數
- 標誌暫存器的改變僅在非傳送指令執行時
adc指令
adc是帶進位加法指令,他利用了CF位上記錄的進位值;
格式:
adc 操作物件1,操作物件2
功能:
操作物件1=操作物件2+CF
例如:adc ax,bx
==(ax)=(ax)+(bx)+CF
mov ax,2
mov bx,1
sub bx,ax
adc ax,1
(ax)=(ax)+1+CF=4
mov al,98h
add al,al
adc al,3
(ax)=(ax)+3+CF=30H+3+1=34H
- adc指令和add指令相配合可以對更大的資料進行加法運算;
- adc指令加上CF值的含義由adc之前的指令決定,如果CF是由sub設定,它的含義就是借位值,由add設定就是金為珩值;
編寫一個對兩個128位進位制資料進行相加的子程式:
add128:
push ax
push cx
push si
push di
sub ax,ax ;置CF為零
mov cx,8
s:
mov ax,[si]
adc ax,[si]
mov [si],ax
inc si
inc si
inc di
inc di
;注意這裡只能這麼寫,不能改成add si,2,否則會置CF為零
loop s
pop di
pop si
pop cx
pop ax
sbb指令
sbb是帶借位減法指令,利用了CF位上記錄的借位值
格式:
sbb 操作物件1,操作物件2
功能:
操作物件1=操作物件1-操作物件2-CF
比如:
sbb ax,bx
實現:(ax)=(ax)-(bx)-CF
sbb指令執行後,將對CF進行設定;
cmp指令
cmp是比較指令,功能相當於減法指令,但 不儲存結果;
cmp指令執行後,將對標誌暫存器產生影響;
格式:
cmp 操作物件1,操作物件2
功能:計算操作物件1-操作物件2
不儲存結果,僅僅根據計算結果對標誌暫存器進行設定;
例如:
cmp ax,ax
ZF=1
PF=1
SF=0
CF=0
OF=0
cmp ax,bx
指令執行後,可以根據相關的標誌位的值看出比較的結果:
如果(ax)=(bx) | (ax)-(bx)=0 | ZF=1 |
如果(ax) \(\neq\) (bx) | (ax)-(bx) \(\neq\) 0 | ZF=0 |
如果(ax) \(\lt\) (bx) | (ax)-(bx)將產生借位 | CF=1 |
如果(ax) \(\ge\) (bx) | (ax)-(bx)不必借位 | CF=0 |
如果(ax) \(\gt\) (bx) | (ax)-(bx)既不必借位,結果又不為零 | CF=0並且ZF=0 |
如果(ax) \(\le\) (bx) | (ax)-(bx)既可能借位,結果可能為零 | CF=1或ZF=1 |
cmp與add、sub一樣既可以對無符號數比較也可以對有符號數比較;
不能單純的看SF的值來判斷兩個操作物件的大小,因為溢位的問題;
cmp ah,bh
- 如果SF=1,OF=0:OF=0說明沒有溢位,邏輯上真正的結果的正負和實際結果的相同;SF=1,實際結果為負,所以邏輯上為負,(ah) \(\lt\) (bh);
- 如果SF=1,OF=1:因為溢位導致實際結果為負,那麼邏輯上真正結果為正,說明 (ah) \(\gt\) (bh);
- 如果SF=0,OF=1:因為溢位導致實際結果為正,那麼邏輯上真正的結果必然為負,說明 (ah) \(\lt\) (bh);
- 如果SF=0,OF=0: (ah) \(\ge\) (bh);
條件轉移指令
所有條件轉移指令的轉移位移是[-128,127];
通常和cmp相配合;
cmp指令的比較結果進行轉移的指令分為:
- 根據 無符號整數 的比較結果進行轉移的條件轉移指令,檢測ZF、CF的值;
- 根據 有符號整數 的比較結果進行轉移的條件轉移指令,檢測SF、OF、和ZF的值;
根據無符號數的比較結果進行轉移的條件轉移指令:
指令 | 含義 | 檢測的相關標誌位 |
---|---|---|
je | 等於則轉移 | ZF=1 |
jne | 不等於則轉移 | ZF=0 |
jb | 低於則轉移 | CF=1 |
jnb | 不低於則轉移 | CF=0 |
ja | 高於則轉移 | CF=0,ZF=0 |
jan | 不高於則轉移 | CF=1或ZF=1 |
https://www.cnblogs.com/31415926535x/p/10200283.html
(end)