標(biāo)志寄存器的概念
首先說(shuō)一下標(biāo)志寄存器的概念。在8086cpu中標(biāo)志寄存器都是16位的,而其中存儲(chǔ)的信息被稱為程序狀態(tài)字(一段包含系統(tǒng)狀態(tài)的內(nèi)存或者是硬件區(qū)域)。標(biāo)志寄存器既然是寄存器,那么它也是用來(lái)存儲(chǔ)信息的,只是它存儲(chǔ)信息的方式與其他的寄存器不同而已。其他的寄存器是一個(gè)寄存器包含一個(gè)信息,而標(biāo)志寄存器則可以包含多個(gè)信息。而標(biāo)志寄存器之所以可以存儲(chǔ)多個(gè)信息,是因?yàn)樗拇鎯?chǔ)方式。在標(biāo)志寄存器中,信息是被存儲(chǔ)在位中的。標(biāo)志寄存器中的每一個(gè)位都可以代表特定的信息。
這是我在網(wǎng)上找的一個(gè)標(biāo)志寄存器的示意圖。通過(guò)這張圖片我們可以知道在標(biāo)志寄存器中,哪些是用到的,哪些是沒(méi)用到的。我就不在贅述了。接下來(lái)我們看一下這些位的具體含義。
CF(carry flag):進(jìn)位標(biāo)志位。這個(gè)位是在進(jìn)行無(wú)符號(hào)數(shù)運(yùn)算的時(shí)候用到的。一般情況下,這個(gè)位記錄了進(jìn)行無(wú)符號(hào)運(yùn)算的時(shí)候,運(yùn)算結(jié)果的最高有效位向更高位的進(jìn)位值,或從更高位的借位值。注意的是,這里的進(jìn)位與借位,都是相對(duì)于二進(jìn)制而言的。下面我們?cè)僬乙粡垐D來(lái)加深下理解。
PF(parity flag):奇偶標(biāo)志位。這個(gè)位的判斷需要我們將結(jié)果轉(zhuǎn)為二進(jìn)制來(lái)看,如果結(jié)果的低8位中有偶數(shù)個(gè)1,就將PF的值置1;如果是奇數(shù)個(gè)1,就置0。要注意的是一定是結(jié)果的低8位。
PF,奇偶標(biāo)志位,flag的第2位記錄相關(guān)指令執(zhí)行后,其結(jié)果所有bit位中1的個(gè)數(shù)是否為偶數(shù),若為偶數(shù),則PF=1;若為奇數(shù),PF=0.
執(zhí)行
mov al,00000000b
add al,00000111b
mov al,00000000b
add al,00000011b
驗(yàn)證:
AF(auxiliary flag):輔助進(jìn)位標(biāo)志位。這個(gè)位用的不多,所以書上也沒(méi)有講,我就簡(jiǎn)單的查了一下資料。這個(gè)位表示加減法做到一半時(shí)有沒(méi)有形成進(jìn)位/借位,如果有則AF=1。這么說(shuō)誰(shuí)都聽不懂,所以我們舉個(gè)例子來(lái)說(shuō)下。例如 MOV AL,00001110 MOV BL,00001000 ADD AL,BL 最后結(jié)果為AL=00010110這就是低四位向高四位進(jìn)位。反之在減法中第三位不夠減向第四位借位(注意數(shù)位是從第0位開始數(shù)的)叫低四位向高四位借位!像前面的AL中前四位為高四位,后四位為低四位。例如,當(dāng)兩個(gè)字節(jié)相加時(shí),如果從低4位向高4位有進(jìn)位時(shí),則AF=1。
ZF(zero flag):零標(biāo)志位。這個(gè)位就很簡(jiǎn)單了,判斷結(jié)果是不是0。如果結(jié)果為0,就置1;不為0,就置0。
執(zhí)行
mov ax,1
sub ax,1
mov ax,2
sub ax,1
可以看到 當(dāng)計(jì)算ax結(jié)果為0時(shí),ZF是ZR=1;結(jié)果為1(不為0)時(shí),ZF是NZ=0.
SF(sign flag):符號(hào)標(biāo)志位。既然是符號(hào)標(biāo)志位,就是對(duì)有符號(hào)數(shù)據(jù)來(lái)說(shuō)的。如果結(jié)果為負(fù),就置1;結(jié)果為正,就置0。
SF,符號(hào)標(biāo)志位,flag的第7位,記錄相關(guān)指令執(zhí)行后,其結(jié)果是否為負(fù),若為負(fù),則SF=1;若為非負(fù),SF=0.
執(zhí)行:
mov al,10000001b
add al,1
mov al,10000000b
add al,01111111b
驗(yàn)證:
當(dāng)SF=1即為NG,表示:若指令進(jìn)行有符號(hào)數(shù)運(yùn)算,則結(jié)果為負(fù)
當(dāng)SF=0即為PL,表示: 若指令進(jìn)行有符號(hào)數(shù)運(yùn)算,則結(jié)果為非負(fù)
TF(timer overblow flag):定時(shí)器溢出標(biāo)志。這個(gè)位主要是用來(lái)在debug中進(jìn)行-t指令時(shí)使用的。當(dāng)cpu在執(zhí)行完一條指令后,如果檢測(cè)到TF位的值為1,則產(chǎn)生單步中斷,引發(fā)中斷過(guò)程。通過(guò)這個(gè)位,我們就可以在debug中對(duì)程序進(jìn)行單步跟蹤。
IF(interrupt flag):中斷允許標(biāo)志位。當(dāng)IF=1時(shí),cpu在執(zhí)行完當(dāng)前指令后響應(yīng)中斷,引發(fā)中斷過(guò)程;當(dāng)IF=0時(shí),則不響應(yīng)可屏蔽中斷。
DF(direction flag):方向標(biāo)志位。在串處理指令中,控制每次操作后,si(指向原始偏移地址)、di(指向目標(biāo)偏移地址)的增減。當(dāng)DF=0時(shí),每次操作后,si、di遞增;DF=1時(shí),每次操作后,si、di遞減。我們可以使用cld指令將DF的值置為0,使用std指令將DF的值置為1。DF需要與rep、movsb等指令配合使用。
OF(overflow flag):溢出標(biāo)志位。這個(gè)位是用來(lái)判斷有沒(méi)有溢出的。注意溢出這個(gè)概念只對(duì)于有符號(hào)數(shù)據(jù)而言,就如同進(jìn)位只對(duì)于無(wú)符號(hào)數(shù)據(jù)而言。當(dāng)OF=0時(shí),說(shuō)明沒(méi)有溢出;當(dāng)OF=1時(shí),說(shuō)明溢出了。
OF,溢出標(biāo)志位,flag的第11位,超出機(jī)器所能表示的范圍稱為溢出若發(fā)生了溢出OF=1,若沒(méi)有則OF=0
比如對(duì)于8位有符號(hào)數(shù)據(jù),機(jī)器能表示范圍是 -128~127;對(duì)于16位有符號(hào)數(shù)據(jù),范圍是 -32768~32767
執(zhí)行:
mov al,64
add al,64
mov al,63
add al,64
驗(yàn)證:
下面有幾個(gè)串傳送指令
格式:movsb
功能:執(zhí)行movsb指令相當(dāng)于進(jìn)行下面幾步操作。
1) ((es)*16+(di)) = ((ds)*16+(si))
2) 如果df=0 則 (si)=(si)+1 (di)=(di)+1
如果df=1則: (si)=(si)-1 (di)=(di)-1
當(dāng)然也可以傳送一個(gè)字
格式:movsw
功能:將ds:si指向的內(nèi)存單元中的字送入es:di中,然后根據(jù)標(biāo)志寄存器df位的值,將si和di遞增2或遞減2.
movsb和movsw進(jìn)行的是串傳送操作中的一個(gè)步驟,一般來(lái)說(shuō),movsb和movsw都和rep配合使用,格式如下:
rep movsb
rep功能:根據(jù)cx的值,重復(fù)執(zhí)行后面的串傳送指令。由于每執(zhí)行一次movsb指令si和di都會(huì)遞增或遞減指向后一個(gè)單元或前一個(gè)單元,則rep movsb就可以循環(huán)實(shí)現(xiàn)(cx)個(gè)字符的傳送。
8086CPU提供下面兩條指令對(duì)df位進(jìn)行設(shè)置。
cld指令: 將標(biāo)志寄存器的df位置0
std指令: 將標(biāo)志寄存器的df位置1
1)編程,用串傳送指令,將data段中的第一個(gè)字符串復(fù)制到它后面的空間中。
data segment
db ‘welcome to masm!’
db 16 dup (0)
data ends
code segment
mov ax,data
mov ds,ax
mov si, 0
mov es,ax
mov di,16
mov cx,16
cld
rep movsb
code ends
end
2)編程,用串傳送指令,將F000段中的最后16個(gè)字符復(fù)制到data段中。
data segment
db 16 dup (0)
data ends
code segment
mov ax,0f000h
mov ds,ax
mov si, 0ffffh
mov ax,data
mov es,ax
mov di, 15
mov cx, 16
std
rep movsb
code ends
end
非常好我支持^.^
(1) 100%
不好我反對(duì)
(0) 0%
相關(guān)閱讀:
- [電子說(shuō)] 學(xué)習(xí)STM32F103的ADC功能 2023-10-24
- [電子說(shuō)] 學(xué)習(xí)STM32F103的DAC功能 2023-10-24
- [電子說(shuō)] 學(xué)習(xí)STM32F103的定時(shí)器功能 2023-10-24
- [電子說(shuō)] STM32基礎(chǔ)知識(shí):定時(shí)器的PWM輸出功能 2023-10-24
- [電子說(shuō)] 既然ODR能控制管腳高低電平,為什么還需要BSRR寄存器呢? 2023-10-24
- [電子說(shuō)] ARM系列-P Channel簡(jiǎn)析 2023-10-24
- [控制/MCU] 基于STM32F429芯片的單片機(jī)芯片內(nèi)存映射圖 2023-10-23
- [電子說(shuō)] ICCV 2023 | 面向視覺(jué)-語(yǔ)言導(dǎo)航的實(shí)體-標(biāo)志物對(duì)齊自適應(yīng)預(yù)訓(xùn)練方法 2023-10-23
( 發(fā)表人:李倩 )