《新編單片機(jī)原理與應(yīng)用》課件第3章_第1頁(yè)
《新編單片機(jī)原理與應(yīng)用》課件第3章_第2頁(yè)
《新編單片機(jī)原理與應(yīng)用》課件第3章_第3頁(yè)
《新編單片機(jī)原理與應(yīng)用》課件第3章_第4頁(yè)
《新編單片機(jī)原理與應(yīng)用》課件第3章_第5頁(yè)
已閱讀5頁(yè),還剩260頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第3章MCS-51指令系統(tǒng)3.1MCS-51指令系統(tǒng)3.2匯編語(yǔ)言程序結(jié)構(gòu)3.3并行多任務(wù)程序結(jié)構(gòu)及實(shí)現(xiàn)3.4實(shí)用程序舉例指令、指令系統(tǒng)等基本概念以及MCS-51系列單片機(jī)CPU支持的七種尋址方式已在第1章中介紹過(guò),這里不再重復(fù)。本章只介紹MCS-51系列單片機(jī)指令系統(tǒng)及其匯編語(yǔ)言程序設(shè)計(jì)的一些基本概念及注意事項(xiàng)。

MCS-51系列單片機(jī)采用復(fù)雜指令系統(tǒng),共有42種操作碼助記符,支持直接尋址、寄存器尋址、間接尋址、立即數(shù)尋址、變址尋址、相對(duì)尋址、位尋址等七種尋址方式。不同指令操作碼助記符與不同尋址方式之間的組合就構(gòu)成了MCS-51系列單片機(jī)的指令系統(tǒng),共111條。按功能可將這些指令分成數(shù)據(jù)傳送、算術(shù)運(yùn)算、邏輯運(yùn)算、控制轉(zhuǎn)移、位操作等五大類(lèi),每一類(lèi)型的指令中又包含若干條指令。這使許多初學(xué)者無(wú)所適從,3.1MCS-51指令系統(tǒng)感到很難掌握,其實(shí)只要理解每類(lèi)指令的功能、助記符及其支持的尋址方式,即可從MCS-51指令表中找出完成特定操作所需的指令。

本章在介紹MCS-51指令系統(tǒng)時(shí),為了方便敘述,使用下列符號(hào)及約定:

(1)

Rn(n

=

0~7):表示工作寄存器組R7~R0中的某一寄存器。

(2)

@Ri(i

=

0~1):以寄存器R0或R1作間接尋址,表示操作數(shù)地址在寄存器R0或R1中,而“@”是間接尋址標(biāo)識(shí)符。操作對(duì)象是外部RAM或內(nèi)部RAM00~FFH單元(對(duì)僅有前128字節(jié)內(nèi)部RAM的51子系列來(lái)說(shuō),地址范圍是00~7FH)。

(3)

@DPTR:以數(shù)據(jù)指針DPTR(16位)作間接尋址,操作數(shù)在外部RAM中,“@”同樣是間接尋址標(biāo)識(shí)符。

(4)

#data:8位立即數(shù);#data16:16位立即數(shù)。其中“#”是立即數(shù)標(biāo)識(shí)符,常用于初始化內(nèi)部RAM單元、特殊功能寄存器、數(shù)據(jù)指針DPTR。

(5)

direct:8位直接地址,可以是內(nèi)部RAM00~7FH單元字節(jié)地址、內(nèi)部RAM20H~2FH單元中的位地址或特殊功能寄存器的映象地址。

(6)

/bit:在位操作中,取出“bit”位信息后,先取反,然后再參與運(yùn)算,但不改變bit位的值,其中“

/

”是位取反標(biāo)識(shí)符。

(7)

rel:補(bǔ)碼形式的8位偏移地址,范圍在-128~+127。

(8)

rrr:在操作碼中,用于表示R7~R0寄存器的編碼,rrr編碼與寄存器R7~R0之間對(duì)應(yīng)關(guān)系如下:

rrr的編碼(二進(jìn)制)對(duì)應(yīng)的工作寄存器名

000 R0

001 R1

010 R2

011R3

100 R4

101R5

110R6

111 R7

(9)

addr11:11位目標(biāo)地址,用于ACALL(絕對(duì)調(diào)用)和AJMP(絕對(duì)跳轉(zhuǎn))指令中,轉(zhuǎn)移范圍為2KB。

(10)

addr16:16位目標(biāo)地址,用于LCALL和LJMP指令中,轉(zhuǎn)移范圍為64KB。

(11)操作數(shù)中的累加器A寫(xiě)作“A”時(shí),是寄存器尋址;寫(xiě)作“Acc”時(shí)是直接尋址,盡管操作對(duì)象均是CPU內(nèi)的累加器A。對(duì)于支持直接尋址和寄存器尋址的指令來(lái)說(shuō),用A和Acc均可,只是指令的操作碼不同;對(duì)于不支持寄存器尋址的指令(如PUSH、POP),則不能將累加器Acc寫(xiě)作“A”;而對(duì)于不支持直接尋址的指令,如“MOVX”中的“A”也不能寫(xiě)成“Acc”。因此,在匯編語(yǔ)言指令中,須嚴(yán)格區(qū)分累加器A的寫(xiě)法。

(12)累加器A內(nèi)容為nn時(shí),用“A=nn”表示;地址編碼為mm的存儲(chǔ)單元內(nèi)容用“(mm)”表示。

(13)指令執(zhí)行時(shí)間用“機(jī)器周期”度量。例如“MOVA,Rn”指令執(zhí)行時(shí)間為一個(gè)機(jī)器周期,在標(biāo)準(zhǔn)MCS-51中,一個(gè)機(jī)器周期包含12個(gè)振蕩(即時(shí)鐘)周期。如果晶振頻率為12MHz,則振蕩周期T

=

1/12μs,因此一個(gè)機(jī)器周期為12T,即1μs;對(duì)于運(yùn)行在“6時(shí)鐘/機(jī)器周期”的8×C5××2、89C51RX、P89C6××2芯片來(lái)說(shuō),指令機(jī)器周期數(shù)不變,但指令執(zhí)行時(shí)間縮短了一半;又如對(duì)于“2時(shí)鐘/機(jī)器周期”芯片LPC900系列來(lái)說(shuō),指令執(zhí)行時(shí)間只有標(biāo)準(zhǔn)MCS-51的1/6。

(14)指令機(jī)器碼一律用二進(jìn)制書(shū)寫(xiě)。

(15)對(duì)于不常用或約束條件多、容易出錯(cuò)的指令,在指令表中加灰色背景,程序設(shè)計(jì)時(shí)應(yīng)盡量避免使用這類(lèi)指令。3.1.1數(shù)據(jù)傳送指令

數(shù)據(jù)傳送是計(jì)算機(jī)系統(tǒng)中最常見(jiàn),也是最基本的操作。因此,數(shù)據(jù)傳送指令在計(jì)算機(jī)指令系統(tǒng)中占有重要位置,指令條數(shù)也最多,其任務(wù)是實(shí)現(xiàn)計(jì)算機(jī)系統(tǒng)內(nèi)不同存儲(chǔ)單元之間的信息傳送,如圖3-1所示。

圖3-1MCS-51中不同存儲(chǔ)區(qū)之間數(shù)據(jù)傳送示意圖在MCS-51指令系統(tǒng)中,數(shù)據(jù)傳送指令包括:

(1)內(nèi)部RAM、特殊功能寄存器之間的數(shù)據(jù)傳送,這類(lèi)指令用“MOV”作為指令操作碼助記符。

(2)外部RAM(包括擴(kuò)展的并行I/O口、內(nèi)部擴(kuò)展RAM)與累加器A之間的數(shù)據(jù)傳送,這類(lèi)指令用“MOVX”作為指令操作碼助記符。

(3)程序存儲(chǔ)器讀指令,即程序存儲(chǔ)器ROM與累加器A之間數(shù)據(jù)指令,這類(lèi)指令用“MOVC”作為指令操作碼助記符。

(4)堆棧操作指令。

(5)字節(jié)交換指令。數(shù)據(jù)傳送指令一般不影響程序狀態(tài)字寄存器PSW中的標(biāo)志位,只有當(dāng)數(shù)據(jù)傳送到累加器A時(shí),PSW中的奇偶標(biāo)志位P會(huì)改變,原因是奇偶標(biāo)志位P總是體現(xiàn)累加器A中“1”的個(gè)數(shù)的奇偶性。

當(dāng)累加器Acc為0時(shí),Z(零)標(biāo)志置1;反之Z標(biāo)志清0。因此當(dāng)目的操作數(shù)為累加器Acc時(shí),數(shù)據(jù)傳送指令會(huì)影響Z標(biāo)志。

1.內(nèi)部RAM、特殊功能寄存器之間的數(shù)據(jù)傳送

MCS-51內(nèi)部RAM和特殊功能寄存器之間數(shù)據(jù)傳送指令匯編語(yǔ)言格式、機(jī)器碼以及執(zhí)行時(shí)間如表3-1所示。

表3-1內(nèi)部RAM與特殊功能寄存器之間的數(shù)據(jù)傳送指令續(xù)表由表3-1可見(jiàn):

(1)前128字節(jié)內(nèi)部RAM(即00H~7FH)各單元之間,以及特殊功能寄存器(地址分散在80H~0FFH之間)可以直接傳送,不一定要經(jīng)過(guò)累加器A,例如:

MOV32H,90H ;

將特殊功能寄存器90H單元中的(即P1口)內(nèi)容送內(nèi)部RAM32H單元中,

;該指令中目的操作數(shù)(內(nèi)部RAM)、源操作數(shù)(特殊功能寄存器90H單元)

;均使用了直接尋址方式

MOV32H,43H ;將內(nèi)部RAM43H單元內(nèi)容送內(nèi)部RAM32H單元中。

MOVP1,B ;將寄存器B內(nèi)容送P1口鎖存器中

(2)

MCS-51指令系統(tǒng)約定:對(duì)于特殊功能寄存器,只能用直接尋址方式訪(fǎng)問(wèn);對(duì)于高128字節(jié)內(nèi)部只能用寄存器間接尋址方式。因此,在直接尋址方式中,當(dāng)直接地址在80H~0FFH之間時(shí),操作對(duì)象是特殊功能寄存器,而不是內(nèi)部RAM高128字節(jié)。對(duì)于地址編碼在80H~0FFH之間的內(nèi)部RAM,只能通過(guò)寄存器間接尋址訪(fǎng)問(wèn),例如:

MOV@R0,B ;假設(shè)該指令執(zhí)行前,R0內(nèi)容為90H,則該指令的含義是將特殊功能寄存

;器B(地址為0F0H)內(nèi)容送內(nèi)部RAM的90H單元中

(3)對(duì)于低128字節(jié)內(nèi)部RAM,可以用直接尋址方式,也可以用寄存器間接尋址方式,例如:

MOV32H,#23H ;將立即數(shù)23H傳送內(nèi)部RAM的32H單元中,目的操作數(shù)使用了直接尋

;址方式

MOV@R0,#23H ;假設(shè)該指令執(zhí)行前,R0中的內(nèi)容為32H,則該指令的作用與上條指令相

;同,也是將立即數(shù)23H傳送到內(nèi)部RAM的32H單元中,只是目的操作

;數(shù)采用寄存器間接尋址方式

(4)對(duì)于特殊功能寄存器,在指令中無(wú)論是引用寄存器名,還是直接給出寄存器映象地址,結(jié)果都一樣,只是書(shū)寫(xiě)形式不同而已。匯編時(shí)匯編程序自動(dòng)將寄存器名替換為對(duì)應(yīng)的映象地址,如“MOVP1,#23H”與“MOV90H,#23H”完全等價(jià)。

(5)盡管寄存器B是CPU內(nèi)寄存器,但MCS-51指令系統(tǒng)沒(méi)有提供B寄存器的寄存器尋址方式(只有乘法指令例外),例如“MOVB,A”指令中目的操作數(shù)的尋址方式是直接尋址方式,并不是寄存器尋址方式。

(6)在同一指令中,只允許其中一個(gè)操作數(shù)使用寄存器間接尋址方式,因而“MOV@R0,@R1”指令不存在。

也正因如此,內(nèi)部RAM高128字節(jié)之間不能直接傳送,必須通過(guò)累加器A或內(nèi)部RAM作為中介,例如將內(nèi)部RAM的82H單元傳送到內(nèi)部RAM的8FH單元時(shí),可用如下指令實(shí)現(xiàn):

MOVR0,#82H

MOVA,@R0

MOVR0,#8FH

MOV@R0,A

例3.1

在仿真機(jī)上,用單步方式執(zhí)行下列指令,并觀察指令執(zhí)行前后,內(nèi)部RAM有關(guān)單元內(nèi)容和程序狀態(tài)字PSW中Cy、Ac、OV、P等標(biāo)志位的變化,了解數(shù)據(jù)傳送指令對(duì)標(biāo)志位的影響。

MOV30H,#01H ;把立即數(shù)01H傳送到內(nèi)部RAM30H單元

MOVA,30H ;該指令執(zhí)行后累加器A內(nèi)容為01H,含有奇數(shù)個(gè)“1”,因此P標(biāo)志位為1

MOVA,#03H ;該指令執(zhí)行后累加器A內(nèi)容為03H,含有偶數(shù)個(gè)“1”,因此P標(biāo)志位為0

MOV30H,#07H ;執(zhí)行后,30H單元內(nèi)容也是07H,但傳送的目的地址不是累加器A,

;因此標(biāo)志位沒(méi)有變化

2.外部RAM及I/O端口與累加器A之間的數(shù)據(jù)傳送

在MCS-51系統(tǒng)中,由于擴(kuò)展I/O端口與外部RAM統(tǒng)一編碼,即擴(kuò)展I/O端口地址占用外部RAM地址空間的某一單元,因此外部RAM及擴(kuò)展I/O端口的讀寫(xiě)操作指令、操作時(shí)序完全相同。只能通過(guò)累加器A存取外部RAM和擴(kuò)展I/O端口,這類(lèi)指令操作碼助記符為“MOVX”,其中“X”的含義是“eXternal”(外部),指令格式、機(jī)器碼如表示3-2所示。

表3-2外部RAM與累加器A之間的數(shù)據(jù)傳送指令說(shuō)明:

(1)當(dāng)通過(guò)DPTR寄存器間接尋址方式讀寫(xiě)外部RAM及擴(kuò)展I/O端口時(shí),先將16位外部RAM地址或I/O端口地址放在數(shù)據(jù)指針DPTR寄存器中(DPTR寄存器就是為了訪(fǎng)問(wèn)外部RAM而設(shè)置的),然后以DPTR作間接尋址寄存器,通過(guò)累加器A進(jìn)行讀寫(xiě),這時(shí)外部RAM低8位地址A7~A0通過(guò)P0口輸出,高8位地址A15~A8通過(guò)P2口輸出。下面以讀寫(xiě)外部RAM的3FFFH存儲(chǔ)單元為例,介紹外部RAM讀寫(xiě)方法。

MOV DPTR,#3FFFH ;將要讀寫(xiě)的外部RAM存儲(chǔ)單元地址3FFFH以立即數(shù)形式傳送到

;DPTR寄存器中

MOVXA,@DPTR ;將DPTR指定的外部存儲(chǔ)單元(3FFFH)內(nèi)容送累加器A(讀外部

;RAM)

MOVX@DPTR,A;

將累加器A輸出到DPTR指定的外部存儲(chǔ)單元(3FFFH)中(寫(xiě)外部RAM)

(2)當(dāng)通過(guò)R0或R1寄存器間接尋址方式讀寫(xiě)外部RAM或擴(kuò)展I/O端口時(shí),先將外部RAM存儲(chǔ)單元或I/O端口低8位地址放在R0或R1寄存器中,然后以R0或R1作間接尋址寄存器,通過(guò)累加器A進(jìn)行讀寫(xiě),這時(shí)外部RAM低8位地址A7~A0通過(guò)P0口輸出,尋址范圍是256個(gè)存儲(chǔ)單元。在讀寫(xiě)期間P2口處于I/O方式,且P2口鎖存器不變。因此,使用Ri間接尋址方式訪(fǎng)問(wèn)外部RAM具有更大的靈活性:在沒(méi)有外部程序存儲(chǔ)器的情況下,當(dāng)外部RAM容量小于256字節(jié)時(shí),通過(guò)Ri間接尋址讀寫(xiě)外部RAM或擴(kuò)展的I/O端口時(shí),可將P2口作為一般I/O口使用,以增加I/O引腳數(shù)目;當(dāng)外部RAM容量大于256字節(jié)時(shí),以頁(yè)面方式讀寫(xiě)外部RAM時(shí),P2口中沒(méi)有使用的I/O引腳,可以作為輸出引腳使用。下面仍以讀寫(xiě)外部RAM的3FFFH存儲(chǔ)單元為例,介紹通過(guò)Ri間接尋址讀寫(xiě)外部RAM的方法。

MOVP2,#3FH ;

將要讀寫(xiě)的外部RAM存儲(chǔ)單元高8位地址3FH以立即數(shù)方式傳

;送到P2口中(寫(xiě)入P2口鎖存器)

MOVR1,#0FFH ;將要讀寫(xiě)的外部RAM存儲(chǔ)單元低8位地址0FFH以立即數(shù)方式傳送到

;R1寄存器中

MOVXA,@R1;將R1指定的外部存儲(chǔ)單元低8位地址0FFH通過(guò)P0口輸出,由于P2

;口保持不變,結(jié)果外部RAM3FFFH單元被選中,并讀入累加器A中

MOVX@R1,A ;將R1指定的外部存儲(chǔ)單元低8位地址0FFH通過(guò)P0口輸出,由于P2

;口保持不變,外部RAM的3FFFH單元被選中,結(jié)果累加器A的內(nèi)容傳 ;送到3FFFH單元(寫(xiě)入)

由于外部RAM與內(nèi)部RAM之間不能直接傳送,因此當(dāng)需要將外部RAM傳送到內(nèi)部RAM時(shí),可通過(guò)累加器A作中介。例如,通過(guò)如下指令將外部RAM3FFFH單元內(nèi)容傳送到內(nèi)部RAM2FH單元:

MOV DPTR,#3FFFH ;將外部RAM地址以立即數(shù)方式送數(shù)據(jù)指針DPTR

MOVX A,@DPTR ;將外部RAM3FFFH單元內(nèi)容讀到累加器A中

MOV 2FH,A ;將累加器A中的內(nèi)容送內(nèi)部RAM2FH單元中

外部RAM不同存儲(chǔ)單元之間也不能直接傳送,也需要通過(guò)累加器A作中介。

例3.2

把外部RAM的0100H單元內(nèi)容傳送到0120H單元中(兩單元之間的數(shù)據(jù)傳送)。

MOV DPTR,#0100H ;DPTR←單元地址0100H

MOVX A,@DPTR ;Acc←0100H單元內(nèi)容

MOV DPTR,#0120H ;DPTR←單元地址0120H

MOVX @DPTR,A ;0120H單元←Acc

例3.3

將外部RAM0080H~009FH單元,共32字節(jié)傳送到以00C0H為首地址的外部RAM中。對(duì)于標(biāo)準(zhǔn)MCS-51來(lái)說(shuō),在外部RAM之間進(jìn)行批量數(shù)據(jù)傳送時(shí),可先將外部RAM數(shù)據(jù)傳送到內(nèi)部RAM中,然后再傳送到外部RAM目標(biāo)地址。

參考程序如下:

;先將外部RAM數(shù)據(jù)傳送到內(nèi)部RAM30H~4FH中

MOV R0,#30H

MOV R7,#32

MOV DPTR,#0080H

LOOP1:

MOVX A,@DPTR

MOV @R0,A

INC DPTR

INC R0

DJNZ R7,LOOP1

;再將暫存于內(nèi)部RAM30H~4FH中的數(shù)據(jù)傳送到外部RAM目標(biāo)地址中

MOV R0,#30H

MOV R7,#32

MOV DPTR,#00C0H

LOOP2:

MOV A,@R0

MOVX @DPTR,A

INC DPTR

INC R0

DJNZ R7,LOOP2

利用增強(qiáng)型MCS-51雙DPTR指針,完成外部RAM不同區(qū)域之間的數(shù)據(jù)傳送要簡(jiǎn)單得多,如實(shí)現(xiàn)上述數(shù)據(jù)傳送的程序可改為:

MOV R7,#32 ;定義傳送字節(jié)數(shù)

MOV DPTR,#0080H ;數(shù)據(jù)塊在外部RAM首地址傳送第一個(gè)DPTR指針

INC AUXR1 ;切換數(shù)據(jù)指針,指向目標(biāo)地址

MOV DPTR,#00C0H ;外部RAM目標(biāo)地址傳送另一DPTR指針

LOOP:

INC AUXR1 ;切換DPTR指針,指向源地址

MOVX A,@DPTR ;取外部RAM數(shù)據(jù)

INCDPTR

INC AUXR1 ;切換DPTR指針,指向目標(biāo)地址

MOVX @DPTR,A ;數(shù)據(jù)送外部RAM目標(biāo)地址

INCDPTR

DJNZR7,LOOP ;循環(huán),直到傳送完送32字節(jié)

可見(jiàn)利用雙DPTR指針后,程序段結(jié)構(gòu)簡(jiǎn)潔,也無(wú)須使用內(nèi)部RAM作緩沖。

3.累加器A與程序存儲(chǔ)器ROM之間的數(shù)據(jù)傳送指令

為了取出存放在程序存儲(chǔ)器中的表格數(shù)據(jù),MCS-51提供了兩條查表指令,這兩條指令的操作碼助記符為“MOVC”,其中“C”的含義是“Code(代碼)”,表示操作對(duì)象是程序存儲(chǔ)器,指令格式、機(jī)器碼如表3-3所示。

表3-3查表指令其中“MOVCA,@A+DPTR”指令以DPTR作為基址,加上累加器A內(nèi)容后,所得的16位二進(jìn)制數(shù)作為待讀出的程序存儲(chǔ)器單元地址,并將該單元的內(nèi)容送到累加器A中。這條指令主要用于查表,例如在程序存儲(chǔ)器中,依次存放0~F的七段共陰極數(shù)碼顯示器的字模碼3F、06、5B、4F、66、6D、7D、07、7F、6F、77、7C、39、5E、79、71,則當(dāng)需要在P1口輸出某一數(shù)碼,如“3”時(shí),可通過(guò)如下指令實(shí)現(xiàn):

MOV DPTR,#2000H ;假設(shè)字模存放在2000H開(kāi)始的程序存儲(chǔ)器中,通過(guò)該指令將字模;首地址傳送到DPTR寄存器中

MOV A,#03H ;把待顯示的數(shù)碼傳送到累加器A中

MOVC A,@A+DPTR ;2000H

+

03H,即2003H單元的內(nèi)容(4F)讀到累加器A中

MOV P1,A ;將數(shù)碼“3”對(duì)應(yīng)的字模碼“4F”輸出到P1口

ORG 2000H

DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H從程序存儲(chǔ)器中讀出某一字節(jié)時(shí),也可以使用PC內(nèi)容作為基址,通過(guò)“MOVCA,@A+PC”取出,但使用這條指令讀取ROM中表格數(shù)據(jù)時(shí),表格數(shù)據(jù)項(xiàng)必須位于該指令后,靈活性差,例如:

MOV A,#03H ;把待顯示的數(shù)碼傳送到累加器A中

INCA ;因MOVC后的短跳轉(zhuǎn)指令占兩個(gè)字節(jié),表頭與MOVC指令差2個(gè)

;字節(jié)

INCA

MOVC A,@A+PC ;PC+03H單元內(nèi)容(4F)讀到累加器A中

SJMPNEXT ;跳過(guò)數(shù)據(jù)表,否則CPU會(huì)將數(shù)據(jù)表當(dāng)指令執(zhí)行

DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H

NEXT:

由于程序存儲(chǔ)器只能讀出,不能寫(xiě)入,因此,也就沒(méi)有寫(xiě)程序存儲(chǔ)器指令。

4.堆棧操作指令

堆棧操作也是計(jì)算機(jī)系統(tǒng)基本操作之一。設(shè)置堆棧操作的目的是為了迅速保護(hù)斷點(diǎn)和現(xiàn)場(chǎng),以便在子程序或中斷服務(wù)子程序運(yùn)行結(jié)束后,能正確返回主程序。MCS-51堆棧操作指令格式、機(jī)器碼如表3-4所示。

表3-4MCS-51堆棧操作指令有關(guān)MCS-51堆棧操作的過(guò)程,已在第2章中介紹過(guò),這里只強(qiáng)調(diào)堆棧操作應(yīng)注意的問(wèn)題:

(1)由于MCS-51堆棧操作指令中的操作數(shù)只能使用直接尋址方式,不能使用寄存器尋址方式,如將累加器A壓入堆棧時(shí),指令格式為:

PUSH Acc ;Acc是累加器A的寄存器名,本質(zhì)上屬于直接尋址

在堆棧操作指令中,累加器Acc不能簡(jiǎn)寫(xiě)為A。

(2)在子程序開(kāi)始處安排若干條PUSH指令,把需要保護(hù)的特殊功能寄存器內(nèi)容壓入堆棧(即內(nèi)部RAM),在子程序返回指令前,安排相應(yīng)的POP指令,將寄存器原來(lái)內(nèi)容彈出,但PUSH和POP指令必須成對(duì),且入棧順序與出棧順序相反,因此子程序結(jié)構(gòu)如下:

PUSH PSW ;保護(hù)現(xiàn)場(chǎng)

PUSH ACC

;子程序?qū)嶓w

POP ACC

;恢復(fù)現(xiàn)場(chǎng)

POP PSW

RET ;子程序返回

5.字節(jié)交換指令

字節(jié)交換指令也屬于數(shù)據(jù)傳送指令范疇,不過(guò)交換后,源操作數(shù)與目的操作數(shù)內(nèi)容相互對(duì)調(diào),MCS-51提供了四條字節(jié)交換指令和兩條半字節(jié)交換指令,這些指令格式、機(jī)器碼如表3-5所示。

表3-5MCS-51交換指令由于字節(jié)交換指令第二操作數(shù)支持寄存器尋址、直接尋址和間接尋址,因此內(nèi)部RAM(00~0FFH)、特殊功能寄存器中任一單元均可以與累加器A進(jìn)行交換。但半字節(jié)交換指令中的第二操作數(shù)僅支持寄存器間接尋址方式,因此僅有內(nèi)部RAM低4位能與累加器A低4位(b3~b0)直接交換。

例3.4

假設(shè)累加器A的內(nèi)容為12H,而R0的內(nèi)容為34H,則執(zhí)行:

XCHA,R0

指令后,累加器A的內(nèi)容為34H,R0的內(nèi)容為12H,即A和R0的內(nèi)容交換了,這與數(shù)據(jù)傳送指令不同,數(shù)據(jù)傳送指令執(zhí)行后,源操作數(shù)內(nèi)容覆蓋了目的操作數(shù)原來(lái)內(nèi)容。

例3.5

設(shè)累加器A為1EH,R0的內(nèi)容為2FH,內(nèi)部RAM2FH單元的內(nèi)容為37H,則執(zhí)行

XCHDA,@R0

指令后,累加器A的內(nèi)容為17H,內(nèi)部RAM2FH單元的內(nèi)容將為3EH,即A與寄存器R0指定的內(nèi)部RAM單元的低4位對(duì)調(diào),而高4位不變。3.1.2算術(shù)運(yùn)算指令

MCS-51提供了豐富的算術(shù)運(yùn)算指令,如加法運(yùn)算、減法運(yùn)算、增1指令、減1指令以及乘法、除法指令等。

一般情況下,算術(shù)運(yùn)算指令執(zhí)行后會(huì)影響程序狀態(tài)字寄存器PWS中相應(yīng)的標(biāo)志位。

1.加法指令

加法指令操作碼助記符、指令格式以及機(jī)器碼如表3-6所示。

表3-6MCS-51加法指令由表3-6可見(jiàn):

(1)所有加法指令的目的操作數(shù)均是累加器A,源操作數(shù)支持寄存器尋址、直接尋址、寄存器間接尋址、立即數(shù)尋址四種尋址方式。因此加數(shù),即源操作數(shù)可以是內(nèi)部RAM(00~FFH)、特殊功能寄存器或8位立即數(shù),結(jié)果存放在累加器A中。

(2)加法指令執(zhí)行后將影響進(jìn)位標(biāo)志Cy、溢出標(biāo)志OV、輔助進(jìn)位標(biāo)志Ac以及奇偶標(biāo)志P。相加后,若b7位有進(jìn)位,則Cy為1;反之為0。b7有進(jìn)位,表示兩個(gè)無(wú)符號(hào)數(shù)相加時(shí),結(jié)果大于255,和的低8位存放在累加器A中。

計(jì)算機(jī)并不知道參加運(yùn)算的兩個(gè)數(shù)是無(wú)符號(hào)數(shù)還是有符號(hào)數(shù),程序員只能借助溢出標(biāo)志OV來(lái)判別帶符號(hào)數(shù)相加是否溢出。對(duì)于帶符號(hào)數(shù)來(lái)說(shuō),b7是符號(hào)位(0表示正數(shù),1表示負(fù)數(shù)),且負(fù)數(shù)用補(bǔ)碼表示。于是當(dāng)兩個(gè)正數(shù)相加時(shí),如果累加器A的b7為1,表示結(jié)果是負(fù)數(shù),不可能,即和大于

+127;同理,當(dāng)兩個(gè)負(fù)數(shù)相加時(shí),如果累加器A的b7為0,表示結(jié)果是正數(shù),同樣不可能,即和小于

-128。即在加法指令中,溢出標(biāo)志OV置1的條件是:兩個(gè)操作數(shù)的符號(hào)相同(即b7位同為0或1),但結(jié)果的符號(hào)位相反。對(duì)于帶符號(hào)數(shù)加法運(yùn)算來(lái)說(shuō),當(dāng)溢出標(biāo)志OV為1,結(jié)果不正確。

相加后,若b3位向b4位進(jìn)位,則Ac為1;反之為0。

由于奇偶標(biāo)志P總是體現(xiàn)累加器A中“1”的奇偶性,因此P也會(huì)改變。

(3)帶進(jìn)位加法指令中的累加器A除了加源操作數(shù)外,還需要加上程序狀態(tài)字PSW寄存器中的進(jìn)位標(biāo)志Cy。設(shè)置帶進(jìn)位加法指令的目的是為了實(shí)現(xiàn)多字節(jié)加法運(yùn)算。例如,可通過(guò)如下指令將存放在30H、31H單元中的16位二進(jìn)制數(shù)與存放在32H、33H單元中的16位二進(jìn)制數(shù)相加(假設(shè)結(jié)果存放在30H、31H中):

MOV A,30H ;將被加數(shù)低8位送寄存器A中

ADD A,32H ;與加數(shù)低8位(32H單元內(nèi)容)相加,結(jié)果存放在A中

MOV 30H,A ;將和的低8位保存到30H單元中

MOV A,31H ;將被加數(shù)高8位送寄存器A中

ADDC A,33H ;與加數(shù)高8位(33H單元內(nèi)容)相加,結(jié)果存放在A中

;由于低8位相加時(shí),結(jié)果可能大于0FFH,產(chǎn)生進(jìn)位,因此高8位相加;時(shí)用ADDC指令

MOV 31H,A ;將和的高8位保存到31H單元中

2.減法指令

減法指令操作碼助記符、指令格式以及機(jī)器碼如表3-7所示。

表3-7MCS-51減法指令

MCS-51只有帶借位的減法指令,被減數(shù)是累加器A,減數(shù)可以是內(nèi)部RAM、特殊功能寄存器或立即數(shù)之一,結(jié)果存放在累加器A中。與加法指令類(lèi)似,操作結(jié)果同樣會(huì)影響標(biāo)志位:

Cy為1,表示被減數(shù)小于減數(shù),產(chǎn)生借位;

OV同樣用于判別兩個(gè)帶符號(hào)數(shù)相減后,差是否超出8位帶符號(hào)數(shù)所能表示的范圍(-128~+127)。當(dāng)兩個(gè)異號(hào)數(shù)相減時(shí),差的符號(hào)與被減數(shù)相反,則溢出標(biāo)志OV為1,結(jié)果不正確。例如,被減數(shù)為正數(shù),減數(shù)為負(fù)數(shù),相減后,結(jié)果應(yīng)該是正數(shù),但如果累加器A的b7為1,即負(fù)數(shù),則表明結(jié)果不正確。相減時(shí),如果b3位向b4位借位,則Ac為1;反之為0。

奇偶標(biāo)志P總是體現(xiàn)累加器A中“1”的奇偶性,因此P也會(huì)變化。

由于MCS-51指令系統(tǒng)只有帶借位的減法指令,因此,當(dāng)需要執(zhí)行不帶借位的減法指令時(shí),先執(zhí)行“CLRC”指令,將進(jìn)位標(biāo)志Cy清0。

例3.6

用減法指令求內(nèi)部RAM兩單元的差值(假設(shè)被減數(shù)存放在內(nèi)部RAM30H單元中,減數(shù)存放在31H單元中,差放在40H單元中)。

MOV A,30H ;被減數(shù)送寄存器A

CLR C ;進(jìn)位標(biāo)志Cy清0

SUBB A,31H ;減31H單元

MOV 40H,A ;結(jié)果保存到40H單元

3.加1指令

加1指令也稱(chēng)為“增量指令”,操作結(jié)果是操作數(shù)加1。加1指令操作碼助記符、指令格式以及機(jī)器碼如表3-8所示。

表3-8MCS-51加1指令加1指令不影響標(biāo)志位,只有操作對(duì)象為累加器A時(shí),才影響奇偶標(biāo)志位P。

當(dāng)操作數(shù)初值為0FFH,則加1后,將變?yōu)?0H。

盡管加1指令與加數(shù)為1的加法指令同樣會(huì)使操作數(shù)增1,但彼此并不完全相同,

例如:

INCA ;通過(guò)增量指令使累加器A內(nèi)容加1

該指令除了影響奇偶標(biāo)志位P外,不影響其他標(biāo)志位。

ADDA,#01H ;通過(guò)加法指令使累加器A內(nèi)容加1

該指令同樣會(huì)使累加器A內(nèi)容加1,但該指令將影響Cy、OV、Ac以及P標(biāo)志位,且指令機(jī)器碼占用兩個(gè)字節(jié)。

當(dāng)操作數(shù)是某一I/O口,如“INCP1”時(shí),先將P1口鎖存器內(nèi)容讀出,加1后,再寫(xiě)入P1口鎖存器中,因此INCPi(i

=

0,1,2,3)屬于“讀—改—寫(xiě)”指令。

4.減1指令

減1指令使操作數(shù)減1。減1指令操作碼助記符、指令格式以及機(jī)器碼如表3-9所示。

表3-9MCS-51減1指令與加1指令情況類(lèi)似,減1指令也不影響標(biāo)志位,只有當(dāng)操作數(shù)是累加器A時(shí),才影響奇偶標(biāo)志位P。

當(dāng)操作數(shù)的初值為00H時(shí),減1后,結(jié)果將變?yōu)镕FH。

其他情況與加1指令類(lèi)似。

5.乘法指令

MCS-51提供了8位無(wú)符號(hào)數(shù)乘法指令,該指令操作碼助記符、指令格式、機(jī)器碼如表3-10所示。

表3-10MCS-51乘法指令被乘數(shù)放在累加器A(8位無(wú)符號(hào)數(shù))中,乘數(shù)放在寄存器B(8位無(wú)符號(hào)數(shù))中,乘積(16位無(wú)符號(hào)數(shù))的高8位放在寄存器B中,低8位放在累加器A中。

該指令影響標(biāo)志位:當(dāng)結(jié)果大于255時(shí),OV為1;反之為0。進(jìn)位標(biāo)志Cy總為0;AC保持不變;奇偶標(biāo)志P隨累加器A中“1”的個(gè)數(shù)變化而變化。

MCS-51沒(méi)有提供8位

×

16位、16位

×

16位、16位

×

24位等多字節(jié)乘法指令,只能通過(guò)單字節(jié)乘法指令實(shí)現(xiàn)多字節(jié)乘法運(yùn)算,可采用圖3-2所示算法實(shí)現(xiàn)相應(yīng)的運(yùn)算。

圖3-2多字節(jié)乘法算法

(a)

16位

×

8位;(b)

16位

×

16位;(c)

24位

×

16位在16位乘8位運(yùn)算中,16位被乘數(shù)占2字節(jié),用BA表示;8位乘數(shù)占1字節(jié),用C表示,則乘積為24位。顯然“A*C”為16位,“B*C”為24位。因此,可用如圖3-2(a)所示算法實(shí)現(xiàn)。

在16位乘16位運(yùn)算中,16位被乘數(shù)占2字節(jié),用BA表示;16位乘數(shù)也占2字節(jié),用DC表示,則乘積為32位。顯然“A*C”為16位,“B*C”為24位;“A*D”為24位,“B*D”為32位。因此,可用如圖3-2(b)所示算法實(shí)現(xiàn)。

而在24位乘16位運(yùn)算中,24位被乘數(shù)占3字節(jié),用CBA表示;16位乘數(shù)占2字節(jié),用ED表示,乘積應(yīng)該為40位。顯然“A*D”為16位,“B*D”為24位,“C*D”為32位;“A*E”為24位,“B*D”為32位,“E*C”為40位。因此,可用如圖3-2(c)所示算法實(shí)現(xiàn)。

例3.7

編寫(xiě)一程序段,實(shí)現(xiàn)16位

×

8位運(yùn)算。

;功能:16位乘8位運(yùn)算程序段

;假設(shè)16位被乘數(shù)存放存在46H、47H單元中,8位乘數(shù)存放在49H單元中

;24位乘積保存在42H、43H、44H單元中

PROCMUL1608 ;16位

×

8位運(yùn)算子程序

MUL1608:

;計(jì)算“A*C”

MOVA,47H;取被乘數(shù)低8位

MOVB,49H;取乘數(shù)

MULAB

MOV44H,A;存乘積的低8位

MOV43H,B;存乘積的高8位

;計(jì)算“B*C”,并與“A*C”相加

MOVA,46H;取被乘數(shù)高8位

MOVB,49H;取乘數(shù)

MULAB

ADDA,43H;乘積低8位

+

(b15~b8)

MOV43H,A;保存結(jié)果到b15~b8

CLRA

ADDCA,B;乘積高8位

+

Cy

MOV42H,A;保存結(jié)果到b23~b16

RET

END

以上程序段代碼長(zhǎng)度也不長(zhǎng),執(zhí)行時(shí)間為22個(gè)機(jī)器周期,并不算長(zhǎng)。

例3.8

編寫(xiě)一程序段,實(shí)現(xiàn)16位

×

8位運(yùn)算。

;功能:16位乘16位運(yùn)算程序段

;假設(shè)16位被乘數(shù)存放存在46H、47H單元中,16位乘數(shù)存放在48H、49H單元中

;32位乘積保存在41H、42H、43H、44H單元中

;使用資源:累加器Acc、寄存器B、PSW

PROCMUL1616 ;16位

×

18位運(yùn)算子程序

MUL1616:

;計(jì)算“A*C”

MOVA,47H ;取被乘數(shù)低8位

MOVB,49H ;取乘數(shù)

MULAB

MOV44H,A ;存乘積的低8位

MOV43H,B ;存乘積的高8位

;計(jì)算“B*C”,并與“A*C”相加

MOVA,46H ;取被乘數(shù)高8位

MOVB,49H ;取乘數(shù)

MULAB

ADDA,43H ;低8位

+

(b15~b8)

MOV43H,A ;保存結(jié)果到b15~b8

CLRA

ADDCA,B ;乘積高8位

+

Cy

MOV42H,A ;保存結(jié)果到b23~b16

;計(jì)算“A*D”,并相加

MOVA,47H ;取被乘數(shù)低8位

MOVB,48H ;取乘數(shù)高8位

MULAB

ADDA,43H ;低8位

+

(b15~b8)

MOV43H,A ;保存結(jié)果到b15~b8

MOVA,42H

ADDCA,B ;加乘積高8位

MOV42H,A ;保存結(jié)果到b23~b16

CLRA

ADDCA,#0 ;加進(jìn)位標(biāo)志Cy

MOV41H,A ;保存;計(jì)算“B*D”,并相加

MOVA,46H ;取被乘數(shù)高8位

MOVB,48H ;取乘數(shù)高8位

MULAB

ADDA,42H ;低8位

+

(b23~b16)

MOV42H,A ;保存到b23~b16

MOVA,41H

ADDCA,B ;加乘積高8位

MOV41H,A ;保存結(jié)果到b31~b24

RET

END

例3.9

編寫(xiě)一程序段,實(shí)現(xiàn)24位

×

16位運(yùn)算。

;假設(shè)24位被乘數(shù)存放存在45H、46H、47H單元中,乘數(shù)存放在48H、49H單元中

;40位乘積保存在40H、41H、42H、43H、44H單元中

PROCMUL2416 ;24位

×

16位運(yùn)算子程序

MUL2416:

;低8位乘被乘數(shù)低8位

MOVA,49H ;取乘數(shù)低8位

MOVB,47H ;取被乘數(shù)低8位

MULAB

MOV44H,A ;存乘積低8位(b7~b0)

MOV43H,B ;存乘積高8位(b15~b8)

;低8位乘被乘數(shù)次高8位

MOVA,49H ;取乘數(shù)低8位

MOVB,46H ;取被乘數(shù)次高8位

MULAB

ADDA,43H ;乘積低8位

+

(b15~b8)

MOV43H,A ;保存b15~b8

CLRA

ADDCA,B ;乘積高8位加

+

Cy,乘積最高位最大為FEH,即使加1,

;也不可能溢出

MOV42H,A ;保存b23~b16

;低8位乘被乘數(shù)最高8位

MOVA,49H ;取乘數(shù)低8位

MOVB,45H ;取被乘數(shù)最高8位

MULAB

ADDA,42H ;加b23~b16

MOV42H,A ;保存結(jié)果b23~b16

CLRA

ADDCA,B ;乘積高8位加

+

Cy,乘積最高位最大為FEH,即使加1,

;也不可能溢出

MOV41H,A ;保存b31~b24

;高8位乘被乘數(shù)低8位

MOVA,48H ;取乘數(shù)高8位

MOVB,47H ;取被乘數(shù)低8位

MULAB

ADDA,43H ;乘積低8位

+

(b15~b8)

MOV43H,A ;保存b15~b8

MOVA,42H ;取b23~b16

ADDCA,B ;乘積高8位

+

(b23~b16)

+

Cy

MOV42H,A ;保存b23~b16

CLRA

ADDCA,41H ;(b31~b24)

+

Cy

MOV41H,A ;保存b31~b24

CLRA

ADDCA,#0 ;加進(jìn)位標(biāo)志Cy

MOV40H,A ;保存b39~b32

;高8位乘被乘數(shù)次高8位

MOVA,48H ;取乘數(shù)高8位

MOVB,46H ;取被乘數(shù)次高8位

MULAB

ADDA,42H ;乘積低8位

+

(b23~b16)

MOV42H,A ;保存b23~b16

MOVA,41H ;取b31~b24

ADDCA,B ;乘積高8位

+

(b31~b24)

+

Cy

MOV41H,A ;保存b31~b24

CLRA

ADDCA,40H ;b39~b32

+

進(jìn)位標(biāo)志Cy

MOV40H,A ;保存b39~b32

;高8位乘被乘數(shù)最高8位

MOVA,48H ;取乘數(shù)高8位

MOVB,45H ;取被乘數(shù)最高8位

MULAB

ADDA,41H ;乘積低8位

+

(b31~b24)

MOV41H,A ;保存b31~b24

MOVA,40H ;取b39~b32

ADDCA,B ;加乘積高8位

+

(b39~b32)

+

Cy

MOV40H,A ;保存b39~b32

RET

END

6.除法指令

MCS-51提供了8位無(wú)符號(hào)數(shù)除法指令,該指令操作碼助記符、指令格式、機(jī)器碼如表3-11所示。

表3-11MCS-51除法指令被除數(shù)放在累加器A(8位無(wú)符號(hào)數(shù))中,除數(shù)放在寄存器B(8位無(wú)符號(hào)數(shù))中,商(8位無(wú)符號(hào)數(shù))放在累加器A中,余數(shù)(8位無(wú)符號(hào)數(shù))放在寄存器B中。顯然余數(shù)取值范圍為0~(除數(shù)

-1)。

該指令影響標(biāo)志位:如果除數(shù)(即寄存器B)不為0,執(zhí)行執(zhí)行后,溢出標(biāo)志OV總為0;如果除數(shù)為0,執(zhí)行后,結(jié)果將不確定,OV置1。

AC保持不變;進(jìn)位標(biāo)志Cy總為0;奇偶標(biāo)志P位隨累加器A中“1”的個(gè)數(shù)變化而變化。盡管MCS-51沒(méi)有提供16位

÷

8位、32位

÷

16位等多位除法運(yùn)算指令,但可以借助減法或類(lèi)似多項(xiàng)式除法運(yùn)算規(guī)則完成多位除法運(yùn)算,參考例3.27。

MCS-51沒(méi)有多字節(jié)乘、除法指令,在電機(jī)調(diào)速、開(kāi)關(guān)電源控制等應(yīng)用系統(tǒng)中,有時(shí)顯得不方便,盡管可通過(guò)軟件方式實(shí)現(xiàn)多字節(jié)乘法、除法運(yùn)算,但耗時(shí)長(zhǎng),系統(tǒng)反應(yīng)速度慢。為此,InfineonXC886系列提供了32位硬件乘法、除法部件MDU。

7.十進(jìn)制加法校正指令

在介紹十進(jìn)制加法調(diào)正指令前,先來(lái)看BCD碼加法運(yùn)算存在的問(wèn)題。

例3.10BCD碼25存放在累加器A中,即A

=

00100101B;另一BCD碼36存放在寄存器R2中,即R2

=

00110110B。當(dāng)通過(guò)“ADDA,R2”指令相加時(shí),CPU視為兩個(gè)二進(jìn)制數(shù)相加,運(yùn)算結(jié)果如下:

A=00100101

+R2=00110110

A←01011011(結(jié)果是5BH,即十進(jìn)制的91)而我們知道25

+

36

=

61,之所以得不到正確結(jié)果是因?yàn)樵贐CD中,用二進(jìn)制表示十進(jìn)制數(shù)時(shí),僅使用0~9,即二進(jìn)制0000~1001十個(gè)數(shù)碼。因此,相加后,當(dāng)?shù)?位大于1001時(shí),應(yīng)該加06H,使低4位(即BCD碼個(gè)位)向b4進(jìn)位,獲得正確結(jié)果,例如:

A=

01

011011

+

6校正

00000110

A←01100001(結(jié)果是61)顯然,高4位也存在類(lèi)似情況,即根據(jù)運(yùn)算結(jié)果加60H校正。下面再來(lái)看另一種情況下,即低4位向高4位進(jìn)位時(shí),也需要校正。

例3.11

假設(shè)BCD碼19存放在累加器A中,即A

=

00011001B;另一BCD碼38存放在寄存器R2中,即R2=00111000B。當(dāng)通過(guò)“ADDA,R2”指令相加時(shí),運(yùn)算結(jié)果如下:

A=

00011001

+

R2=00111000

A←01010001(結(jié)果是51H,即十進(jìn)制的81)而19

+

38

=

57,之所以得不到正確結(jié)果是因?yàn)?

+

9

=

17,在二進(jìn)制加法中為11H,同樣需要加6校正。因此,當(dāng)b3位向b4位進(jìn)位,即輔助進(jìn)位標(biāo)志Ac有效時(shí),要加6校正。事實(shí)上,設(shè)置輔助進(jìn)位標(biāo)志Ac的目的主要是為了判別BCD加法運(yùn)算是否需要校正。同樣,高位也存在類(lèi)似問(wèn)題,當(dāng)b7有進(jìn)位,即Cy為1時(shí),也需要加60H進(jìn)行校正??梢?jiàn)用ADD指令完成BCD碼加法運(yùn)算時(shí),高4位或低4位大于1001,以及Ac或Cy有效時(shí),必須加06H、60H或66H進(jìn)行校正,才能獲得正確的結(jié)果。十進(jìn)制加法校正指令就是為此而設(shè)置,該指令操作碼助記符、指令格式、機(jī)器碼如表3-12所示。

表3-12MCS-51

BCD加法校正指令該指令用于BCD加法校正,需放在ADD指令后,例如:

ADD A,R2 ;兩個(gè)BCD碼相加

DA A ;將累加器A中的結(jié)果校正后轉(zhuǎn)化為BCD

值得注意的是十進(jìn)制校正指令只能放在加法指令后,不能單獨(dú)使用“DAA”指令將累加器A中的內(nèi)容轉(zhuǎn)化為BCD碼。

MCS-51沒(méi)有提供BCD碼減法校正指令,但可以通過(guò)“補(bǔ)碼”概念,將BCD碼減法運(yùn)算變成BCD碼加法運(yùn)算。我們知道兩位BCD可以表示00~99,需要用8位二進(jìn)制存放;三位BCD可以表示000~999,需要用12位二進(jìn)制存放;四位BCD可以表示0000~9999之間的數(shù),需要用16位二進(jìn)制存放,因此,XY

-

xy

=

XY

+

100

-

xy(100的BCD需要用12位二進(jìn)制存放,其中的1自然丟失)。

當(dāng)XY≥xy時(shí),“XY

+

100

-

xy”就是XY

-

xy;當(dāng)XY<xy時(shí),“XY

+

100

-

xy”是“XY

-

xy”的補(bǔ)碼。

由于其中的“100”為BCD碼,可表示為“99H+1H”,即“9AH”。因此可直接用減法指令求出“100

-

xy”=“9AH

-

xy”的BCD碼。

例3.12

假設(shè)兩位BCD碼形式的被減數(shù)、減數(shù)分別存放在VAR1和VAR2單元中,試編寫(xiě)一程序段求“VAR1

-

VAR2”,結(jié)果存放在VAR3單元中。

參考程序如下:

CLR C ;清進(jìn)位標(biāo)志Cy

MOV A,#9AH ;把BCD碼“100”等效表示碼送累加器A

SUBB A,VAR2 ;計(jì)算“100

-

VAR2”,結(jié)果為BCD形式

ADD A,VAR1 ;加被減數(shù)

DA A ;校正

MOV VAR3,A ;保存“VAR1

-

VAR2”結(jié)果

例3.13

將R2中以壓縮形式存放的兩位BCD碼減1。

與上例有所不同,減1相當(dāng)于加99(因?yàn)?9H

+

1

-

1就是99H)。這樣實(shí)現(xiàn)兩位BCD碼減1的程序如下:

MOV A,R2

ADD A,#99H

DA A

MOV R2,A

對(duì)于3位BCD碼來(lái)說(shuō),XYZ

-

xyz

=

ZYX

+

1000

-

xyz。

當(dāng)XYZ≥xyz時(shí),“XYZ

+

1000

-

xyz”就是XYZ

-

xyz;當(dāng)XYZ<xyz時(shí),“XYZ

+

1000

-

xyz”是“XYZ

-

xyz”的補(bǔ)碼。同理,為了能用減法指令求出“1000

-

xyz”的BCD碼,可用“99AH”表示“1000

-

xyz”算式中十進(jìn)制數(shù)“1000”(因?yàn)椤?9AH”加“6”校正后正好是“1000H”)。

例3.14

三位壓縮形式BCD碼被減數(shù)存放在81H、80H單元中,減數(shù)存放在31H、30H單元中,試編寫(xiě)一程序段求出兩者的差,結(jié)果存放在81H、80H單元中。

CLR C

MOV A,#9AH

SUBB A,30H ;低8位相減

MOV R2,A ;暫時(shí)保存低8位中間結(jié)果

MOV A,#09H

SUBB A,31H ;高4位相減

ANL A,#0FH ;屏蔽高位

MOV R3,A ;暫時(shí)保存高8位中間結(jié)果

MOV R0,#80H

MOV A,@R0 ;取被減數(shù)低8位

ADD A,R2 ;低8位相加

DA A ;校正

MOV @R0,A ;保存和的十位、個(gè)位

INCR0 ;R0加1

MOV A,@R0 ;取被減數(shù)百位

ADDC A,R3 ;百位相加

DA A ;校正

ANL A,#0FH ;屏蔽高4位

MOV @R0,A ;保存百位

例3.15

將R3/R2中以壓縮形式存放的三位BCD碼減1。

三位BCD減1,相當(dāng)于加999(其實(shí)99AH減1就是999H)。因此,實(shí)現(xiàn)三位BCD碼減1的程序如下:

MOV A,R2 ;取十位、個(gè)位

ADD A,#99H

DA A

MOV R2,A ;保存加99后的十位、個(gè)位結(jié)果

MOV A,R3 ;取百位

ADDC A,#09H

DA A ;百位加9并校正

ANL A,#0FH ;屏蔽高4位

MOV R3,A ;保存百位3.1.3邏輯運(yùn)算指令

邏輯運(yùn)算在計(jì)算機(jī)指令系統(tǒng)中的重要性并不亞于算術(shù)運(yùn)算指令。MCS-51提供了豐富的邏輯運(yùn)算指令,包括邏輯非(取反)、與、或、異或以及循環(huán)移位操作等。

邏輯運(yùn)算指令格式、操作碼助記符、機(jī)器碼等如表3-13所示。

表3-13MCS-51邏輯運(yùn)算指令這類(lèi)指令的特點(diǎn)是不影響程序狀態(tài)字寄存器PSW中的標(biāo)志位(但以Acc為目的操作數(shù)時(shí)將影響P標(biāo)志)。只有帶進(jìn)位Cy循環(huán)移位時(shí),才影響Cy和奇偶標(biāo)志P。

邏輯運(yùn)算均按位進(jìn)行。例如當(dāng)A

=

10100101B時(shí),執(zhí)行“ANLA,#01011010B”指令后,累加器A為0。

常用邏輯與(ANL)指令將操作數(shù)中指定位清0。如可通過(guò)如下指令將P1口鎖存器的b4、b2位清0,而其他位不變。

ANLP1,#11101011B

在構(gòu)造立即數(shù)時(shí),希望清0位取0,其他位取1。該指令執(zhí)行后,P1口鎖存器各位為

×××0×0××,可見(jiàn)指定位為0,其他位保持不變。

常用邏輯或(ORL)指令將操作數(shù)中指定位置1。如可通過(guò)如下指令將P1口鎖存器的b4、b2位置1,而其他位不變。

ORLP1,#00010100B

在構(gòu)造立即數(shù)時(shí),希望置1位取1,其他位取0。該指令執(zhí)行后,P1口鎖存器各位為

×××1×1××,可見(jiàn)指定位為1,其他位保持不變。

常用邏輯異或(XRL)指令將操作數(shù)中指定位取反。如可通過(guò)如下指令將P1口鎖存器的b4、b2位取反,而其他位不變。

XRLP1,#00010100B

在構(gòu)造立即數(shù)時(shí),希望取反位為1,其他位為0。

左循環(huán)移位“RLA”也常用于實(shí)現(xiàn)

×

2n(如2、4、8等)的運(yùn)算。例如,當(dāng)需要對(duì)累加器A進(jìn)行乘4操作時(shí),如果A小于3FH,用如下兩條左循環(huán)移位指令完成比用乘法指令速度快、代碼短。

RLA ;左循環(huán)移位一次,相當(dāng)于乘2

RLA ;再左循環(huán)移位一次,相當(dāng)于乘4

以上兩條指令執(zhí)行時(shí)間僅需2

×

1個(gè)機(jī)器周期,代碼長(zhǎng)度為2

×

1字節(jié),但如使用乘法指令實(shí)現(xiàn)則需要6個(gè)機(jī)器周期(2

+

4),代碼長(zhǎng)度為4字節(jié)(3

+

1)。

MOVB,#04H ;3字節(jié),執(zhí)行時(shí)間為2個(gè)機(jī)器周期

MULAB ;1字節(jié),執(zhí)行時(shí)間為4個(gè)機(jī)器周期3.1.4位操作指令

由于單片機(jī)在控制系統(tǒng)中主要用于控制線(xiàn)路通、斷,繼電器的吸合與釋放等,因此位操作指令在單片機(jī)指令系統(tǒng)占有重要地位。多數(shù)8位機(jī)依然保留了一位機(jī)功能,即提供了完整的位尋址功能和位操作指令。

MCS-51單片機(jī)具有豐富的位操作指令,在位運(yùn)算指令中,進(jìn)位標(biāo)志Cy的作用類(lèi)似于字節(jié)運(yùn)算指令中的累加器A,因此Cy在位操作指令中,被稱(chēng)為“位累加器”。在MCS-51中,位存儲(chǔ)器包括了內(nèi)部RAM20H~2FH單元的位存儲(chǔ)區(qū)以及特殊功能寄存器中支持位尋址的所有位。

MCS-51位操作指令操作碼助記符、指令格式、機(jī)器碼等如表3-14所示。

在位操作中,位存儲(chǔ)器均使用直接地址,在匯編語(yǔ)言指令中,有關(guān)特殊功能寄存器中位地址的表示方法第2章已介紹過(guò)。

在位操作中,除了使用位累加器Cy的位操作指令外,均不影響其他標(biāo)志位。

MCS-51沒(méi)有提供位異或運(yùn)算指令,當(dāng)需要位異或運(yùn)算時(shí),可通過(guò)如下方式之一實(shí)現(xiàn):

(1)利用MCS-51的偶校驗(yàn)標(biāo)志P實(shí)現(xiàn)。根據(jù)偶校驗(yàn)特征,PSW標(biāo)志寄存器內(nèi)的偶校驗(yàn)位為

P

=

ACC.7ACC.6ACC.5ACC.4ACC.3ACC.2ACC.1ACC.0

例如,設(shè)X、Y、Z均為位變量,則可通過(guò)如下指令求X、Y位變量的異或結(jié)果。

CLRA

MOVC,X ;位變量X送Cy

MOVAcc.0,C ;Acc.0←Cy

MOVC,Y ;位變量Y送Cy

MOVAcc.1,C ;Acc.1←Cy

MOVC,P ;把運(yùn)算結(jié)果送Cy

MOVZ,C ;Cy送Z

當(dāng)邏輯變量多于兩個(gè)時(shí),使用這種方式將非常方便。例如,四個(gè)邏輯變量分別從P1.3、P1.2、P1.1、P1.0引腳輸入,可通過(guò)如下指令求其異或運(yùn)算的結(jié)果:

MOVA,P1

ANLA,#0FH ;異或結(jié)果已經(jīng)在P標(biāo)志中

3.1.5控制及轉(zhuǎn)移指令

以上介紹的指令均屬于順序執(zhí)行指令,即執(zhí)行了當(dāng)前指令后,接著就執(zhí)行下一條指令。但在計(jì)算機(jī)中,只有順序執(zhí)行指令是不夠的,更一般的情況是:執(zhí)行了當(dāng)前指令后,往往需要根據(jù)執(zhí)行結(jié)果做出判別,是繼續(xù)執(zhí)行隨后的指令,還是轉(zhuǎn)去執(zhí)行其他的指令系列,這就需要控制和轉(zhuǎn)移指令。

控制轉(zhuǎn)移指令包括跳轉(zhuǎn)(包括無(wú)條件跳轉(zhuǎn)和條件跳轉(zhuǎn))指令、調(diào)用指令、返回指令以及停機(jī)指令等。

1.無(wú)條件跳轉(zhuǎn)指令

MCS-51無(wú)條件跳轉(zhuǎn)指令操作碼助記符、格式、機(jī)器碼如表3-15所示。

表3-15無(wú)條件跳轉(zhuǎn)指令無(wú)條件跳轉(zhuǎn)指令的含義是執(zhí)行了該指令后,程序?qū)o(wú)條件跳到指令中給定的存儲(chǔ)器地址單元執(zhí)行,其中:

(1)長(zhǎng)跳轉(zhuǎn)指令給出了16位地址,該地址就是轉(zhuǎn)移后要執(zhí)行的指令碼所在的存儲(chǔ)單元地址。因此,該指令執(zhí)行后,將指令中給定的16位地址裝入程序計(jì)數(shù)器PC。長(zhǎng)跳轉(zhuǎn)指令可使程序跳到64

KB范圍內(nèi)的任一單元執(zhí)行,常用于跳到主程序、中斷服務(wù)程序入口處,如:

ORG0000H

LJMPMain ;其中Main是主程序入口地址標(biāo)號(hào)

ORG0003H

LJMPINT0 ;INT0是外中斷0服務(wù)程序入口地址標(biāo)號(hào)

(2)絕對(duì)跳轉(zhuǎn)指令A(yù)JMP只需11位地址,即該指令執(zhí)行后,僅將指令中給定的11位地址裝入程序計(jì)數(shù)器PC的低11位,而高5位(即PC15~PC11)保持不變,因此AJMP指令只能實(shí)現(xiàn)2KB(由于高5位地址編碼相同,而A10~A0的尋址范圍就是2KB)范圍內(nèi)的跳轉(zhuǎn),即轉(zhuǎn)入的存儲(chǔ)單元地址的高5位地址編碼與PC計(jì)數(shù)器當(dāng)前值的高5位必須相同,否則就會(huì)出現(xiàn)跨頁(yè)錯(cuò)誤。假設(shè)“AJMP267BH”指令存放在2000H單元,由于該指令占用兩個(gè)字節(jié),執(zhí)行后,PC=2002H,即0010000000000010B,由于低11位地址由AJMP指令給出,可見(jiàn)跳轉(zhuǎn)目標(biāo)地址范圍在0010000000000000B~0010011111111111B,即2000H~27FFH之間,包含了“267B”,因而能夠跳轉(zhuǎn)。

(3)短跳轉(zhuǎn)指令“SJMPrel”中的rel是一個(gè)帶符號(hào)的8位地址,范圍在

-128~+127之間,當(dāng)偏移量為負(fù)數(shù)(用補(bǔ)碼表示)時(shí),向前跳轉(zhuǎn);而當(dāng)偏移量為正數(shù)時(shí),向后跳轉(zhuǎn)。

由于SJMP指令占兩個(gè)字節(jié),執(zhí)行該指令后,PC

=

××××

+

2(××××是SJMP指令碼的首地址)。當(dāng)rel為FEH,即

-2時(shí),跳轉(zhuǎn)地址等于PC

=

××××

+

2

-

2

=

××××,即又跳回SJMP指令碼首地址單元,將不斷重復(fù)執(zhí)行SJMP指令,相當(dāng)于動(dòng)態(tài)停機(jī)。在匯編語(yǔ)言中,常寫(xiě)成:

Here:SJMPHere

或SJMP$

在匯編語(yǔ)言源程序中,$

表示指令的首地址。執(zhí)行這條指令,會(huì)使機(jī)器進(jìn)入死循環(huán)。如果中斷處于允許狀態(tài),則當(dāng)中斷有效時(shí),將進(jìn)入中斷服務(wù)程序,但從中斷服務(wù)程序返回后又重復(fù)執(zhí)行SJMP指令。

(4)在間接跳轉(zhuǎn)“JMP@A+DPTR”指令中,將DPTR內(nèi)容與累加器A相加,得到的16位地址作為PC的值。因此,通過(guò)該指令可以動(dòng)態(tài)修改PC的值,跳轉(zhuǎn)地址由累加器A控制,常用于多分支跳轉(zhuǎn)指令。

2.調(diào)用指令

MCS-51調(diào)用指令操作碼助記符、指令格式、機(jī)器碼如表3-16所示。

表3-16調(diào)用指令可見(jiàn)調(diào)用指令與跳轉(zhuǎn)指令不同:調(diào)用指令用于執(zhí)行子程序,調(diào)用指令中的地址就是子程序的入口地址,子程序執(zhí)行結(jié)束后,要返回主程序繼續(xù)執(zhí)行。因此,調(diào)用時(shí),需要將指令指針PC壓入堆棧,保存PC的當(dāng)前值,以便在子程序執(zhí)行結(jié)束后,通過(guò)RET指令正確返回,例如:

LCALLSUB1 ;調(diào)用子程序SUB1

MOV2FH,A

SUB1:

PUSHPSW

POPPSW

RET

假設(shè)LCALLSUB1指令機(jī)器碼從1003H單元開(kāi)始存放,由于該指令占3個(gè)字節(jié),則該指令后的“MOV2FH,A”指令機(jī)器碼將從1006H單元開(kāi)始存放。執(zhí)行了“LCALLSUB1”指令后,PC也是1006H,正好是該指令下一條指令機(jī)器碼的首地址,為了能夠返回,先將1006H(即06H、10H)壓入堆棧,然后再將SUB1標(biāo)號(hào)對(duì)應(yīng)的存儲(chǔ)單元地址,即子程序入口地址裝入PC,執(zhí)行子程序中的指令系列,當(dāng)遇到RET指令后,又自動(dòng)將堆棧中的1006H,即斷點(diǎn)地址傳送

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論