标记寄存器---汇编学习笔记
標記寄存器
CPU內部的寄存器中,有一種特殊的寄存器(對于不同的處理機,個數和結構都可能不同)具有以下3種作用。
(1)用來存儲相關指令的某些執行結果。
(2)用來為CPU執行相關指令提供行為依據。
(3)用來控制CPU的相關工作方式。
這種特殊的寄存器在8086CPU中,被稱為標志寄存器(flag)。如圖:
11.1 ZF標志
flag的第6位是ZF,零標志位。它記錄相關指令執行后,其結果是否為0。如果結果為0那么zf=1;如果不為0,那么zf=0。
運算指令的執行對標志寄存器會產生影響,而傳送指令對標志寄存器不會產生影響。
比如:
mov ax,1 ;不對標志寄存器產生影響 sub ab,1 ;對標志寄存器產生影響,并且zf=111.2 PF標志
flag的第2位是PF,奇偶標志位。它記錄相關指令執行后,其結果的所有bit位中1的個數是否為偶數。如果1的個數為偶數,pf=1,如果為奇數,那么pf=0。
比如:
mov al,1 ;不影響標志寄存器 add al,10 ;影響標志寄存器,并且1的個數為奇數,pf=011.3 SF標志
flag的第7位是SF,符號標志位。它記錄相關指令執行后,其結果是否為負。如果結果為負,sf=1;如果非負,sf=0。
檢測點 11.1
寫出下面指令執行后,ZF、PF、SF等標志位的值。
| sub al,al | 1 | 1 | 0 |
| mov al,1 | 0 | 0 | 0 |
| push ax | —— | —— | —— |
| pop bx | —— | —— | —— |
| add al,bl | 0 | 0 | 0 |
| add al,10 | 0 | 1 | 0 |
| mul al | 0 | 1 | 1 |
11.4 CF標志
flag的第0位是CF,進位標志位。一般情況下,在進行無符號數運算的時候,它記錄了運算結果的最高有效位向更高位的進位值,或從更高位的借位值。如圖(加法器的Ci進位,i=7):
加法減法都會產生借位:
(1)加法比如:
(2)減法比如:
mov al,97H sub al,98H ;執行后:(al)=FFH,CF=1,CF記錄了向更高位進行借位值11.5 OF標志
flag的第11位是OF,溢出標志位。一般情況下,OF記錄了有符號數運算的結果是否發生了溢出。如果發生溢出,OF=1;如果沒有,OF=0。
注意CF和OF的區別:CF是對無符號位數運算有意義的標志位,而OF是對有符號數運算有意義的標志位。
比如:
mov al,0f0h ;有符號為-10,無符號為240 add al,78h ;有無符號都為120 ;進行無符號運算則發生溢出,進行有符號運算將不溢出 ;則cf=1,of=0檢測點 11.2
寫出下面每條指令執行后,ZF、PF、SF、CF、OF等標志位的值。
| sub al,al | 0 | 0 | 0 | 1 | 1 |
| mov al,10h | —— | —— | —— | —— | —— |
| add al,90h | 0 | 0 | 1 | 0 | 1 |
| mov al,80h | —— | —— | —— | —— | —— |
| add al,80h | 1 | 1 | 0 | 1 | 1 |
| mov al,0fch | —— | —— | —— | —— | —— |
| add al,05h | 1 | 0 | 0 | 0 | 0 |
| mov al,7dh | —— | —— | —— | —— | —— |
| add al,0bh | 1 | 1 | 0 | 0 | 0 |
11.6 adc指令
adc是帶進位加法指令,它利用了CF位上記錄的進位值。
指令格式:adc 操作對象1,操作對象2
功能:操作對象1=操作對象1+操作對象2+CF
例子:
編程,計算1EF000H+201000H,結果放在ax(高16位)和bx(低16位)中。
編寫一個子程序,對兩個128位數據進行相加。
名稱: add128
功能:兩個128位數據進行相加。
參數:
*參數1:*ds:si指向存儲第一個數的內存空間,因數據為128位,所以需要8個字單元,由低地址單元到高地址單元一次存放128位數據由低到高的各個字。運算結果存儲在第一個數的存儲空間中。
*參數2:*ds:di指向存儲的第二個數的內存空間。
程序如下:
add128:push axpush cxpush sipush disub ax,ax ;將cf置0mov cx,8 s:mov ax,[si]adc ax,[di]mov [si],axadd si,2add di,2loop spop dipop sipop cxpop axret11.7 sbb指令
sbb是帶借位減法指令,它利用了CF位上記錄的借位值。
指令格式:sbb 操作對象1,操作對象2
功能:操作對象1 = 操作對象1-操作對象2-CF
與adc具有相同的思想設計。
11.8 cmp指令
cmp是比較指令,cmp的功能相當于減法指令,只是不保存結果。cmp指令執行后,將對標志寄存器產生影響。
cmp指令格式:cmp 操作對象1,操作對象2
功能:計算操作對象1-操作對象2但并不保存結果,僅僅根據計算結果對標志寄存器進行設置
比如:cmp ax,ax指令執行后:zf=1,pf=1,sf=0,cf=0,of=0。
執行cmp ax,bx后:
顯然,除了上面那樣還不夠!
還需要sf和of一起作用(記住,of=1溢出導致實際結果與邏輯結果相反):
11.9 檢測比較結果的條件轉移指令
“轉移”指的是它能夠修改IP,而“條件”指的是它可以根據某種條件,決定是否修改IP。
| je | 等于則轉移 | zf=1 |
| jne | 不等于則轉移 | zf=0 |
| jb | 低于則轉移 | cf=1 |
| jnb | 不低于則轉移 | cf=0 |
| ja | 高于則轉移 | cf=0且zf=0 |
| jna | 不高于則轉移 | cf=1或zf=1 |
e:表示equal
ne:表示not equal
b:表示below
nb:表示not below
a:表示above
na:表示not above
檢測點 11.3
(1)補全下面的程序,統計F000:0處32個字節中,大小在[32,128]的數據的個數。
(2)補全下面的程序,統計F000:0處32個字節中,大小在(32,128)的數據個數。
assume cs:codecode segmentstart:mov ax,0f000hmov ds,axmov bx,0mov dx,0mov cx,32s: mov al,[bx]cmp al,32;不高于是<=jna s0cmp al,128;不低于是>=jnb s0;如果在范圍內,則+1inc dxs0:;如果不在范圍內,則+1inc bxloop s code ends end start11.10 DF標志和串傳送指令
flag的第10位是DF,方向標志位。在串處理指令中,控制每次操作后si、di的增減。
格式:movsb
功能:執行movsb指令相當于進行下面幾步操作。
(1)((es)?16+(di))=((ds)?16+(si))((es)?16+(di))=((ds)?16+(si))
(2)如果df=0則:(si)=(si)+1,(di)=(di)+1(si)=(si)+1,(di)=(di)+1
(3)如果df=1則:(si)=(si)?1,(di)=(di)?1(si)=(si)?1,(di)=(di)?1
格式:movsw
功能:將ds:si指向的內存單元中的字送入es:di中,然后根據標志寄存器df位的值,將si和di遞增2或遞減2。
(1)如果df=0則:add si,2 and add di,2
(2)如果df=1則:sub si,2 and sub si,2
格式:rep movsb
功能:根據cx來決定循環次數,n次就是復制n個字節的內容
同理:擁有格式rep movsw
功能:根據cx來決定循環次數,n次就是復制n個字的內容
改變方向的2個指令:
(1)cld指令:將標志寄存器的df置0
(2)std指令:將標志寄存器的df置1
例子:
編程,用串傳送指令,將data段中的第一個字符復制到它后面的空間中。
11.11 pushf和popf
pushf的功能是將標志寄存器的值壓入棧中,而popf是從棧中彈出數據,送入標志寄存器中。pushf和popf,為直接訪問標志寄存器提供了一種方法。
檢測點 11.4
下面的程序執行后:(ax)=?(ax)=?
11.12 標志寄存器在Debug中的表示
在Debug中,標志寄存器是按照有意義的各個標志位單獨表示的。在Debug中,我們可以看到下面的信息。
–
實驗11 編寫子程序
應用舉例:
總結
以上是生活随笔為你收集整理的标记寄存器---汇编学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020程序员人群洞察报告
- 下一篇: 中国搜索引擎市场用户行为洞察2020