標(biāo)志寄存器一共16位,一共只有0,2,4,6,7,8,9,10,11位有意義
分別是CF(carry),PF(parity),AF,ZF(zero),SF(sign),TF(中斷的單步執(zhí)行標(biāo)志,不進行詳細介紹),IF(屏蔽外中斷標(biāo)志,不進行詳細介紹),DF(direction),OF(overflow)
補充:9個有效標(biāo)志位中,有3個是控制標(biāo)志位(DF,IF,TF),6個記錄位。
1.ZF位
零標(biāo)志位,記錄上一次運算相關(guān)指令執(zhí)行結(jié)束后,其結(jié)果是否為0
ZF = 0:上一次運算指令執(zhí)行結(jié)果不為0
ZF = 1:上一次運算指令執(zhí)行結(jié)果位0
2.PF標(biāo)志位
奇偶標(biāo)志位,記錄相關(guān)指令執(zhí)行后其結(jié)果的所有bit位中,1的個數(shù)為奇數(shù)還是偶數(shù)
PF = 0:1的個數(shù)為奇數(shù)
PF = 1:1的個數(shù)為偶數(shù)
3.SF標(biāo)志位
符號標(biāo)識位,記錄相關(guān)指令執(zhí)行以后,其結(jié)果是否為負(fù)數(shù)
SF = 0:結(jié)果為非負(fù)數(shù)
SF = 1:結(jié)果為負(fù)數(shù)
注意:SF寄存器只在有符號數(shù)計算中有意義,若CPU進行的是無符號計算,則雖然SF的值也會受到影響,但是其值并沒有意義
4.CF標(biāo)志位
進位(借位)標(biāo)志位,記錄相關(guān)指令執(zhí)行以后,其結(jié)果(無符號數(shù))是否進位
CF = 0:結(jié)果沒有進位(借位)
CF = 1:結(jié)果存在進位(借位)
注意:CF寄存器針對于的是無符號數(shù)的進位
5.OF標(biāo)志位
溢出符號位,記錄相關(guān)指令執(zhí)行以后,其結(jié)果(有符號數(shù))是否溢出
OF = 0:沒有發(fā)生溢出
OF = 1:發(fā)生了溢出
注意:OF溢出是指的有符號數(shù)的溢出,而CF指的是無符號數(shù)的進位,兩者之間相互獨立, 沒有關(guān)系
以上標(biāo)志寄存器衍生指令:
- ADC指令:執(zhí)行加法的時候加上CF的值;
所以可以利用add,adc指令執(zhí)行高位數(shù)據(jù)的加法 - SBB指令: 執(zhí)行減法時減去CF(帶借位的減法指令)
- CMP指令:cmp 1,2 代表的是執(zhí)行1-2的運算,但是并不保存結(jié)果值,只根據(jù)結(jié)果調(diào)整標(biāo)志位的值。cmp指令伴隨條件跳轉(zhuǎn)指令一同使用,可以達到跳轉(zhuǎn)的效果
cmp指令修改標(biāo)志寄存器的值,搭配條件跳轉(zhuǎn)指令(je,jne,jb,jnb,ja,jna等)根據(jù)cmp修改的標(biāo)志寄存器CF和ZF的值決定是否跳轉(zhuǎn)
6.DF標(biāo)志位
方向標(biāo)志位,用于串傳送指令中,作用于SI和DI寄存器
DF = 0:SI和DI加一
DF =1:SI和DI減一
注意:修改DF的指令為:cld(將DF置0,用于遞加);std(將DF置1,用于遞減)
以上兩個指令要配合movsb(movsw)指令使用達到串傳送效果
- movsb指令是將DS:SI位置處的字節(jié)信息傳送到ES:DI位置中去,然后再根據(jù)DF寄存器的值,對SI和DI進行修改(movsw功能幾乎相同,只不過是以字為單位進行傳送)
- rep movsb指令,相當(dāng)于
S: movsb
loop
根據(jù)CX的值,重復(fù)執(zhí)行串傳送指令
示例代碼:
題目:利用串傳遞指令,將F000H段中的最后16個字符復(fù)制到data段中。
assume cs:code, ds:data
data segment
db 16 dup (0)
data ends
code segment
start:
mov ax,0F000H
mov ds,ax
mov si,0FFFFH ;段的最后一個字節(jié)
mov ax,data
mov es,ax
mov di,15
mov cx,16
std ;設(shè)置DI,SI逆向傳輸數(shù)據(jù)
rep movsb
mov ax,4c00H
int 21H
code ends
start end
7.標(biāo)志寄存器的壓棧和出棧:PUSHF和POPF
- 將標(biāo)志寄存器(16位)壓棧PUSHF
- 將標(biāo)志寄存器出棧POPF
以上兩個指令提供了一種直接訪問(修改)標(biāo)志寄存器的方法
實驗說明:
將數(shù)據(jù)段中以0結(jié)尾的字符串的所有小寫字母變?yōu)榇髮懽帜?br>
注意!進行轉(zhuǎn)化的是小寫字母,而不是其他字符
參考程序:
assume cs:code
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
code segment
start: mov ax,datasg
mov ds,ax
mov si,0
call letterc
mov ax,4c00H
int 21H
letterc: mov cl,ds:[si]
mov ch,0
jcxz done ; 判斷取到的字符是否為0
cmp cl,97
jb next ; 小于97則跳轉(zhuǎn)
cmp cl,122
ja next ; 大于122則跳轉(zhuǎn)
and cl,11011111b
mov ds:[si],cl
next: inc si
loop letterc
done: ret
code ends
end start
實驗結(jié)果:
實驗總結(jié):
(1)注意靈活運用條件跳轉(zhuǎn)指令,找出那些小寫字母
(2)小寫字母轉(zhuǎn)換為大寫字母可以and一個二進制數(shù)11101111(其ASCii碼只在第五位有差別)