彙編語言第三版(王爽著)(第11章.標誌寄存器)

標誌寄存器的作用:

  1. 用來存儲相關指令的某些執行結果
  2. 用來爲CPU執行相關指令提供行爲依據
  3. 用來控制CPU的相關工作方式
    其中存儲的信息通暢被稱爲程序狀態字(PSW)
    簡稱flag
    flag 和其他寄存器不一樣,其他寄存器是用來存放數據的,都是整個寄存器具有一個含義。
    而flag寄存器是按位起作用的。也就是說,它的每一位都有專門的含義,記錄特定的信息。
    flag寄存器的結構
    0 CF
    2 PF
    4 AF
    6-11 ZF SF TF IF DF OF
    //CPA ZS TI DO

11.1 6 ZF標誌 (zero 否,是不是0)

如果是0 zf=1,如果不是0 zf=0
大多運算指令(算術運算,邏輯運算)都是影響標誌寄存器的。大多數傳送指令是不影響標誌寄存器的
運算指令:add sub mul div dec inc or and
傳送指令 mov push pop

11.2 2 PF 標誌 (判斷所有位中,1的個數是不是偶數)

如果是偶數,則PF爲1,否則爲0
比如
mov al,1
add al,10
結果爲00001011 則pf爲0

11.3 7 SF標誌(是否爲負)

是負 sf=1

11.4 0 CF標誌(Come in進來)

CF是進位標誌位。
在進行無符號運算的時候,它記錄了運算結果的最高有效位向更高位的進位,或借位。

11.5 11 OF標誌(out 溢出)

!!一定要記住CF是對無符號運算的進位或借位。而OF是看有符號運算是否溢出

11.6 adc 指令

adc是帶進位加法指令
它利用了CF位上記錄的進位值
指令格式: adc 操作對象1,操作對象2
功能: 操作對象1=操作對象2+操作對象1+CF
加法分兩步:1.低位相加2.高位相加加上低位產生的進位
下面的指令和add ax,bx具有相同的結果
add al,bl
adc ah,bh
adc和add相配合就可以對更大的數據進行加法運算
編寫一個子程序,對兩個128位數據進行相加,結果存在第一個數的內存空間中
分析一個字節8位,一個字16位,所以128位數據需要8個字的空間
程序如下:
add128:push ax
push cx
push si
push di
sub ax,ax ;將cf置爲0
mov cx,8
s:mov ax,[si]
adc ax,[di]
mov [si],ax
inc si
inc si
inc di
inc di

loop s
pop di
pop si
pop cx
pop ax
ret
若把加粗處改爲add指令,將影響進位。inc和loop不影響cf的值。

11.7 sbb 指令

帶錯位減法指令,利用CF上的借位值
指令格式:sbb 操作對象1,操作對象2
功能:操作對象1=操作對象1+操作對象2-CF
比如計算 003E1000H-00202000H,程序如下
mov bx,1000h
mov ax,003eh
sub bx,2000h
sbb ax,0020h

11.8 cmp指令

cmp是比較指令,cmp的功能相當於減法指令,只是不保存結果。
同add,sub指令一樣,CPU在執行cmp指令的時候,也包含兩種含義,進行無符號和進行有符號數運算
當of=0時,邏輯上真正結果的正負=實際結果的正負
當of=1時,實際結果爲負,邏輯上真正的結果爲正;實際結果爲正,邏輯上真正的結果爲負。

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

轉移 指的是它能夠修改IP,而 條件 指的是它可以根據某種條件,決定是否修改IP
所有條件轉移指令的轉移位移都是[-128,127]
cmp通常和轉移指令,相配合使用。
cmp分兩種:
1.有符號 影響sf,of,zf
2.無符號 影響zf,cf

下面是常用的根據無符號數的比較結果進行轉移的條件轉移指令。
je(zf=1) jne(zf=0) jb(cf=1) jnb(cf=0) ja(cf=0且zf=0) jna(zf=1或cf=1)
e:equal 相等
n:not 不相等
b:below
a:above
這些指令可以不與cmp配合使用

11.10 DF標誌和串傳送指令

DF:方向標誌位。在串處理中,控制每次操作後si和di的遞增或遞減
df=1 遞減
df=0 遞增
串傳送指令:movsb movsw
一般和rep配合使用
cld 置零 std置1作用
正向傳送:
mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
mov cx,16
cld
rep movsb
(相當於 mov es:[di],byte ptr ds:[si])
逆向傳送:
mov ax,0f000h
mov ds,ax
mov si,0ffffh
mov ax,data
mov es,ax
mov di,15
mov cx,16
std
rep movsb

11.11 pushf和popf

將標誌寄存器壓棧和出棧。

11.12 標誌寄存器在Debug中的表示

在寄存器的後面顯示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章