1. 程式人生 > >彙編筆記_第十一章

彙編筆記_第十一章


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)