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