《單片機(jī)系統(tǒng)設(shè)計(jì)及工程應(yīng)用》課件第3章_第1頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)及工程應(yīng)用》課件第3章_第2頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)及工程應(yīng)用》課件第3章_第3頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)及工程應(yīng)用》課件第3章_第4頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)及工程應(yīng)用》課件第3章_第5頁(yè)
已閱讀5頁(yè),還剩210頁(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.151系列單片機(jī)指令系統(tǒng)概述3.251系列單片機(jī)尋址方式3.3指令系統(tǒng)3.4常用偽指令3.5程序設(shè)計(jì)技術(shù)習(xí)題33.1.151系列單片機(jī)指令特點(diǎn)及分類(lèi)

51單片機(jī)的指令系統(tǒng)具有功能強(qiáng)、指令短、執(zhí)行速度快等特點(diǎn)。其指令系統(tǒng)共有111條指令,從功能上可劃分成5大類(lèi)指令:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯運(yùn)算指令、位操作指令和程序轉(zhuǎn)移指令,如圖3.1所示。若按指令長(zhǎng)度分類(lèi),則可分為單字節(jié)指令(49條)、雙字節(jié)指令(46條)和三字節(jié)指令(16條)。若按指令的執(zhí)行時(shí)間分類(lèi),則可分為單機(jī)器周期指令(64條)、雙機(jī)器周期指令(45條)和4機(jī)器周期的指令,4

機(jī)器周期的指令只有乘、除法兩條。3.151系列單片機(jī)指令系統(tǒng)概述圖3.1MCS-51系列單片機(jī)指令功能分類(lèi)3.1.251系列單片機(jī)匯編語(yǔ)言指令格式

指令的描述形式有3種:機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言。用機(jī)器語(yǔ)言編寫(xiě)的程序稱(chēng)為目標(biāo)程序,計(jì)算機(jī)能夠直接識(shí)別并執(zhí)行的只有機(jī)器語(yǔ)言。采用匯編語(yǔ)言編寫(xiě)的程序稱(chēng)為匯編語(yǔ)言程序。匯編語(yǔ)言程序不能被計(jì)算機(jī)直接識(shí)別并執(zhí)行,必須經(jīng)過(guò)一個(gè)中間環(huán)節(jié)把它翻譯成機(jī)器語(yǔ)言程序,這個(gè)中間翻譯過(guò)程叫做匯編。匯編有兩種方法:機(jī)器匯編和手工匯編。機(jī)器匯編是用專(zhuān)門(mén)的匯編程序在計(jì)算機(jī)上進(jìn)行翻譯;手工匯編是編程員把匯編語(yǔ)言指令逐條翻譯成機(jī)器指令。由于單片機(jī)開(kāi)發(fā)是在計(jì)算機(jī)和開(kāi)發(fā)系統(tǒng)的基礎(chǔ)上進(jìn)行的,因此,主要采用機(jī)器匯編,使用十分方便。而高級(jí)語(yǔ)言程序設(shè)計(jì)在單片機(jī)系統(tǒng)中應(yīng)用也十分普遍,大多數(shù)單片機(jī)開(kāi)發(fā)系統(tǒng)均支持使用C語(yǔ)言等多種高級(jí)語(yǔ)言,使得編程更加輕松。在描述計(jì)算機(jī)指令系統(tǒng)及實(shí)際應(yīng)用中主要采用匯編語(yǔ)言形式,51單片機(jī)匯編語(yǔ)言指令格式如下:

[標(biāo)號(hào):]操作碼[目的操作數(shù)][,源操作數(shù)][;注釋?zhuān)?/p>

例如,LOOP1:ADDA,#10H;(A)←(A)+10H

(1)方括號(hào)[]表示該項(xiàng)是可選項(xiàng),根據(jù)需要選擇,可有可無(wú)。

(2)標(biāo)號(hào)是用戶(hù)設(shè)定的符號(hào),它代表該指令所在的地址。標(biāo)號(hào)必須以字母開(kāi)頭,其后跟1~8個(gè)字母或數(shù)字,并以“:”結(jié)尾。

(3)操作碼是用英文縮寫(xiě)的指令功能助記符。它確定了本條指令完成什么樣的操作功能。任何一條指令都必須有該助記符項(xiàng),不得省略,如ADD表示加法操作。

(4)目的操作數(shù)給出操作的對(duì)象,并給出一個(gè)目標(biāo)地址,該目標(biāo)地址就是操作結(jié)果應(yīng)存放的單元地址,它與操作碼之間必須以一個(gè)或幾個(gè)空格分隔。

如上例中,A表示操作對(duì)象是累加器A的內(nèi)容,并指出操作結(jié)果又回送A中存放。

(5)源操作數(shù)指出的是一個(gè)源地址(或立即數(shù)),表示操作的對(duì)象或操作數(shù)的來(lái)源。它與目的操作數(shù)之間要用“,”號(hào)隔開(kāi)。

(6)注釋部分是在編寫(xiě)程序時(shí),為了增加程序的可讀性,由用戶(hù)擬寫(xiě)對(duì)該條指令或該段程序功能的說(shuō)明。它以分號(hào)“;”開(kāi)頭,可以用中文、英文或某些符號(hào)來(lái)表示,計(jì)

算機(jī)對(duì)注釋部分不進(jìn)行編譯,只在源程序中起說(shuō)明作用。為了描述方便,在介紹指令系統(tǒng)之前,先對(duì)描述指令的一些符號(hào)意義進(jìn)行一些簡(jiǎn)單約定:

(1)Ri和Rn:R表示當(dāng)前工作寄存器區(qū)中的工作寄存器,i表示0或1,即R0或R1。

n表示0~7,即R0~R7,當(dāng)前工作寄存器的選定是由PSW的RS1和RS0位決定的。

(2)#data:#表示立即數(shù)符號(hào),data為8位立即數(shù)。#data是指包含在指令中的8位立即數(shù)。

(3)#data16:包含在指令中的16位立即數(shù)。

(4)rel:相對(duì)地址,以8位補(bǔ)碼形式表示的地址偏移量,范圍為-128~+127,主要用于無(wú)條件相對(duì)短轉(zhuǎn)移指令SJMP和所有的條件相對(duì)轉(zhuǎn)移指令中。

(5)addr16:16位目的地址。目的地址可在全部程序存儲(chǔ)器的64KB空間范圍內(nèi),主要用于無(wú)條件長(zhǎng)轉(zhuǎn)移指令LJMP和子程序長(zhǎng)調(diào)用指令LCALL中。

(6)addr11:11位目的地址。目的地址應(yīng)與下條指令處于相同的2KB程序存儲(chǔ)器地址空間范圍內(nèi),主要用于絕對(duì)轉(zhuǎn)移指令A(yù)JMP和子程序絕對(duì)調(diào)用指令A(yù)CALL指令中。

(7)direct:表示直接尋址的地址,即8位內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM的單元地址(0~127/255),或特殊功能寄存器SFR的地址。對(duì)于特殊功能寄存器SFR可直接用寄存器名稱(chēng)來(lái)代替其直接地址。

(8)bit:內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM和特殊功能寄存器SFR中的可直接尋址的位地址。

(9)@:間接尋扯寄存器或基地址寄存器的前綴,如@Ri,@DPTR,表示寄存器間接尋址。

(10)(X):表示X地址中的內(nèi)容。

(11)((X)):表示由X尋址的單元中的內(nèi)容(X)作地址時(shí)該地址的內(nèi)容。

(12)/和→符號(hào):/表示對(duì)該位操作數(shù)取反后參與運(yùn)算,但不影響該位的值?!硎局噶畈僮髁鞒蹋瑢⒓^一方的內(nèi)容送入箭頭另一方的單元中去。3.1.3指令長(zhǎng)度和指令周期

1.指令長(zhǎng)度

指令長(zhǎng)度是指指令的機(jī)器代碼所占存儲(chǔ)單元的字節(jié)數(shù)。為了節(jié)省程序存儲(chǔ)器的空間,MCS-51單片機(jī)采用變長(zhǎng)的指令方式。從指令代碼的結(jié)構(gòu)來(lái)看,每條指令通常由操作碼和操作數(shù)兩部分組成。操作碼表示計(jì)算機(jī)執(zhí)行該指令將進(jìn)行何種操作,操作數(shù)表示參與操作的數(shù)據(jù)本身或操作數(shù)所在的地址。根據(jù)指令中操作數(shù)的多少,51單片機(jī)的指令可分為無(wú)操作數(shù)指令、單操作數(shù)指令和雙操作數(shù)指令3種情況。按指令長(zhǎng)度可分為3種類(lèi)型的指令:?jiǎn)巫止?jié)指令、雙字節(jié)指令和三字節(jié)指令。在圖3.2中給出了幾種典型指令的機(jī)器碼結(jié)構(gòu),其他指令的機(jī)器碼參見(jiàn)附錄B。圖3.2指令的機(jī)器碼

2.指令周期

指令周期是指CPU執(zhí)行一條指令所花費(fèi)的時(shí)間。由于執(zhí)行不同的指令所需要的時(shí)間不同,因此通常是以指令消耗的機(jī)器周期數(shù)為單位來(lái)確定指令周期。51系統(tǒng)中,一個(gè)指令周期通常含1~4個(gè)機(jī)器周期,大多數(shù)指令是單字節(jié)、單機(jī)器周期指令,還有一些指令是單字節(jié)、雙周期指令和雙字節(jié)、雙周期指令,而乘法指令MUL和除法指令DIV都是單字節(jié)四周期指令。

注意:指令的字節(jié)數(shù)越多,其機(jī)器代碼所占的存儲(chǔ)單元就越多。若指令周期中包含的機(jī)器周期數(shù)越多,則表明指令所需的執(zhí)行時(shí)間就越長(zhǎng)。但指令周期并不與指令的字節(jié)數(shù)成比例,如乘除法指令,雖然都是單字指令,但執(zhí)行時(shí)間最長(zhǎng),需要4個(gè)機(jī)器周期。指令獲得操作數(shù)所在的地址或轉(zhuǎn)移地址的方式稱(chēng)為尋址方式。指令通常由操作碼和操作數(shù)組成,而操作數(shù)又有目的操作數(shù)和源操作數(shù)之分,它們指出了參與運(yùn)算的數(shù)或該

數(shù)所在的單元地址。為了描述方便,對(duì)于有目的操作數(shù)和源操作數(shù)的雙操作數(shù)指令,在無(wú)特別聲明的情況下,某條指令的尋址方式一般是指源操作數(shù)的尋址方式。

尋址方式的多少是計(jì)算機(jī)功能強(qiáng)弱的重要標(biāo)志之一。51系列單片機(jī)有7種尋址方式,分別為:立即尋址、寄存器尋址、直接尋址、寄存器間接尋址、變址尋址、相對(duì)尋

址和位尋址。3.251系列單片機(jī)尋址方式3.2.1立即尋址

立即尋址是指CPU能夠立即得到操作數(shù)的一種尋址方式,它只適應(yīng)對(duì)源操作進(jìn)行尋址。在立即尋址方式中,源操作數(shù)直接出現(xiàn)在指令中,跟在操作碼的后面,作為指令的

一部分與操作碼一起存放在程序存儲(chǔ)器內(nèi),CPU可以立即得到源操作數(shù)并執(zhí)行,不需要另在寄存器或存儲(chǔ)器中尋找和讀取操作數(shù),故稱(chēng)為立即尋址。立即尋址中,該操作數(shù)稱(chēng)為

立即數(shù),并在其前冠以“#”號(hào)作前綴,表示并非地址。當(dāng)立即數(shù)以十六進(jìn)制數(shù)據(jù)表示時(shí),應(yīng)以H為后綴,當(dāng)數(shù)據(jù)以A~F開(kāi)頭時(shí)必須加前導(dǎo)0。十進(jìn)制數(shù)據(jù)可不帶后綴。立即數(shù)長(zhǎng)度可以是8位或16位。3.2.2寄存器尋址

將操作數(shù)存放于某寄存器中,CPU執(zhí)行指令時(shí)從寄存器中讀取操作數(shù),以完成指令規(guī)定的操作,稱(chēng)為寄存器尋址。

例如:

MOVA,R0;(A)←(R0)

該指令的功能是把工作寄存器R0中的內(nèi)容傳送到累加器A中,如R0內(nèi)容為88H,則執(zhí)行該指令后A的內(nèi)容也為88H。在該指令中,源操作數(shù)是由工作寄存器R0取得的,故該指令的尋址方式稱(chēng)為寄存器尋址方式。實(shí)際上該指令中目的操作數(shù)的尋址方式也是寄存器尋址方式。用寄存器尋址方式可以訪(fǎng)問(wèn)工作寄存器R0~R7,也可把特殊功能寄存器A、B、DPTR和CY(CY稱(chēng)為布爾處理機(jī)的累加器)作為尋址的對(duì)象,如MOVDPTR,#1234H;SETBC

等。3.2.3直接尋址

指令中直接給出操作數(shù)所在的存儲(chǔ)單元的地址,供指令讀取數(shù)據(jù)或存儲(chǔ)數(shù)據(jù),把這種尋址方式稱(chēng)為直接尋址。例如:

MOVA,60H;(A)←(60H)

該指令的功能是把內(nèi)部數(shù)據(jù)存儲(chǔ)器60H單元內(nèi)的內(nèi)容送到累加器A中。指令直接給出了源操作數(shù)的地址60H,其機(jī)器碼為E5H60H,源操作數(shù)屬于直接尋址方式。例如:

MOV30H,#12H;(30H)←12H

該指令的功能是把立即數(shù)#12H送到片內(nèi)RAM的30H單元。指令直接給出目的操作數(shù)的地址30H,目的源操作數(shù)屬于直接尋址方式,源操作數(shù)屬于立即尋址方式。

(1)51系列單片機(jī)的直接尋址用于訪(fǎng)問(wèn)內(nèi)部RAM的低128個(gè)單元。在指令中直接給出單元地址,地址范圍為00H~7FH。

(2)直接尋址用于訪(fǎng)問(wèn)高128個(gè)單元(80H~FFH)的特殊功能寄存器SFR。訪(fǎng)問(wèn)SFR時(shí),可在指令中直接給出特殊功能寄存器SFR的地址,但為了增強(qiáng)程序的可讀性,一般

都用寄存器名稱(chēng)來(lái)代替其地址。例如:

MOVP1,#35H;

目的操作數(shù)P1代表其口地址90H,目的操作數(shù)屬于直接尋址方式。其實(shí),該指令也可寫(xiě)成MOV90H,#35H;但可讀性差,一般不用此種寫(xiě)法。

(3)直接尋址還可直接訪(fǎng)問(wèn)片內(nèi)位地址空間。例如:

MOVC,P1.0

MOV20H,C

(4)直接尋址訪(fǎng)問(wèn)程序存儲(chǔ)器的指令有:長(zhǎng)轉(zhuǎn)移LJMPaddr16與絕對(duì)轉(zhuǎn)移AJMPaddr11指令、長(zhǎng)調(diào)用LCALLaddr16與絕對(duì)調(diào)用ACALLaddr11指令。它們都直接給出

了程序存儲(chǔ)器的16位地址(尋址范圍覆蓋64KB)或11位地址(尋址范圍覆蓋2KB)。

注意:①注意區(qū)別立即尋址和直接尋址的書(shū)寫(xiě)方法。例如:

MOVR0,#30H;立即尋址

MOVR1,30H;直接尋址,訪(fǎng)問(wèn)片內(nèi)RAM的30H單元

MOVR2,80H;直接尋址,訪(fǎng)問(wèn)SFR中的P0端口②A(yíng)累加器有3種表示方法,即A、ACC和A累加器地址E0H。使用這3種表示方法時(shí),對(duì)尋址方式的稱(chēng)呼雖然可能不同,但指令的執(zhí)行結(jié)果完全一樣。例如:

INCA;寄存器尋址方式

INCACC;寄存器尋址方式

INC0E0H;直接尋址方式③由于特殊功能寄存器SFR占用片內(nèi)RAM80H~FFH間的地址,對(duì)于51子系列,片內(nèi)RAM只有128個(gè)單元,它與SFR的地址沒(méi)有重疊;而對(duì)于52子系列,片內(nèi)RAM有256個(gè)單元,其高128個(gè)單元與SFR的地址是重疊的。為避免混淆,規(guī)定:直接尋址的指令不能訪(fǎng)問(wèn)片內(nèi)RAM的高128個(gè)單元(80H~FFH),若要訪(fǎng)問(wèn)這些單元只能用寄存器間接尋址指令,而要訪(fǎng)問(wèn)SFR只能用直接尋址的指令。3.2.4寄存器間接尋址

在指令中指定某一個(gè)寄存器的內(nèi)容作為操作數(shù)的地址,而該地址指定單元中的內(nèi)容便是操作數(shù)。這種尋址方法稱(chēng)為寄存器間接尋址方式,簡(jiǎn)稱(chēng)寄存器間址,也稱(chēng)為間接尋

址方式。通常將用來(lái)存放操作數(shù)地址的寄存器稱(chēng)為指針。

MCS-51中,用于間接尋址的寄存器有R0、R1、數(shù)據(jù)指針寄存器DPTR和堆棧指針SP。

用R0、R1或DPTR作為地址指針寄存器時(shí),應(yīng)在寄存器符號(hào)前加前綴“@”,用于表示間接尋址。

(1)用R0和R1作為地址指針來(lái)尋址片內(nèi)數(shù)據(jù)存儲(chǔ)器RAM(00H~FFH)中的256個(gè)單元。例如:

MOVA,@R0;(A)←((R0))

該指令的功能是將R0所指示的片內(nèi)RAM單元中的數(shù)據(jù)傳送到累加器A中去。例如,若R0的內(nèi)容為30H,片內(nèi)RAM30H單元中的內(nèi)容是0FH,則執(zhí)行該指令后,片內(nèi)RAM30H

單元的內(nèi)容0FH被送到累加器A中,如圖3.3(a)所示。圖3.3寄存器間接尋址(a)MOVA,@R0;(b)MOVA,@DPTR

(2)用MOVX指令和R0、R1訪(fǎng)問(wèn)片外數(shù)據(jù)存儲(chǔ)器(片外RAM)的00H~0FFH單元。用MOVX指令和DPTR訪(fǎng)問(wèn)片外RAM的64KB空間。

例如,設(shè)(DPTR)=2000H,則MOVXA,@DPTR執(zhí)行過(guò)程如圖3.3(b)所示。

(3)堆棧操作指令也是間接尋址方式,它以SP為指針

注意:寄存器間接尋址不能訪(fǎng)問(wèn)特殊功能寄存器SFR。3.2.5變址尋址

變址尋址是將基址寄存器與變址寄存器的內(nèi)容相加,其結(jié)果作為操作數(shù)地址的一種尋址方式。它以數(shù)據(jù)指針DPTR或程序計(jì)數(shù)器PC作為基址寄存器,累加器A作為變址寄

存器,兩者的內(nèi)容相加形成16位的程序存儲(chǔ)器地址,該地址就是操作數(shù)所在地址。例如:

MOVCA,@A+DPTR;(A)←((A)+(DPTR))

設(shè)該指令執(zhí)行之前,(A)=05H,(DPTR)=2000H,(2005H)=35H。執(zhí)行時(shí),將(A)+(DPTR)的值2005H作為地址,把程序存儲(chǔ)器2005H單元的數(shù)據(jù)35H傳送到累加器A中,如圖3.4所示。圖3.4變址尋址

注意:①這種變址尋址方式用于對(duì)程序存儲(chǔ)器的尋址,只有3條變址尋址指令:

MOVCA,@A+DPTR

MOVCA,@A+PC

JMP@A+DPTR

②主要用于訪(fǎng)問(wèn)程序存儲(chǔ)器中的數(shù)據(jù)表格,或?qū)崿F(xiàn)程序的轉(zhuǎn)移。3.2.6相對(duì)尋址

相對(duì)尋址是以當(dāng)前程序計(jì)數(shù)器PC的值加上指令規(guī)定的偏移量rel構(gòu)成實(shí)際操作數(shù)地址的尋址方法。相對(duì)尋址用來(lái)訪(fǎng)問(wèn)程序存儲(chǔ)器,常用于相對(duì)轉(zhuǎn)移指令中。

使用相對(duì)尋址時(shí)要注意以下兩點(diǎn):

(1)當(dāng)前PC值是指相對(duì)轉(zhuǎn)移指令所在地址(一般稱(chēng)為源地址)加上轉(zhuǎn)移指令的字節(jié)數(shù)。即

當(dāng)前PC值=源地址+轉(zhuǎn)移指令字節(jié)數(shù)

例如,JZrel是一條累加器A為零轉(zhuǎn)移的雙字節(jié)指令。若該指令地址(源地址)為5000H,則執(zhí)行該指令時(shí)的當(dāng)前PC值即為5002H。

(2)偏移量rel是有符號(hào)的單字節(jié)數(shù),以補(bǔ)碼表示,其相對(duì)值的范圍為-128~+127,負(fù)數(shù)表示從當(dāng)前地址向前轉(zhuǎn)移,正數(shù)表示從當(dāng)前地址向后轉(zhuǎn)移。所以,相對(duì)轉(zhuǎn)移指令滿(mǎn)

足轉(zhuǎn)移條件后,轉(zhuǎn)移的地址(目的地址)應(yīng)為

目的地址=當(dāng)前PC值+rel=源地址+轉(zhuǎn)移指令字節(jié)數(shù)+rel3.2.7位尋址

位尋址是指令中可以直接給出位地址,CPU按位進(jìn)行訪(fǎng)問(wèn)的一種尋址方式。位尋址方式可以對(duì)內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM20H~2FH中的128位和特殊寄存器SFR中的可尋址位進(jìn)

行位尋址,位操作指令可對(duì)位尋址空間和相關(guān)端口的每一位進(jìn)行傳送及邏輯操作。

例如:

SETBP1.0;(P1.0)←1

該指令的功能是將P1端口的第0位置1。

綜上所述,在51系列單片機(jī)的存儲(chǔ)空間中,指令究竟對(duì)哪個(gè)存儲(chǔ)器空間進(jìn)行操作是由指令操作碼和尋址方式確定的。7種尋址方式及適用空間見(jiàn)表3.1。表3.17種尋址方式及適用空間3.3.1數(shù)據(jù)傳送指令

在51系列單片機(jī)指令系統(tǒng)中,有以下幾種數(shù)據(jù)傳送指令:(1)內(nèi)部RAM與特殊功能寄存器之間的數(shù)據(jù)傳送,這類(lèi)指令使用“MOV”作為指令操作碼的助記符。

(2)外部RAM與累加器A之間的數(shù)據(jù)傳送,這類(lèi)指令使用“MOVX”作為指令操作碼的助記符。3.3指令系統(tǒng)

(3)將程序存儲(chǔ)器ROM中某一單元的信息傳送到累加器A中的指令,這類(lèi)指令使用“MOVC”作為指令操作碼的助記符。

(4)堆棧操作指令,分別使用PUSH和POP指令。

(5)字節(jié)交換指令,指令助記符為XCH、XCHD、SWAP等幾類(lèi)。

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

內(nèi)部RAM與特殊功能寄存器之間的數(shù)據(jù)傳送指令使用“MOV”作為指令操作碼的助記符,指令格式如下:

MOV目的操作數(shù),源操作數(shù);目的操作數(shù)←源操作數(shù)指令的功能是:把源操作數(shù)的內(nèi)容送入目的操作數(shù)。

例如,MOVA,R7,該指令執(zhí)行時(shí)將工作寄存器R7中的內(nèi)容送入累加器A中。MOV指令用于單片機(jī)內(nèi)部的數(shù)據(jù)傳送,主要指A、Rn、片內(nèi)RAM、SFR間的數(shù)據(jù)傳送。圖3.5

給出了MOV指令的數(shù)據(jù)傳送方向示意圖。圖3.5MOV指令數(shù)據(jù)傳送方向示意圖

(1)以累加器A為目的操作數(shù)的指令。

MOVA,#data;(A)←#data,#data表示8位立即數(shù)

MOVA,direct;(A)←(direct),direct表示8位直接尋址的

;地址直接地址00H~7FH,訪(fǎng)問(wèn)片內(nèi)RAM;直接地址80H~FFH,訪(fǎng)問(wèn)SFR

MOVA,Rn;(A)←(Rn),n=0~7,Rn表示R0~R7

MOVA,@Ri;(A)←((Ri)),Ri表示R0和R1,@Ri一定訪(fǎng)

;問(wèn)片內(nèi)RAM

(2)以Rn為目的操作數(shù)的指令。

MOVRn,#data;(Rn)←#data

MOVRn,A;(Rn)←(A)

MOVRn,direct;(Rn)←(direct)

;00H~7FH訪(fǎng)問(wèn)片內(nèi)RAM,80H~FFH訪(fǎng)問(wèn)SFR

這組指令的功能是:把源操作數(shù)的內(nèi)容送入當(dāng)前工作寄存器區(qū)的R0~R7中的某一寄存器。例如:MOVR0,30H;將片內(nèi)RAM30H單元中的數(shù)據(jù)傳送至工作寄存器R0。

(3)以direct為目的操作數(shù)的指令。

MOVdirect,A ;如MOV40H,A

MOVdirect,Rn ;如MOVP1,R3

MOVdirect,direct ;如MOV30H,31H

MOVdirect,#data;如MOVP1,#0FH

MOVdirect,@Ri ;如MOV60H,@R0

MOVDPTR,#data16;如MOVDPTR,#1234H這組指令的功能為:把源操作數(shù)的內(nèi)容送入內(nèi)部RAM單元或特殊功能寄存器。其中,MOVdirect,direct指令和MOVDPTR,#data16指令都是三字節(jié)指令。而直接地址間數(shù)傳指令的功能很強(qiáng),能實(shí)現(xiàn)內(nèi)部RAM之間、特殊功能寄存器之間或特殊功能寄存器與內(nèi)部RAM之間的直接數(shù)據(jù)傳送。最后一條指令是將16位的立即數(shù)送入數(shù)據(jù)指針寄存器DPTR。

(4)以@Ri為目的操作數(shù)的指令。

MOV@Ri,A;如MOV@R0,A

MOV@Ri,direct;如MOV@R0,30H

MOV@Ri,#data;如MOV@R0,#30H

注意:

MOV指令用于單片機(jī)內(nèi)部的數(shù)據(jù)傳送,在圖3.5中,虛線(xiàn)表示的數(shù)據(jù)傳送是以@Ri間接尋址方式進(jìn)行的,在此種指令中,不允許目的操作數(shù)和源操作數(shù)同時(shí)為間接尋址方式。另外,Rn之間不允許相互傳送數(shù)據(jù)。例如,下列各指令都是非法指令格式:

MOVRn,Rn;非法指令格式

MOV@Ri,@Ri;非法指令格式

MOVRn,@Ri;非法指令格式

MOV@Ri,Rn;非法指令格式例3.3.1

分析下列指令,判斷其指令格式是否正確。

(1)MOVA,P1;正確

(2)MOV30H,P1;正確,目的操作數(shù)為片內(nèi)RAM,源操作數(shù)為SFR

(3)MOVP0,P1;正確,源操作數(shù)和目的操作數(shù)均為SFR

(4)MOV50H,60H;正確,源操作數(shù)和目操作數(shù)均為片內(nèi)RAM

(5)MOV30H,#25H;正確(6)MOV30H,@R0;正確,@R0一定為片內(nèi)RAM

(7)MOVR0,R1;非法指令

(8)MOV@R0,P1;正確,@R0一定為片內(nèi)RAM

(9)MOV@R0,A;正確,@R0一定為片內(nèi)RAM

(10)MOV@R0,@R1;非法指令

(11)MOVR3,@R0;非法指令這組指令的功能為:在累加器A與外部數(shù)據(jù)存儲(chǔ)器RAM單元或I/O端口之間進(jìn)行數(shù)據(jù)傳送,前兩條指令執(zhí)行時(shí),P3.7(信號(hào))引腳上輸出有效信號(hào),作為外部數(shù)

據(jù)存儲(chǔ)器的讀選通信號(hào);后兩條指令執(zhí)行時(shí),在P3.6(信號(hào))引腳上輸出有效信號(hào),用作外部數(shù)據(jù)存儲(chǔ)器的寫(xiě)選通信號(hào)。

例3.3.2

把外部RAM3000H單元的數(shù)據(jù)傳送到2000H單元中(片外兩單元之間的數(shù)據(jù)傳送)。

解因?yàn)闆](méi)有片外兩存儲(chǔ)單元之間直接傳送數(shù)據(jù)的指令,只能通過(guò)累加器A進(jìn)行中轉(zhuǎn)才能完成把3000H單元中的數(shù)據(jù)傳送到2000H單元中。參考程序如下:

MOVDPTR,#3000H;設(shè)置源數(shù)據(jù)指針,

;DPTR←3000H單元地址

MOVXA,@DPTR;A←(3000H)

MOVDPTR,#2000H;設(shè)置目的數(shù)據(jù)指針,

;DPTR←2000H單元地址

MOVX@DPTR,A;(2000H)←A

例3.3.3

把從60H單元開(kāi)始的外部RAM中的16個(gè)字節(jié)數(shù)據(jù)依次傳送到以30H開(kāi)始的內(nèi)部RAM區(qū)域中(片外與片內(nèi)的數(shù)據(jù)塊傳送)。

解對(duì)于片外RAM與片內(nèi)RAM間的數(shù)據(jù)傳送,也只能通過(guò)累加器A進(jìn)行傳送。參考程序如下:

MOVR0,#30H;R0為目的數(shù)據(jù)地址指針

MOVR7,#16;R7為計(jì)數(shù)器

MOVR1,#60H;R1為源數(shù)據(jù)地址指針

NEXT:MOVXA,@R1

MOV@R0,A

INCR1

INCR0

DJNZR7,NEXT

例3.3.4

將外部RAM2000H~2020H單元的數(shù)據(jù)傳送到以3000H為首址的外部RAM中。

解在外部RAM之間進(jìn)行批量數(shù)據(jù)傳送時(shí),可先將外部RAM數(shù)據(jù)傳送到內(nèi)部RAM中,然后再傳送到外部RAM目標(biāo)地址。參考程序如下:

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

MOVR0,#30H

MOVR7,#20H

MOVDPTR,#2000H

LOOP1:MOVXA,@DPTR

MOV@R0,A

INCDPTR

INCR0

DJNZR7,LOOP1

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

MOVR0,#30H

MOVR7,#20H

MOVDPTR,#3000H

LOOP2:MOVA,@R0

MOVX@DPTR,A

INCDPTR

INCR0

DJNZR7,LOOP2第一條指令是以DPTR作為基址寄存器,累加器A的內(nèi)容作為無(wú)符號(hào)數(shù)與DPTR的值相加,得到一個(gè)16位地址,并把該地址指示的程序存儲(chǔ)器單元的內(nèi)容送到累加器A。這條

指令的執(zhí)行結(jié)果只與指針DPTR及累加器A的內(nèi)容有關(guān),與該指令存放的地址無(wú)關(guān)。因此,表格的大小和位置可以存放在64KB程序存儲(chǔ)器中任意位置,并且一個(gè)表格可以為各個(gè)程序塊所共用。第二條指令是以PC作為基址寄存器,A的內(nèi)容作為無(wú)符號(hào)數(shù)和PC的當(dāng)前值(下一條指令的起始地址)相加后得到一個(gè)16位地址,并將該地址指示的程序存儲(chǔ)器單元的內(nèi)容

送到累加器A。這條指令的缺點(diǎn)是,表格只能放在該條查表指令后面的256個(gè)單元之中,表格的大小受限制,而且表格只能被一段程序利用。

通常把MOVCA,@A+DPTR稱(chēng)為遠(yuǎn)程查表指令,把MOVCA,@A+PC稱(chēng)為近程查表指令。近程查表指令往往需要對(duì)地址增加適當(dāng)?shù)男拚俊?/p>

例3.3.5

編寫(xiě)一個(gè)子程序,其入口參數(shù)A為一個(gè)0~9的數(shù)(BCD碼),利用查表指令找出其對(duì)應(yīng)的ASCII碼,求得的ASCII碼存放于A(yíng)中返回。

解所謂表格是指在程序中定義了一串有序的常數(shù),如ASCII碼表、平方表、字型碼表、鍵碼表等。因?yàn)槌绦蛞话愣际枪袒诔绦虼鎯?chǔ)器(通常是只讀存儲(chǔ)器ROM類(lèi)型)中,

所以可以說(shuō)表格是預(yù)先定義在程序的數(shù)據(jù)區(qū)中,然后和程序一起固化在ROM中的一串常數(shù)。查表程序的關(guān)鍵是表格的定義和如何實(shí)現(xiàn)查表。程序1,遠(yuǎn)程查表:

BCD-ASC1:MOVDPTR,#TAB;取表格首址#TAB

MOVCA,@A+DPTR

RET

TAB:DB′0123456789′;定義ASCII碼表,TAB為表格

首址

程序2,近程查表:

BCD-ASC2:INCA;(A)←(A)+1,增加的修正量

MOVCA,@A+PC

RET

TAB:DB′0123456789′;ASCII碼表執(zhí)行MOVCA,@A+PC指令時(shí),PC的當(dāng)前值指向的是RET指令,沒(méi)有指向TAB的首地址。RET指令代碼占一個(gè)單元,子程序用INCA指令對(duì)A加1,是為了“繞過(guò)”RET

指令所占的一個(gè)單元而增加的修正量。

例3.3.6

在外部程序存儲(chǔ)器ROM/EPROM中,從TABLE單元開(kāi)始依次存放有0~9的平方值(常數(shù)表格,表格首址為T(mén)ABLE)。設(shè)累加器A中有一個(gè)0~9范圍內(nèi)的數(shù),從上述常數(shù)表格中查找該數(shù)的平方值。解程序1:用MOVCA,@A+DPTR指令查表

MOVA,#2;設(shè)要查找2的平方值

MOVDPTR,#2000H;取表格首址

MOVCA,@A+DPTR;(A)←((DPTR)+(A))

ORG2000H;設(shè)表格首址為2000H

TABLE:DB0,1,4,9,16,25,36,49,81;常數(shù)表格

;執(zhí)行前若(A)=2,則執(zhí)行后(A)=4程序2:用MOVCA,@A+PC指令查表

MOVA,#2;設(shè)要查找2的平方值

ADDA,#3;A加修正量3,因?yàn)長(zhǎng)JMPNEXT是3字節(jié)指令MOVCA,@A+PC;(A)←((PC)+(A))

LJMPNEXT

TABLE:DB0,1,4,9,16,25,36,49,81

NEXT:…

;程序跳過(guò)常數(shù)表格后繼續(xù)

4.堆棧操作指令

在程序?qū)嶋H運(yùn)行中,需要一個(gè)先進(jìn)后出的堆棧區(qū),在子程序調(diào)用、中斷服務(wù)程序等場(chǎng)合用以保護(hù)現(xiàn)場(chǎng),這種先進(jìn)后出的緩沖區(qū)稱(chēng)為堆棧區(qū)。51系列單片機(jī)的堆棧區(qū)設(shè)定在片

內(nèi)RAM中,SP為堆棧指針寄存器,其長(zhǎng)度為8位。系統(tǒng)復(fù)位后SP之值為07H。單片機(jī)堆棧區(qū)域不是固定的,原則上可設(shè)在內(nèi)部RAM的任意區(qū)域,但為了避開(kāi)使用頻率較高的工作寄存器區(qū)和位尋址區(qū),一般設(shè)在60H以后的范圍內(nèi)。堆棧有兩種最基本操作:向堆棧存入數(shù)據(jù)稱(chēng)為“入棧”或“壓入堆?!?PUSH);從堆棧取出數(shù)據(jù)稱(chēng)為“出棧”或“彈出堆?!?POP)。堆棧中數(shù)據(jù)的存取采用先進(jìn)后出的

方式,即先入棧的數(shù)據(jù),后彈出,類(lèi)似貨棧堆放貨物的存取方式,“堆棧”一詞也因此而得名。

入棧指令為:

PUSHdirect;(SP)←(SP)+1

;((SP))←(direct)圖3.6入棧示意圖例:MOVSP,#30H

MOVA,#78H

PUSHA

數(shù)據(jù)入棧時(shí),先將堆棧指針SP的內(nèi)容加1,然后將數(shù)據(jù)送入堆棧,如圖3.6所示。

出棧指令為:

POPdirect;(direct)←((SP))

;(SP)←(SP)-1

數(shù)據(jù)出棧時(shí),按SP的指示先把數(shù)據(jù)出棧,接著堆棧指針SP的內(nèi)容自動(dòng)減1。

例3.3.7

編寫(xiě)中斷服務(wù)程序,進(jìn)入中斷服務(wù)程序時(shí),需要把程序狀態(tài)寄存器PSW、累加器A、數(shù)據(jù)指針DPTR進(jìn)棧保護(hù),中斷返回之前恢復(fù)。

解中斷服務(wù)程序如下:

PUSHPSW

PUSHACC

PUSHDPL

PUSHDPH

;中斷處理程序

POPDPH

POPDPL

POPACC

POPPSW

RET;中斷返回

例3.3.8

設(shè)片內(nèi)RAM(30H)=12H,(40H)=34H,試用堆棧實(shí)現(xiàn)30H和40H單元中的數(shù)據(jù)互換。

解參考程序如下,堆棧變化如圖3.7所示。

MOVSP,#50H;設(shè)置SP為50H

PUSH30H;12H壓棧,注意,PUSH后緊跟直接地址

PUSH40H;34H壓棧

POP30H;34H出棧,存入30H單元

POP40H;12H出棧,存入40H單元圖3.7堆棧變化示意圖(a)入棧示意圖;(b)出棧示意圖注意:

(1)堆棧操作與RAM操作的區(qū)別。堆棧作為內(nèi)部RAM的一個(gè)特殊區(qū)域,有其獨(dú)特性。

使用內(nèi)部RAM必須知道單元具體地址,而堆棧只需設(shè)置好棧底地址,就可放心使用,無(wú)需再記住單元具體地址。堆棧所特有的先進(jìn)后出的特點(diǎn),使數(shù)據(jù)彈出之后,存儲(chǔ)單元自

動(dòng)回收,雖然數(shù)據(jù)仍在RAM中,但從邏輯上認(rèn)為該數(shù)據(jù)已不存在了,存儲(chǔ)單元可再次使用,充分提高了內(nèi)存的利用率;而內(nèi)部RAM的操作是不能實(shí)現(xiàn)存儲(chǔ)單元自動(dòng)回收和再利用的,必須通過(guò)編程重新分配,才能再次使用。

(2)51系列單片機(jī)的堆棧區(qū)是向上生成的,因此設(shè)置SP初值時(shí)要充分考慮堆棧的深度,預(yù)留出足夠的內(nèi)存空間,滿(mǎn)足堆棧使用,否則就會(huì)發(fā)生堆棧溢出引起程序出錯(cuò)。

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

XCHA,Rn;(A)(Rn)

XCHA,@Ri;(A)((Ri))

XCHA,direct;(A)(direct)

XCHDA,@Ri;(A)3~0((Ri))3~0

SWAPA;(A)7~4(A)3~0

XCH指令是將累加器A的內(nèi)容和源操作數(shù)內(nèi)容相互交換;XCHD是半字節(jié)交換指令,是將累加器A的低4位二進(jìn)制數(shù)和(Ri)所指示的內(nèi)部RAM單元的低4位相互交換,高4

位數(shù)保持不變。SWAP是將累加器A中的高4位與低4位進(jìn)行交換。

例如,設(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ù)傳送到目的操作數(shù)中覆蓋了目的操作數(shù)原來(lái)的內(nèi)容。再如,設(shè)累加器A的值為2EH,R0的內(nèi)容為30H,內(nèi)部RAM30單元的內(nèi)容為48H,執(zhí)行XCHDA,@R0指令后,累加器A的內(nèi)容為28H,內(nèi)部RAM30H單元的內(nèi)容將為4EH,即A與寄存器R0指定的內(nèi)存單元的低4位交換,而高4位不變。

3.3.2算術(shù)運(yùn)算指令

算術(shù)運(yùn)算指令用來(lái)完成各種算術(shù)運(yùn)算。51系列單片機(jī)有加、減、乘、除4種算術(shù)運(yùn)算。

1.加法指令

1)不帶進(jìn)位的加法指令

ADDA,#data;(A)←(A)+#data

ADDA,Rn;(A)←(A)+(Rn)

ADDA,direct;(A)←(A)+(direct)

ADDA,@Ri;(A)←(A)+((Ri))

上述指令完成累加器A與相應(yīng)源操作數(shù)的相加,結(jié)果存放在累加器A中,且運(yùn)算對(duì)程序狀態(tài)寄存器PSW中的標(biāo)志位產(chǎn)生影響。

注意:用戶(hù)可根據(jù)需要把參與運(yùn)算的數(shù)據(jù)看成無(wú)符號(hào)數(shù)(0~255),也可以把它們看成帶符號(hào)數(shù)(補(bǔ)碼數(shù))。無(wú)符號(hào)數(shù)參與運(yùn)算時(shí),關(guān)心進(jìn)位標(biāo)志位CY,若CY=0,則表示運(yùn)算結(jié)果小于等于255,沒(méi)有進(jìn)位;若CY=1,則表示運(yùn)算結(jié)果大于255,產(chǎn)生了進(jìn)位。帶符號(hào)數(shù)參與運(yùn)算時(shí),關(guān)心溢出標(biāo)志位OV,若OV=0,則表示運(yùn)算正確,運(yùn)算結(jié)果在-128~+127范圍內(nèi);若OV=1,則表示運(yùn)算出錯(cuò),運(yùn)算結(jié)果超出了-

128~+127范圍,需要進(jìn)行出錯(cuò)處理。溢出標(biāo)志OV和進(jìn)位標(biāo)志CY是兩種不同性質(zhì)的標(biāo)志。

例3.3.9

試分析執(zhí)行下列指令后,PSW中CY、OV、AC及P標(biāo)志位的狀態(tài)。

MOVA,#0FFH

ADDA,#02H

ADD指令的執(zhí)行過(guò)程及運(yùn)算結(jié)果如圖3.8所示。溢出標(biāo)志的判斷方法為:

OV=CY

,其中為次高位向最高位的進(jìn)位。圖3.8ADD對(duì)PSW的影響

2)帶進(jìn)位加法指令

ADDCA,#data;(A)←(A)+#data+CY

ADDCA,Rn;(A)←(A)+(Rn)+CY

ADDCA,direct;(A)←(A)+(direct)+CY

ADDCA,@Ri;(A)←(A)+((Ri))+CY

這組指令的功能與加法指令類(lèi)似,惟一的不同之處是,在執(zhí)行加法時(shí),還要將進(jìn)位標(biāo)志CY的內(nèi)容加進(jìn)去,對(duì)于標(biāo)志位的影響與普通加法指令相同。

例如,可通過(guò)如下指令將存放在30H、31H單元中的16位二進(jìn)制數(shù)與存放在32H、33H單元中的16位二進(jìn)制數(shù)相加并將結(jié)果存放在30H、31H中。

MOVA,30H;將被加數(shù)低8位送到累加器A

ADDA,32H;與加數(shù)低8位,即32H單元內(nèi)容相

;加,結(jié)果存放在A(yíng)中

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

MOVA,31H;將被加數(shù)高8位送累加器A

ADDCA,33H;與加數(shù)高8位,即33H單元內(nèi)容相

;加,結(jié)果存放在累加器A中由于低8

;位相加時(shí),結(jié)果可能大于0FFH,產(chǎn)

;生進(jìn)位,因此在高8位相加時(shí)用

;ADDC指令

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

3)增量指令

INCA;(A)←(A)+1

INCRn;(Rn)←(Rn)+1

INCdirect;(direct)←(direct)+1

INC@Ri;((Ri))←((Ri))+1

INCDPTR;(DPTR)←(DPTR)+1這組指令的功能是將指令中所指出操作數(shù)的內(nèi)容加1。除INCA影響P標(biāo)志外,這組指令都不影響任何標(biāo)志。若原來(lái)的內(nèi)容為0FFH,則加1后使操作數(shù)的內(nèi)容變成00H,但不影響任何標(biāo)志(除INCA影響P標(biāo)志外)。最后一條指令是對(duì)16位的數(shù)據(jù)指針寄存器DPTR加1。

注意:INC指令中,當(dāng)操作數(shù)是某一I/O端口時(shí),如“

INCP1”,先將P1口鎖存器內(nèi)容讀出,加1后,再寫(xiě)入P1口鎖存器中,因此INCPi(i=0,1,2,3)屬于“讀—修改—寫(xiě)”指令。

4)十進(jìn)制調(diào)整指令

DAA

這條指令用于壓縮BCD碼加法運(yùn)算的十進(jìn)制調(diào)整。它只能跟在A(yíng)DD或ADDC指令之后,對(duì)累加器A中所獲得的8位運(yùn)算結(jié)果進(jìn)行十進(jìn)制調(diào)整,使A中的內(nèi)容調(diào)整為二位BCD碼。它判斷A中的低4位是否大于9和輔助進(jìn)位標(biāo)志AC是否為“1”,若兩者有一個(gè)條件滿(mǎn)足,則低4位加6;同樣,A中的高4位大于9或進(jìn)位標(biāo)志CY為“1”,若兩者有一個(gè)條件滿(mǎn)足時(shí),則高4位加6。例如,兩個(gè)BCD數(shù)36與45相加,結(jié)果應(yīng)為BCD碼81,程序如下:

MOVA,#36H

ADDA,#45H

DAA

該程序中,第一條指令將立即數(shù)36H(BCD碼36)送入累加器A;第二條指令完成加法,結(jié)果為7BH;第三條指令對(duì)累加器A進(jìn)行十進(jìn)制調(diào)整,低4位(為0BH)大于9。因此,

要加6,得調(diào)整的BCD碼81。

注意:這條指令不能對(duì)減法指令的結(jié)果進(jìn)行調(diào)整,且其結(jié)果不影響溢出標(biāo)志位。

例3.3.10

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

51單片機(jī)沒(méi)有減法的十進(jìn)制調(diào)整指令,而DAA指令只能對(duì)加法進(jìn)行調(diào)整。

所以,可將減法用加法來(lái)實(shí)現(xiàn),減1相當(dāng)于加99。因此,實(shí)現(xiàn)兩位BCD碼減1的程序如下:

MOVA,R2

ADDA,#99H

DAA

MOVR2,A

2.減法指令

1)帶借位減法指令

SUBBA,#data;(A)←(A)-#data-CY

SUBBA,Rn;(A)←(A)-(Rn)-CY

SUBBA,direct;(A)←(A)-(direct)-CY

SUBBA,@Ri;(A)←(A)-((Ri))-CY

這組指令的功能是:將累加器A的內(nèi)容與第二操作數(shù)及進(jìn)位標(biāo)志相減,結(jié)果送回累加器A中。在執(zhí)行減法過(guò)程中,如果D7有借位,則進(jìn)位標(biāo)志CY置“1”,否則CY清“0”;如果D3有借位,則輔助進(jìn)位標(biāo)志AC置“1”,否則清“0”;如果D6有借位而D7沒(méi)有借位,或D7有借位而D6沒(méi)有借位,則溢出標(biāo)志OV置“1”,否則清“0”。

注意:51單片機(jī)沒(méi)有不帶借位的減法指令。若要進(jìn)行不帶借位的減法操作,則可以先將CY清“0”然后再用減法指令。

例3.3.11

求內(nèi)部RAM兩單元的差值,被減數(shù)存放在內(nèi)部30H單元,減數(shù)存放在31H單元,將差放在30H單元。

MOVA,30H;被減數(shù)送累加器A

CLRC ;進(jìn)位標(biāo)志CY清零

SUBBA,31H;與31H單元內(nèi)容相減

MOV30H,A;將結(jié)果保存在30H單元

2)減1指令

DECA ;(A)←(A)-1

DECRn ;(Rn)←(Rn)-1

DECdirect ;(direct)←(direct)-1

DEC@Ri ;((Ri))←((Ri))-1

這組指令的功能是將相應(yīng)的操作數(shù)減1。除DECA影響P標(biāo)志外,這組指令都不影響任何標(biāo)志。若原來(lái)的內(nèi)容為00H,則減1后使操作數(shù)的內(nèi)容變成FFH,但不影響任

何標(biāo)志(除DECA影響P標(biāo)志外)。

3.乘法指令

完成單字節(jié)乘法運(yùn)算,只有一條指令:

MULAB;(B7~0A7~0)←(A)*(B)

將累加器A的內(nèi)容與寄存器B的內(nèi)容相乘,乘積的低8位存放在累加器A中,高8位存放于寄存器B中。如果乘積超過(guò)0FFH,則溢出標(biāo)志OV置“1”,否則清“0”。乘法指令執(zhí)行后進(jìn)位標(biāo)志CY總是為“0”。

4.除法指令

完成單字節(jié)的除法,只有一條指令:

DIVAB;(A)←(A)/(B)的商

;(B)←(A)/(B)的余數(shù)

將累加器A中的內(nèi)容除以寄存器B中的8位無(wú)符號(hào)整數(shù),所得商存放在累加器A中,余數(shù)存放在寄存器B中,清進(jìn)位標(biāo)志CY和溢出標(biāo)志OV。若原來(lái)B中的內(nèi)容為0,則執(zhí)行該指令后A與B中的內(nèi)容不定,并將溢出標(biāo)志OV置“1”。在任何情況下,進(jìn)位標(biāo)志CY總是被清“0”。3.3.3邏輯運(yùn)算指令與移位指令

1.邏輯與指令

ANLA,#data;(A)←(A)∧#data

ANLA,Rn ;(A)←(A)∧(Rn)

ANLA,direct ;(A)←(A)∧(direct)

ANLA,@Ri ;(A)←(A)∧((Ri))

ANLdirect,A ;(direct)←(direct)∧(A)

ANLdirect,#data ;(direct)←(direct)∧#data[這組指令的功能是將兩個(gè)操作數(shù)的內(nèi)容按位進(jìn)行邏輯與操作,并將結(jié)果送回目的操作數(shù)單元中。

例如,(A)=35H,執(zhí)行ANLA,#0FH后,(A)=05H。

2.邏輯或指令

ORLA,#data;(A)←(A)∨#data

ORLA,Rn;(A)←(A)∨(Rn)

ORLA,direct;(A)←(A)∨(direct)

ORLA,@Ri;(A)←(A)∨((Ri))

ORLdirect,A;(direct)←(direct)∨(A)

ORLdirect,#data;(direct)←(direct)∨#data

這組指令的功能是將兩個(gè)操作數(shù)的內(nèi)容按位進(jìn)行邏輯或操作,并將結(jié)果送回目的操作數(shù)單元中。

3.邏輯異或指令

XRLA,#data;(A)←(A)#data

XRLA,Rn;(A)←(A)(Rn)

XRLA,direct;(A)←(A)(direct)

XRLA,@Ri;(A)←(A)((Ri))

XRLdirect,A;(direct)←(direct)(A)

XRLdirect,#data;(direct)←(direct)#data

這組指令的功能是將兩個(gè)操作數(shù)的內(nèi)容按位進(jìn)行邏輯異或操作,并將結(jié)果送回到目的操作數(shù)單元中。

4.移位指令

RLA;累加器A的內(nèi)容向左環(huán)移1位

RRA;累加器A的內(nèi)容向右環(huán)移1位

RLCA;累加器A的內(nèi)容帶進(jìn)位標(biāo)志位向左環(huán)移1位

RRCA;累加器A的內(nèi)容帶進(jìn)位標(biāo)志位向右環(huán)移1位這組指令的功能是對(duì)累加器A的內(nèi)容進(jìn)行簡(jiǎn)單的移位操作。除了帶進(jìn)位標(biāo)志位的移位指令外,其他都不影響CY,AC和OV等標(biāo)志,如圖3.9所示。圖3.9移位指令(a)RLA;(b)RRA;(c)RLCA;(d)RRCA5.累加器A清零與取反指令

CLRA;累加器A清0

CPLA;累加器A按位取反

例3.3.12利用移位指令把片內(nèi)RAM的30H單元的數(shù)據(jù)乘2,乘積的低8位存

放于片內(nèi)RAM的30H單元中,高8位存放于31H單元中。

解參考程序如下:

MOVA,30H

CLRC

RLCA;數(shù)據(jù)與2相乘,超出位存于CY

MOV30H,A;乘積的低8位存放在30H單元中

CLRA;累加器A清0

RLCA;CY移入A

MOV31H,A;乘積的高8位存放于31H單元中

例3.3.13

求雙字節(jié)數(shù)的補(bǔ)碼。設(shè)有一個(gè)16位二進(jìn)制正數(shù)X,X的高8位存放在R3中,X的低8位存放在R2中,求-X的補(bǔ)碼。其補(bǔ)碼仍存放于R3和R2中。

解參考程序如下:

MOVA,R2 ;取低8位

CPLA ;低8位取反

ADDA,#01H ;取低8位+1

MOVR2,A ;存低8位

MOVA,R3 ;取高8位

CPLA ;取高8位取反

ADDCA,#00H ;加低8位的進(jìn)位

MOVR3,A ;存高8位

例3.3.14

設(shè)片內(nèi)RAM的20H單元和21H單元各有一個(gè)8位數(shù)據(jù):

(20H)=X7X6X5X4X3X2X1X0

(21H)=Y7Y6Y5Y4Y3Y2Y1Y0

現(xiàn)要求從20H中取出低5位,并從21H中取出低3位,把取出的8位數(shù)據(jù)重新裝配成一

個(gè)字節(jié)存于30H單元,且規(guī)定裝配格式如下:

(30H)=Y2Y1Y0X4X3X2X1X0

解參考程序如下:

MOV30H,20H;將X傳送到30H

ANL30H,#1FH;屏蔽將X7X6X5

MOVA,21H;將Y傳送到A

SWAPA ;將Y7Y6Y5Y4與Y3Y2Y1Y0互換

RLA ;將Y2Y1Y0互移至高3位

ANLA,#0E0H;屏蔽低5位

ORL30H,A;完成裝配3.3.4控制轉(zhuǎn)移指令

51系列單片機(jī)提供了較豐富的控制轉(zhuǎn)移指令,編程相當(dāng)靈活。其中有64KB范圍內(nèi)的長(zhǎng)轉(zhuǎn)移指令LJMP、長(zhǎng)調(diào)用指令LCALL;有2KB范圍內(nèi)的絕對(duì)轉(zhuǎn)移AJMP和絕對(duì)調(diào)用指令A(yù)CALL;有一頁(yè)范圍內(nèi)的相對(duì)轉(zhuǎn)移指令SJMP;還有多種條件轉(zhuǎn)移指令。

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

1)長(zhǎng)轉(zhuǎn)移指令

LJMPaddr16;(PC)←addr16

LJMP為3字節(jié)指令,其操作碼為02H,隨后兩個(gè)字節(jié)是要轉(zhuǎn)向的16位的目標(biāo)地址。

執(zhí)行該指令時(shí),直接將16位的目標(biāo)地址addr16裝入PC,程序無(wú)條件轉(zhuǎn)向指定的目標(biāo)地址。轉(zhuǎn)移的目標(biāo)地址可以在64KB程序存儲(chǔ)器地址空間的任何區(qū)域,如圖3.10所示。

執(zhí)行跳轉(zhuǎn)時(shí),不影響任何標(biāo)志位。圖3.10LJMPaddr16指令示意圖(a)LJMP機(jī)器碼結(jié)構(gòu);(b)LJMP轉(zhuǎn)移范圍64KB例如,在0000H單元存放一條指令:

LJMP0040H;addr16=0040H

其機(jī)器碼的3個(gè)字節(jié)依次為02H、00H、40H。上電復(fù)位后,(PC)=0000H,執(zhí)行LJMP時(shí),(PC)←0040H,則程序轉(zhuǎn)向0040H執(zhí)行用戶(hù)程序。書(shū)寫(xiě)程序時(shí),addr16用符號(hào)地址表

示。如:

ORG0000H

LJMPSTART;上電復(fù)位時(shí)執(zhí)行該指令,再轉(zhuǎn)向START

ORG0040H

START:…

;用戶(hù)程序從0040H開(kāi)始

2)絕對(duì)轉(zhuǎn)移指令

AJMPaddr11;(PC)←(PC)+2

;(PC10~0)←a10~0

AJMP為2字節(jié)指令,其機(jī)器碼由要轉(zhuǎn)向的11位的地址碼和該指令特有的操作碼00001組成(見(jiàn)圖3.11所示)。執(zhí)行該指令時(shí),先將PC+2,然后將addr11(即a10~0)送入PC10~0,而PC15~11保持不變。這樣便可得到跳轉(zhuǎn)的目的地址。需要注意的是,由于11位地址的范圍是00000000000~11111111111,即2KB范圍,而目的地址的高5位是PC當(dāng)前值,因此程序可轉(zhuǎn)移的位置只能是和PC當(dāng)前值在同一2KB范圍內(nèi)。本指令執(zhí)行后不影響狀態(tài)標(biāo)志位。圖3.11AJMPaddr11指令示意圖例如,若AJMP指令地址(PC)=2300H,則執(zhí)行指令A(yù)JMP0FFH后,結(jié)果為:轉(zhuǎn)移目的地址(PC)=20FFH,程序向前轉(zhuǎn)到20FFH單元開(kāi)始執(zhí)行。

又如,若AJMP指令地址(PC)=2FFFH,則執(zhí)行指令A(yù)JMP0FFH后,結(jié)果為:轉(zhuǎn)移目的地址(PC)=28FFH,程序向前轉(zhuǎn)到28FFH單元開(kāi)始執(zhí)行。

由此可見(jiàn):若addr11相同,則AJMP指令的機(jī)器碼相同,但轉(zhuǎn)移的目的地址卻可能不同,這是因?yàn)檗D(zhuǎn)移的目的地址是由PC當(dāng)前值的高5位與addr11共同決定的。

3)相對(duì)轉(zhuǎn)移指令

SJMPrel;(PC)←(PC)+2

;(PC)←(PC)+rel

SJMPrel為雙字節(jié)指令,其機(jī)器碼由操作碼80H和操作數(shù)rel組成,如圖3.12(a)所示。其中,rel是用8位補(bǔ)碼(帶符號(hào)數(shù))表示的一個(gè)偏移量。執(zhí)行該指令時(shí),先將PC+2(即SJMP指令所在地址加2,稱(chēng)為PC的當(dāng)前值),再加rel便是要跳轉(zhuǎn)到的目的地址。因?yàn)?位補(bǔ)碼的取值范圍為-128~+127,所以該指令的轉(zhuǎn)移范圍是:相對(duì)于PC當(dāng)前值先向前跳轉(zhuǎn)128字節(jié),后向后跳轉(zhuǎn)127字節(jié)。即

目的地址=SJMP指令所在地址+2+rel

=PC當(dāng)前值+rel

例如,在2100H單元有指令SJMP08H;指令執(zhí)行情況如圖3.12(b)所示。若在此rel=08H(正數(shù)),則轉(zhuǎn)移的目的地址為210AH(向后轉(zhuǎn))。用匯編語(yǔ)言編程時(shí),指令中的相對(duì)地址rel往往用符號(hào)地址表示。如寫(xiě)成SJMPKL0,其中KL0是用符號(hào)表示的目的地址,則機(jī)器匯編時(shí),能自動(dòng)算出相對(duì)地址值。又如,在3100H單元有指令SJMP0F0H,指令執(zhí)行情況如圖3.12(c)所示。在此rel=F0H,是一個(gè)負(fù)數(shù)(-16),則轉(zhuǎn)移目的地址為

PC當(dāng)前值+rel=PC當(dāng)前值+(-16的16位補(bǔ)碼FFF0H)

=PC當(dāng)前值-16

=3102H-10H

=30F2H

再如,在4100H單元有指令

HERE:SJMPHERE該指令執(zhí)行情況如圖3.12(d)所示。在此rel=FEH,是一個(gè)負(fù)數(shù)(-2),目的地址就是SJMP指令的首地址,程序就不會(huì)再向后執(zhí)行,造成單指令的無(wú)限循環(huán),進(jìn)入等待狀態(tài),往往用該指令作為停機(jī)指令使用。在匯編語(yǔ)言中,可用$符號(hào)表示SJMP指令的地址,于是該指令即可寫(xiě)成SJMP$。圖3.12SJMPrel指令示意圖(a)SJMP轉(zhuǎn)移范圍;(b)SJMP08H;(c)SJMP0F0H;(d)SJMP$

注意:以上3種無(wú)條件轉(zhuǎn)移指令在應(yīng)用上的區(qū)別有以下幾點(diǎn):

(1)轉(zhuǎn)移距離不同。LJMP可在64KB范圍內(nèi)轉(zhuǎn)移,AJMP指令可以在本指令取出后的2KB范圍內(nèi)轉(zhuǎn)移,SJMP的轉(zhuǎn)移范圍是相對(duì)PC當(dāng)前值的-128~+127個(gè)字節(jié)。

(2)匯編后機(jī)器碼的字節(jié)數(shù)不同。LJMP是3字節(jié)指令,AJMP和SJMP都是2字節(jié)指令。

(3)LJMP和AJMP都是絕對(duì)轉(zhuǎn)移指令,而SJMP是相對(duì)轉(zhuǎn)移指令。當(dāng)修改程序時(shí),只要相對(duì)地址不變,SJMP指令的機(jī)器碼就不變。選擇無(wú)條件轉(zhuǎn)移指令的原則是根據(jù)跳轉(zhuǎn)的遠(yuǎn)近和ROM的存儲(chǔ)空間大小而定。若ROM的存儲(chǔ)空間有限,則盡可能選擇占用字節(jié)數(shù)少的指令。例如,動(dòng)態(tài)暫停指令一般都選用

SJMP$,而不用LJMP$。若ROM的存儲(chǔ)空間不受限制,則盡可能使用LJMP,因?yàn)長(zhǎng)JMP的轉(zhuǎn)移地址比較直觀(guān),便于調(diào)試程序。

4)散轉(zhuǎn)指令(間接長(zhǎng)轉(zhuǎn)移指令)

JMP@A+DPTR;(PC)←(PC)+(DPTR)

執(zhí)行該指令時(shí),把累加器A中的8位無(wú)符號(hào)數(shù)與數(shù)據(jù)指針中的16位數(shù)相加,結(jié)果作為下一條指令的地址送入PC,利用該指令能實(shí)現(xiàn)程序的散轉(zhuǎn)。該指令不改變累加器A和數(shù)據(jù)指針DPTR的內(nèi)容,也不影響標(biāo)志。例3.3.15

編寫(xiě)程序,根據(jù)累加器A的值轉(zhuǎn)向不同的入口地址。當(dāng)

(A)=0時(shí),轉(zhuǎn)向KL0

(A)=1時(shí),轉(zhuǎn)向KL1

(A)=2時(shí),轉(zhuǎn)向KL2

解參考程序如下:

MOVDPTR,#TABLE;取轉(zhuǎn)移表首址

RLA;(A)←(A)*2,因?yàn)锳JMP占2個(gè)字節(jié),所以要修正A值

JMP@A+DPTR

TABLE:AJMPKL0;若原(A)=0,則轉(zhuǎn)向KL0

AJMPKL1;若原(A)=1,則轉(zhuǎn)向KL1

AJMPKL2

2.條件轉(zhuǎn)移指令

JZrel;當(dāng)A=0時(shí)跳轉(zhuǎn),A≠0時(shí)則順序執(zhí)行下面的指

;令,即不跳轉(zhuǎn)

JNZrel;A≠0時(shí)跳轉(zhuǎn),A=0時(shí)不跳轉(zhuǎn)繼續(xù)執(zhí)行程序這類(lèi)指令是雙字節(jié)指令,第一個(gè)字節(jié)是操作碼,第二個(gè)字節(jié)是8位的相對(duì)偏移量(帶符號(hào)數(shù))。它們依據(jù)累加器A的內(nèi)容是否為0進(jìn)行轉(zhuǎn)移。條件滿(mǎn)足時(shí)程序跳轉(zhuǎn),條件不滿(mǎn)足時(shí)則順序執(zhí)行下面的指令。當(dāng)條件滿(mǎn)足時(shí),其轉(zhuǎn)移情況類(lèi)似于SJMP指令的轉(zhuǎn)移,有

目的地址=指令所在地址+2+rel

=PC當(dāng)前值+rel

它們的轉(zhuǎn)移范圍是相對(duì)于PC當(dāng)前值的-128~+127個(gè)字節(jié)。指令不影響任何標(biāo)志位。

例3.3.16

在片外RAM中,從首地址為DATA1的存儲(chǔ)區(qū)中讀取一個(gè)數(shù)據(jù)塊,該數(shù)據(jù)塊中不包含0元素。試將該數(shù)據(jù)塊傳送到片內(nèi)RAM首地址為DATA2的存儲(chǔ)區(qū)中,若遇到0

結(jié)束傳送。

解外部RAM向內(nèi)部RAM的數(shù)據(jù)轉(zhuǎn)送一定要經(jīng)過(guò)累加器A,正好利用判零條件轉(zhuǎn)移可以判斷是否要繼續(xù)傳送數(shù)據(jù)。完成數(shù)據(jù)傳送的程序段如下:

MOVDPTR,#DATA1;DPTR作為外部數(shù)據(jù)塊

;的地址指針

MOVR1,#DATA2;R1作為內(nèi)部數(shù)據(jù)塊的

;地址指針L

溫馨提示

  • 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)論