8086 標誌暫存器
8086 的最後乙個比較重要的暫存器 標誌暫存器
狀態暫存器的三種作用:
@用來儲存相關指令的某些執行結果
@用來為cpu執行相關指令提供行為依據
@用來控制cpu的相關工作方式
zf標誌:
記錄相關指令執行後,其結果是否為0,結果為0,zf = 1,不為0 ,zf = 0.
pf標誌:
奇偶效驗暫存器,記錄相關指令執行後,其中所有位中1 的個數是否為偶數,如果1是偶數,pf = 1,如果為奇數pf = 0.
sf標誌:
記錄相關指令執行後,其結果是否為負,如果為負,sf = 1,否則 sf = 0.在計算機看來,是不分數字的正負的,完全就是靠標誌暫存器的sf 的標誌的,決定正負數的運算。
cf標誌:
進製標誌:一般情況下,再進行無符號運算的時候,它記錄了,運算結果的最高有效位,向更高有效位的進製或者借位。
of標誌:
溢位指令,再進行有符號數運算的時候,如果超過了機器所能表示的範圍稱為溢位。
adc 指令:
adc是帶進製加法指令,它利用了cf位上記錄的進製值。
指令格式:adc 操作物件1,操作物件2
實現功能:(ax) = (ax) + (bx) +cf
這條指令其實就是為了大數相而確定的,例如1ef000h + 201000h,結果高16位ax,低16位bx 中。
mov ax,001eh mov bx,f000h add bx,1000h adc ax,0020h
128位數字加法:
sbb 指令 帶借位減法指令,它利用了cf位上記錄的借位值 指令格式: sbb 操作物件1,操作物件2 實現功能:(ax) = (ax) - (bx) -cf cmp 比較指令 比較指令,其實採用的是減法原理比較的。 首先無符號比較: 很簡單,參考是否借位就能比較了。 cmp ax,bx zf = 1,ax = bx zf = 0,ax != bx cf = 1,ax < bx cf = 0,ax >= bx cf = 0 and zf = 0,ax > bx cf = 1 or zf = 1 ax <= bx 對於有符號數的比較: cmp ah,bh sf = 1 而 of = 0 ah < bh sf = 1 而 of = 1 ah > bh sf = 0 而 of = 1 ah < bh sf = 0 而 of = 0 ah > bh 檢測比較結果的條件轉移指令 轉移指令根據無符號的比較結果進行轉移的條件轉移指令 je 等與則轉移 zf == 1 jne 不等與則轉移 zf = 0 jb 低於則轉移 cf = 0 jnb 不低於則轉移 cf = 0 ja 高與則轉移 cf = 0 zf = 0 jna 不高於則轉移 cf = 1 或 zf = 1 df 標誌 向量標誌位:在串指令中,控制每次操作後si,di的增減。 df = 0 每次操作後 si di 遞增 df = 1 每次操作後si di 遞減 movsb movsw 指令相當於以下的幾步操作: movsb : ((es)*16 + (di)) = ((ds)*16 + (si)) if(df == 0) (si) = (si) +1 (di) = (di)+1 if(df == 1) (si) = (si)-1 (di) = (di)-1 rep :迴圈指令 ,一般和movsb movsw 連用 如何決定df 的值,8086又有兩個新的專門指令 cld : 設定df = 0 std: 設定df = 1 兩個小例子: 將data段中的第乙個字串複製到它後面的空間中add128:
push ax
push cx
push si
push di
sub ax,ax
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
使用傳送指令,將f000h段中的最後16個字元複製到data 段中。mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
mov cx,16
cld
rep movsb
終於最後兩個指令了,好累 pushf 和 popf 著兩個命令是將標誌暫存器壓棧,彈棧送入暫存器標誌中的命令。只有這兩種放方法我們能訪問暫存器。 debug 中暫存器的標誌位: 標誌 1 0 of ov nf df dn up sf ng pl zf zr nz pf pe po cf cy nc 編寫乙個程式將以0結尾的字串小寫變大寫mov ax,0f000h
mov ds,ax
mov si,0ffffh
mov ax,data
mov es,ax
mov di,15
mov cx,16
stdrep movsb
assume cs:code
data segment
db "bejing tian an men",0
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21h
letterc:
push ax
push bx
push cx
push dx
s:mov ax,ds:[si]
cmp ax,0
je f
inc si
cmp al,'a'
jb s
cmp al.'z'
ja s
add al,'a'-'a'
mov ds:[si-1],al
jmp s
f:pop dx
pop cx
pop bx
pop ax
code ends
end start
彙編學習(八)8086彙編拾遺 7
int 中斷指令 使用方式 int n.n 為中斷型別碼,它的功能是引發中斷,n 為引發的中斷號。先寫乙個中斷程式的例子吧,安裝中斷7ch 中斷例程,計算乙個字型數的平方。assume cs code code segment start mov ax,cs mov ds,ax mov si,off...
C 拾遺(六) 複製控制
年前忙了幾天,到現在才算是有空休息下來。先祝大家新年快樂,心想事成 我也會發笑臉o.o 這篇博文主要介紹定義乙個型別的物件時的複製控制方式,這部分內容之前有一定的了解但又淺嘗輒止,始終感覺沒能找到要點。年前又拿起書細細品讀,算是有了一點新的了解。幾天前就想動筆了,一直沒時間,拖到現在。每種型別定義了...
C 程式設計學習筆記 複習 拾遺 5
封裝性 物件的狀態資訊隱藏在物件內部,不允許外部程式直接訪問物件內部資訊,而是通過該類所提供的方法來實現對內部資訊的操作與訪問。類外如何訪問被封裝的成員 private 和 protected成員 通過物件名.公有成員函式 良好的封裝性,考慮角度 將物件的成員變數與實現細節隱藏起來,不允許外部訪問。...