MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例_第1頁
MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例_第2頁
MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例_第3頁
MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例_第4頁
MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例_第5頁
已閱讀5頁,還剩131頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例第第3 3章章 MCS-51MCS-51單片機(jī)指令系統(tǒng)單片機(jī)指令系統(tǒng) 和匯編語言程序示例和匯編語言程序示例3.1 MCS-51單片機(jī)指令系統(tǒng)概述單片機(jī)指令系統(tǒng)概述3.2 尋址方式尋址方式3.3 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令3.4 算術(shù)運(yùn)算類指令算術(shù)運(yùn)算類指令3.5 邏輯運(yùn)算及移位指令邏輯運(yùn)算及移位指令3.6 控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令3.7 子程序調(diào)用與返回指令子程序調(diào)用與返回指令3.8 位操作類指令位操作類指令3.9 匯編程序格式與偽指令匯編程序格式與偽指令3.10 匯編程序設(shè)計(jì)示例匯編程序設(shè)計(jì)示例第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編

2、語言程序示例3.1 MCS-51單片機(jī)指令系統(tǒng)概述單片機(jī)指令系統(tǒng)概述3.1.1 指令、指令系統(tǒng)的概念指令、指令系統(tǒng)的概念 指令是使計(jì)算機(jī)內(nèi)部執(zhí)行的一種操作,提供給用戶編程使用的一種命令。由構(gòu)成計(jì)算機(jī)的電子器件特性所決定,計(jì)算機(jī)只能識(shí)別二進(jìn)制代碼。以二進(jìn)制代碼來描述指令功能的語言,稱之為機(jī)器語言。由于機(jī)器語言不便被人們識(shí)別、記憶、理解和使用,因此給每條機(jī)器語言指令賦予助記符號(hào)來表示,這就形成了匯編語言。也就是說,匯編語言是便于人們識(shí)別、記憶、理解和使用的一種指令形式,它和機(jī)器語言指令一一對(duì)應(yīng),也是由計(jì)算機(jī)的硬件特性所決定的。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 計(jì)算機(jī)能夠執(zhí)行的全

3、部操作所對(duì)應(yīng)的指令集合,稱為這種計(jì)算機(jī)的指令系統(tǒng)。從指令是反應(yīng)計(jì)算機(jī)內(nèi)部的一種操作來看,指令系統(tǒng)全面展示出了計(jì)算機(jī)的操作功能,也就是它的工作原理;從用戶使用的角度來看,指令系統(tǒng)是提供給用戶使用計(jì)算機(jī)功能的軟件資源。要讓計(jì)算機(jī)處理問題,首先要編寫程序。編寫程序?qū)嶋H上是從指令系統(tǒng)中挑選一個(gè)指令子集的過程。因此,學(xué)習(xí)指令系統(tǒng)既要從編程使用的角度掌握指令的使用格式及每條指令的功能;又要掌握每條指令在計(jì)算機(jī)內(nèi)部的微觀操作過程,即工作原理,從而進(jìn)一步加深對(duì)硬件組成原理的理解。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 指令一般有功能、時(shí)間和空間三種屬性。功能屬性是指每條指令都對(duì)應(yīng)一個(gè)特定的操作功

4、能;時(shí)間屬性是指一條指令執(zhí)行所用的時(shí)間,一般用機(jī)器周期來表示;空間屬性是指一條指令在程序存儲(chǔ)器中存儲(chǔ)所占用的字節(jié)數(shù)。這三種屬性在使用中最重要的是功能,但時(shí)間、空間屬性在有些場(chǎng)合也要用到。如一些實(shí)時(shí)控制應(yīng)用程序中,有時(shí)需要計(jì)算一個(gè)程序段的確切執(zhí)行時(shí)間或編寫軟件延時(shí)程序,都要用到每條指令的時(shí)間屬性;在程序存儲(chǔ)器的空間設(shè)計(jì),或相對(duì)轉(zhuǎn)移指令的偏移量計(jì)算時(shí)就要用到指令的空間屬性。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 指令的描述形式有兩種:機(jī)器語言形式和匯編語言形式?,F(xiàn)在描述計(jì)算機(jī)指令系統(tǒng)及實(shí)際應(yīng)用中主要采用匯編語言形式。采用機(jī)器語言編寫的程序稱之為目標(biāo)程序。采用匯編語言編寫的程序稱之為源

5、程序。計(jì)算機(jī)能夠直接識(shí)別并執(zhí)行的只有機(jī)器語言。匯編語言程序不能被計(jì)算機(jī)直接識(shí)別并執(zhí)行,必須經(jīng)過一個(gè)中間環(huán)節(jié)把它翻譯成機(jī)器語言程序,這個(gè)中間過程叫做匯編。匯編有兩種方式:機(jī)器匯編和手工匯編。機(jī)器匯編是用專門的匯編程序,在計(jì)算機(jī)上進(jìn)行翻譯;手工匯編是編程員把匯編語言指令逐條翻譯成機(jī)器語言指令。現(xiàn)在主要使用機(jī)器匯編,但有時(shí)也用到手工匯編。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.1.2 MCS-51單片機(jī)指令系統(tǒng)及其指令格式單片機(jī)指令系統(tǒng)及其指令格式 MCS-51單片機(jī)指令系統(tǒng)具有功能強(qiáng)、指令短、執(zhí)行快等特點(diǎn),共有111條指令。從功能上可劃分成數(shù)據(jù)傳送、算術(shù)操作、邏輯操作、程序轉(zhuǎn)移位操

6、作等五大類;從空間屬性上分為單字節(jié)指令(49條)、雙字節(jié)指令(46條)和最長(zhǎng)的三字節(jié)指令(只有16條)。從時(shí)間屬性上可分成單機(jī)器周期指令(64條)、雙機(jī)器周期指令(45條)和只有乘、除法兩條4個(gè)機(jī)器周期的指令??梢?,MCS-51單片機(jī)指令系統(tǒng)在存儲(chǔ)空間和執(zhí)行時(shí)間方面具有較高的效率。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 指令系統(tǒng)中的指令描述了不同的操作,不同操作對(duì)應(yīng)不同的指令。但結(jié)構(gòu)上,每條指令通常由操作碼和操作數(shù)兩部分組成。操作碼表示計(jì)算機(jī)執(zhí)行該指令將進(jìn)行何種操作,操作數(shù)表示參加操作的數(shù)的本身或操作數(shù)所在的地址。MCS-51單片機(jī)的指令有無操作數(shù)、單操作數(shù)、雙操作數(shù)三種情況。匯

7、編語言指令有如下的格式: 標(biāo)號(hào): 操作碼助記符 目的操作數(shù),源操作數(shù) ;注釋第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 指令系統(tǒng)中的指令描述了不同的操作,不同操作對(duì)應(yīng)不同的指令。但結(jié)構(gòu)上,每條指令通常由操作碼和操作數(shù)兩部分組成。操作碼表示計(jì)算機(jī)執(zhí)行該指令將進(jìn)行何種操作,操作數(shù)表示參加操作的數(shù)的本身或操作數(shù)所在的地址。MCS-51單片機(jī)的指令有無操作數(shù)、單操作數(shù)、雙操作數(shù)三種情況。匯編語言指令有如下的格式: 標(biāo)號(hào): 操作碼助記符 目的操作數(shù),源操作數(shù) ;注釋第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 為便于后面的學(xué)習(xí),在這里先對(duì)描述指令的一些符號(hào)的約定意義作以說明: (1)

8、Ri和Rn:表示當(dāng)前工作寄存器區(qū)中的工作寄存器,i取0或1,表示R0或R1。n取07,表示R0R7。 (2) #data:表示包含在指令中的8位立即數(shù)。 (3) #data16:表示包含在指令中的16位立即數(shù)。 (4) rel:以補(bǔ)碼形式表示的8位相對(duì)偏移量,范圍為-128127,主要用在相對(duì)尋址的指令中。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 (5) addr16和addr11:分別表示16位直接地址和11位直接地址。 (6) direct:表示直接尋址的地址。 (7) bit:表示可位尋址的直接位地址。 (8) (X):表示X單元中的內(nèi)容。 (9) (X):表示以X單元的內(nèi)容

9、為地址的存儲(chǔ)器單元內(nèi)容,即(X)作地址,該地址單元的內(nèi)容用(X)表示。 (10) / 和符號(hào):“/”表示對(duì)該位操作數(shù)取反,但不影響該位的原值?!啊北硎静僮髁鞒蹋瑢⒓惨环降膬?nèi)容送入箭頭所指另一方的單元中去。 第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.2 尋尋 址址 方方 式式3.2.1 立即尋址立即尋址 操作數(shù)直接出現(xiàn)在指令中,緊跟在操作碼的后面,作為指令的一部分與操作碼一起存放在程序存儲(chǔ)器中,可以立即得到并執(zhí)行,不需要經(jīng)過別的途徑去尋找,故稱為立即尋址。匯編指令中,在一個(gè)數(shù)的前面冠以#符號(hào)作前綴,就表示該數(shù)為立即尋址。 例如:MOVA,#30H指令中30H就是立即數(shù)。這一條指令

10、的功能是執(zhí)行將立即數(shù)30H傳送到累加器A中的操作。該指令操作碼的機(jī)器代碼為74H,占用一個(gè)字節(jié)存儲(chǔ)單元,立即數(shù)30H存放在緊跟在其后的一個(gè)字節(jié)存儲(chǔ)單元,成為指令代碼的一部分。整條指令的機(jī)器碼為74H 30H。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.2.2 寄存器尋址寄存器尋址 在指令選定的某寄存器中存放或讀取操作數(shù),以完成指令規(guī)定的操作,稱為寄存器尋址。 例如:MOVA,R0指令中源操作數(shù)和目的操作數(shù)都是寄存器尋址。該指令的功能是把工作寄存器R0中的內(nèi)容傳送到累加器A中,如R0中的內(nèi)容為30H,則執(zhí)行該指令后A的內(nèi)容也為30H。 寄存器尋址按所選定的工作寄存器R0R7進(jìn)行操作,

11、指令機(jī)器碼的低3位的八種組合000,001,110,111分別指明所用的工作寄存器R0,R1,R6,R7。如:MOV A,Rn(n=07),這8條指令對(duì)應(yīng)的機(jī)器碼分別為E8HEFH。 在匯編指令中,累加器A作為寄存器尋址的操作數(shù),但在機(jī)器碼中無需指明,它由操作碼隱含。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.2.3 寄存器間接尋址寄存器間接尋址 由指令指出某一寄存器的內(nèi)容作為操作數(shù)地址的尋址方法,稱為寄存器間接尋址。這里需要強(qiáng)調(diào)的是:寄存器中的內(nèi)容不是操作數(shù)本身,而是操作數(shù)的地址,到該地址單元中才能得到操作數(shù)。寄存器起地址指針的作用。 例如:MOV A,R1指令的源操作數(shù)是寄存器

12、間接尋址。該指令的功能是將以工作寄存器R1中的內(nèi)容為地址的片內(nèi)RAM單元的數(shù)據(jù)傳送到A中去。例如:若R1中的內(nèi)容為80H,片內(nèi)RAM地址為80H的單元中的內(nèi)容為2FH,則執(zhí)行該指令后,片內(nèi)RAM 80H單元的內(nèi)容2FH被送到A中。寄存器間接尋址示意圖如圖3.1所示。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例圖3.1 寄存器間接尋址示意圖 第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.2.4 直接尋址直接尋址 指令中直接給出操作數(shù)所在的存儲(chǔ)器地址,以供取數(shù)或存數(shù)的尋址方式稱為直接尋址。 例如:MOV A,40H指令中的源操作數(shù)就是直接尋址,40H為操作數(shù)的地址。該指令的功能是

13、把片內(nèi)RAM地址為40H單元的內(nèi)容送到A中。該指令的機(jī)器碼為E5H 40H,8位直接地址在指令操作碼中占一個(gè)字節(jié)。 MCS-51系列單片機(jī)的直接尋址可用于訪問片內(nèi)、外數(shù)據(jù)存儲(chǔ)器,也可用于訪問程序存儲(chǔ)器。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 直接尋址可訪問片內(nèi)RAM的低128個(gè)單元(00H7FH),同時(shí)也是用于訪問高128個(gè)單元的特殊功能寄存器SFR的唯一方法。由于52子系列的片內(nèi)RAM有256個(gè)單元,其高128個(gè)單元與SFR的地址是重疊的。為了避免混亂,單片機(jī)規(guī)定:直接尋址的指令不能訪問片內(nèi)RAM的高128個(gè)單元(80HFFH),若要訪問這些單元只能用寄存器間接尋址指令,而要訪

14、問SFR只能用直接尋址指令。另外,訪問SFR可在指令中直接使用該寄存器的名字來代替地址,如MOV A,80H,可以寫成MOV A,P0,因?yàn)镻0口的地址為80H。 直接尋址訪問程序存儲(chǔ)器的轉(zhuǎn)移、調(diào)用指令中直接給出了程序存儲(chǔ)器的地址,執(zhí)行這些指令后,程序計(jì)數(shù)器PC的內(nèi)容將更換為指令直接給出的地址,機(jī)器將改為訪問以所給地址為起始地址的存儲(chǔ)區(qū)間,取指令(或取數(shù)),并依次執(zhí)行。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.2.5 變址尋址變址尋址圖3.2 變址尋址示意圖 第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.2.6 相對(duì)尋址相對(duì)尋址 相對(duì)尋址是以當(dāng)前程序計(jì)數(shù)器PC值加上指令

15、中給出的偏移量rel,而構(gòu)成實(shí)際操作數(shù)地址的尋址方法。它用于訪問程序存儲(chǔ)器,常出現(xiàn)在相對(duì)轉(zhuǎn)移指令中。 在使用相對(duì)尋址時(shí)要注意以下兩點(diǎn): (1) 當(dāng)前PC值是指相對(duì)轉(zhuǎn)移指令的存儲(chǔ)地址加上該指令的字節(jié)數(shù)。例如:JZ rel 是一條累加器A為零就轉(zhuǎn)移的雙字節(jié)指令。若該指令的存儲(chǔ)地址為2050H,則執(zhí)行該指令時(shí)的當(dāng)前PC值即為2052H。即當(dāng)前PC值是對(duì)相對(duì)轉(zhuǎn)移指令取指結(jié)束時(shí)的值。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 (2) 偏移量rel是有符號(hào)的單字節(jié)數(shù)。以補(bǔ)碼表示,其值的范圍是-128+127(00HFFH),負(fù)數(shù)表示從當(dāng)前地址向前轉(zhuǎn)移,正數(shù)表示從當(dāng)前地址向后轉(zhuǎn)移。所以,相對(duì)轉(zhuǎn)移指

16、令滿足條件后,轉(zhuǎn)移的地址(目的地址)為: 目的地址=當(dāng)前PC值+rel = 指令存儲(chǔ)地址+指令字節(jié)數(shù)+rel第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.2.7 位尋址位尋址 位尋址是在位操作指令中直接給出位操作數(shù)的地址,可以對(duì)片內(nèi)RAM中的128位和特殊功能寄存器SFR中的93位進(jìn)行尋址。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.3 數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.3.1 訪問片內(nèi)數(shù)據(jù)存儲(chǔ)器的一般數(shù)據(jù)傳送指令訪問片內(nèi)數(shù)據(jù)存儲(chǔ)器的一般數(shù)據(jù)傳送指令 該類指令的功能是實(shí)現(xiàn)數(shù)在片內(nèi)RAM單元之間、寄存器之間、寄存器與RAM單

17、元之間的傳送。所有指令具有統(tǒng)一的格式,其格式如下: MOV ,;目的操作數(shù)單元源操作數(shù)(或單元) 操作碼助記符都是MOV,目的操作數(shù)和源操作數(shù)不同尋址方式的組合就派生出該類的全部指令。因此,記憶這類指令的關(guān)鍵在于掌握兩個(gè)操作數(shù)的各種尋址方式的組合關(guān)系。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例圖3.3 訪問片內(nèi)RAM的一般傳送指令操作關(guān)系圖 第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例表表3.1 訪問片內(nèi)訪問片內(nèi)RAM的一般傳送指令表的一般傳送指令表第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例1 設(shè)內(nèi)部RAM(3

18、0H)=40H,(40H)=10H,(10H)=00H(P1)=CAH,分析以下程序執(zhí)行后各單元及寄存器、P2口的內(nèi)容。MOV R0,#30H;(R0)30HMOV A,R0;(A)(R0)MOV R1,A;(R1)(A)MOV B,R1;(B)(R1)MOV R1,P1;(R1)(P1)MOV P2,P1;(P2)(P1)MOV 10H,#20H;(10H)20H 執(zhí)行上述指令后的結(jié)果為:(R0)=30H,(R1)=(A)=40H,(B)=10H,(40H)=(P1)=(P2)=CAH,(10H)=20H。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.3.2 片內(nèi)特殊傳送指令片內(nèi)特

19、殊傳送指令 1堆棧操作指令堆棧操作指令 堆棧操作有進(jìn)棧和出棧,即壓入和彈出數(shù)據(jù),常用于保存或恢復(fù)現(xiàn)場(chǎng)。進(jìn)棧指令用于保存片內(nèi)RAM單元(低128字節(jié))或特殊功能寄存器SFR的內(nèi)容;出棧指令用于恢復(fù)片內(nèi)RAM單元(低128字節(jié))或特殊功能寄存器SFR的內(nèi)容。 該類指令共有如下兩條指令:第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例(SP)(SP)-1 修改指針,指向新棧頂 (direct)(SP)+ 1) 把棧頂?shù)臄?shù)據(jù)彈出到直接尋址單元中去 PUSH direct ; POP direct ; (SP)direct 把直接地址單元的內(nèi)容壓入SP所指單元內(nèi) (SP)(SP)+ 1 修改指針,使

20、其指向棧頂上的一個(gè)存數(shù)單元 這兩條指令都是雙字節(jié)指令,機(jī)器碼分別為:C0 direct 和D0 direct。 第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例2 若在外部程序存儲(chǔ)器中2000H單元開始依次存放09的平方值,數(shù)據(jù)指針(DPTR)=3A00H,用查表指令取得2003H單元的數(shù)據(jù)后,要求保持DPTR中的內(nèi)容不變。完成上述功能的程序如下:MOV A,#03H;(A)03HPUSH DPH;保護(hù)DPTR高8位入棧PUSH DPL;保護(hù)DPTR低8位入棧MOV DPTR,#2000H;(DPTR)2000HMOVC A,A+DPTR;(A)(2000H+03H)POP DPL ;

21、彈出DPTR低位POP DPH ;彈出DPTR高位執(zhí)行結(jié)果:(A)09H,(DPTR)=3A00H。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 2數(shù)據(jù)交換指令數(shù)據(jù)交換指令 數(shù)據(jù)傳送指令一般都是將操作數(shù)自源地址單元傳送到目的地址單元,指令執(zhí)行后,源地址單元的操作數(shù)不變,目的地址單元的操作數(shù)則修改為源地址單元的操作數(shù)。交換指令數(shù)據(jù)作雙向傳送,涉及傳送的雙方互為源地址、目的地址,指令執(zhí)行后每方的操作數(shù)都修改為另一方的操作數(shù)。因此,兩操作數(shù)均未沖掉、丟失。數(shù)據(jù)交換指令共有如下5條指令:第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例例例

22、3 設(shè)(R0) = 30H,30H = 4AH,(A) = 28H,則執(zhí)行XCH A, R0后,結(jié)果為(A) = 4AH,(30H) = 28H。執(zhí)行XCHD A,R0后,結(jié)果為(A) = 2AH,(30H) = 48H。執(zhí)行SWAP A后,結(jié)果為(A) = 82H。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.3.3 片外數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)傳送指令片外數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)傳送指令 MCS-51單片機(jī)CPU對(duì)片外擴(kuò)展的數(shù)據(jù)存儲(chǔ)器RAM或I/O口進(jìn)行數(shù)據(jù)傳送,必須采用寄存器間接尋址的方法,通過累加器A來完成。這類指令共有以下條單字節(jié)指令,指令操作碼助記符都為MOVX。指令助記符 操作功能注釋 機(jī)

23、器碼(H)MOVX A,DPTR ; (A)(DPTR) E6MOVX A,Ri ; (A)(Ri) E2、E3MOVX DPTR ,A ; (DPTR)(A) F0MOVX Ri,A ; (Ri)(A) F2、F3第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例例例4 設(shè)外部RAM(0203H)= FFH,分析以下指令執(zhí)行后的結(jié)果。MOV DPTR,#0203H ;(DPTR)0203HMOVX A,DPTR ;(A)(DPTR)MOV 30H,A ;(30H)(A)MOV A,#0FH ;(A)0FHMOVX DPTR,A ;(DPTR)(A)執(zhí)行結(jié)果為:(DPTR)=0203H,(3

24、0H)=FFH,(0203H)=(A)=0FH。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.3.4 訪問程序存儲(chǔ)器的數(shù)據(jù)傳送指令訪問程序存儲(chǔ)器的數(shù)據(jù)傳送指令 訪問程序存儲(chǔ)器的數(shù)據(jù)傳送指令又稱作查表指令,采用基址寄存器加變址寄存器間接尋址方式,把程序存儲(chǔ)器中存放的表格數(shù)據(jù)讀出,傳送到累加器A。共有如下兩條單字節(jié)指令,指令操作碼助記符為MOVC。指令助記符 操作功能注釋 機(jī)器碼(H)MOVC A, A+DPTR ;(A)(A)+(DPTR) 93MOVC A, A+PC ;(PC)(PC)+1,(A)(A)+(PC) 83第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 前一條指令

25、采用DPTR作基址寄存器,因此可以很方便地把一個(gè)16位地址送到DPTR,實(shí)現(xiàn)在整個(gè)64 KB程序存儲(chǔ)器單元到累加器A的數(shù)據(jù)傳送。即數(shù)據(jù)表格可以存放在程序存儲(chǔ)器64 KB地址范圍的任何地方。 后一條指令以PC作為基址寄存器,CPU取完該指令操作碼時(shí)PC會(huì)自動(dòng)加1,指向下一條指令的第一個(gè)字節(jié)地址,即此時(shí)是用(PC)+1作為基址的。另外,由于累加器A中的內(nèi)容為8位無符號(hào)數(shù),這就使得本指令查表范圍只能在256個(gè)字節(jié)范圍內(nèi)(即(PC)+1H(PC)+100H),使表格地址空間分配受到限制。同時(shí)編程時(shí)還需要進(jìn)行偏移量的計(jì)算,即MOVC A,A+PC指令所在地址與表格存放首地址間的距離字節(jié)數(shù)的計(jì)算,并需要一

26、條加法指令進(jìn)行地址調(diào)整。偏移量計(jì)算公式為:偏移量 = 表首地址-(MOVC指令所在地址+1)第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例5 從片外程序存儲(chǔ)器2000H單元開始存放09的平方值,以PC作為基址寄存器進(jìn)行查表得9的平方值。 設(shè)MOVC指令所在地址(PC)=1FF0H,則偏移量=2000H-(1FF0H+1)=0FH。 相應(yīng)的程序如下:MOV A,#09H ;(A)09HADD A,#0FH ;用加法指令進(jìn)行地址調(diào)整MOVC A,A+PC ;(A)(A)+(PC)+1)執(zhí)行結(jié)果為:(PC)=1FF1H,(A)=51H。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例如

27、果用以DPTR為基址寄存器的查表指令,其程序如下:MOV DPTR, 2000H;置表首地址MOV A, 09HMOVC A, A+DPTR第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.4 算術(shù)運(yùn)算類指令算術(shù)運(yùn)算類指令3.4.1 加、減法指令加、減法指令圖3.4 加減法指令形式結(jié)構(gòu)圖(a) 加減法指令關(guān)系圖;(b) 加1、減1指令關(guān)系圖 第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例表表3.2 加減法指令表加減法指令表第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例例6 設(shè)(A) = 49H,(R0)=6BH,分析執(zhí)行指令A(yù)DD A,R0后的結(jié)果。 結(jié)果為:(A)=B4

28、H,OV=1,CY=0,AC=1,P=0。 例例7 設(shè)(A)=C3H,數(shù)據(jù)指針低位(DPL)=ABH,CY=1,分析執(zhí)行指令A(yù)DDC A,DPL后的結(jié)果。 結(jié)果為:(A)=6FH,CY=1,AC=0,P=0。 例例8 設(shè) (A) = 52H,(R0)=B4H,分析執(zhí)行如下指令后的結(jié)果 CLR C ;是位操作指令,是進(jìn)位位清零 SUBB A,R0 結(jié)果為:(A)=9EH,CY=1,AC=1,OV=1,P=1。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例例9 設(shè) (R0) = 7EH,(7EH)=FFH,(7FH)=38H,(DPTR)=10FEH,分析逐條執(zhí)行下列指令后各單元的內(nèi)容。

29、INC R0 ;使7EH單元內(nèi)容由FFH變?yōu)?0HINC R0 ;使R0的內(nèi)容由7EH變?yōu)?FHINC R0 ;使7FH單元內(nèi)容由38H變?yōu)?9HINC DPTR ;使DPL為FFH,DPH不變INC DPTR ;使DPL為00H,DPH為11HINC DPTR ;使DPL為01H,DPH不變第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.4.2 十進(jìn)制調(diào)整指令十進(jìn)制調(diào)整指令若(A)309或(AC)=1,則(A)30(A)30+06H若(A)749或(CY)=1,則(A)74(A)74+06HDA A ; 若AC=1,CY=1同時(shí)發(fā)生,或者高4位雖等于9但低4位修正后有進(jìn)位,則A應(yīng)加6

30、6H修正。 十進(jìn)制調(diào)整指令是一條對(duì)二-十進(jìn)制的加法進(jìn)行調(diào)整的指令。它是一條單字節(jié)指令,機(jī)器碼為D4H。兩個(gè)壓縮BCD碼按二進(jìn)制相加,必須在加法指令A(yù)DD、ADDC后,經(jīng)過本指令調(diào)整后才能得到正確的壓縮BCD碼和數(shù),實(shí)現(xiàn)十進(jìn)制的加法運(yùn)算。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例例10 對(duì)BCD碼加法65 + 58DBH,進(jìn)行十進(jìn)制調(diào)整。 參考程序如下:MOV A,#65H ;(A)65ADD A,#58H ;(A)(A)+58DA A ;十進(jìn)制調(diào)整第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 使用時(shí)應(yīng)注意:DA指令不能對(duì)減法進(jìn)行十進(jìn)制調(diào)整。做減法運(yùn)算時(shí),可采用十進(jìn)制補(bǔ)碼相

31、加,然后用 DA A指令進(jìn)行調(diào)整。例如 70 - 20 = 70 + 20補(bǔ) = 70 +(100 - 20)= 70 + 80 = 1 50 機(jī)內(nèi)十進(jìn)制補(bǔ)碼可采用:x補(bǔ) = 9AH - x 。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例例11 設(shè)片內(nèi)RAM 30H,31H單元中分別存放著兩位BCD碼表示的被減數(shù)和減數(shù),兩數(shù)相減的差仍以BCD碼的形式存放在32H單元中??捎孟旅娴某绦?qū)崿F(xiàn):CLR CMOV A,#9AHSUBB A,31H ;求減數(shù)的十進(jìn)制補(bǔ)碼ADD A,30H ;作十進(jìn)制補(bǔ)碼加法DA A ;進(jìn)行BCD調(diào)整MOV 32H,A ;將BCD碼的差送存32H單元第3章 M

32、CS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.4.3 乘、除法指令乘、除法指令MUL AB;(B)(A)(B)158(A)(A)(B)70CY0機(jī)器碼:A4H 乘法指令的功能是把累加器A和寄存器B中的兩個(gè)8位無符號(hào)數(shù)相乘,將乘積16位數(shù)中的低8位存放在A中,高8位存放在B中。若乘積大于FFH(255),則溢出標(biāo)志OV置1,否則OV清零。乘法指令執(zhí)行后進(jìn)位標(biāo)志CY總是零,即CY=0。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例2除法指令除法指令DIV AB;(A)(A)(B)之商,(B)(A)(B)之余數(shù)(CY)0,(OV)0機(jī)器碼:84H 除法指令的功能是把累加器A中的8位無符號(hào)整數(shù)除

33、以寄存器B中的8位無符號(hào)整數(shù),所得商存于累加器A中,余數(shù)存于寄存器B中,進(jìn)位標(biāo)志位CY和溢出標(biāo)志位OV均被清零。若B中的內(nèi)容為0時(shí),溢出標(biāo)志OV被置1,即OV=1,而CY仍為0。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.5 邏輯運(yùn)算及移位指令邏輯運(yùn)算及移位指令圖3.5 邏輯指令形式結(jié)構(gòu)圖 (a) 與加、減法指令尋址方式相同的邏輯指令;(b) 與加、減法指令尋址方式不同的邏輯指令第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例表表3.3 邏輯操作指令表邏輯操作指令表第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例表表3.3 邏輯操作指令表邏輯操作指令表第3章 MCS-51單

34、片機(jī)指令系統(tǒng)和匯編語言程序示例 例例12 (P1)=C5H=11000101B,屏蔽P1口高4位而保留低4位。 執(zhí)行指令:ANL P1,#0FH 結(jié)果為:(P1)=05H=00000101B。 邏輯“或”指令常用來使字節(jié)中某些位置“1”,其它位保持不變。則欲置位的位用1與該位相或,保留不變的位用0 與該位相或。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例例13 若(A)=C0H,(R0)=3FH,(3FH)=0FH, 執(zhí)行指令:ORL A,R0 結(jié)果為:(A)=CFH=11001111B。 邏輯異或指令常用來使字節(jié)中某些位進(jìn)行取反操作,其它位保持不變。欲某位取反該位與1相異或;欲某

35、位保留則該位與0 相異或。還可利用異或指令對(duì)某單元自身異或,以實(shí)現(xiàn)清零操作。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例例14 若(A)=B5H=10110101B,執(zhí)行下列操作: XRL A,#0F0H ; A的高4位取反,低4位保留, (A)=01000101B=45H MOV 30H,A ;(30H)=45H XRL A,30H ;自身異或使A清零 用移位指令還可以實(shí)現(xiàn)算術(shù)運(yùn)算,左移一位相當(dāng)于原內(nèi)容乘以2,右移一位相當(dāng)于原內(nèi)容除以2,但這種運(yùn)算關(guān)系只對(duì)某些數(shù)成立(請(qǐng)讀者自行思考)。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例例例15 設(shè)(A)=5AH=90,且CY=0

36、,則執(zhí)行指令RL A后,(A)=B4H=90。執(zhí)行指令 RR A后,(A)=2DH=45。執(zhí)行指令 RLC A后,(A)=B4H=90。執(zhí)行指令 RRC A后,(A)=2DH=45。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.6 控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令3.6.1 無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令表3.4 無條件轉(zhuǎn)移指令第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 1LJMP(長(zhǎng)轉(zhuǎn)指令長(zhǎng)轉(zhuǎn)指令) LJMP指令執(zhí)行后,程序無條件地轉(zhuǎn)向16位目標(biāo)地址(addr16)處執(zhí)行,不影響標(biāo)志位。由于指令中提供16位目標(biāo)地址,所以執(zhí)行這條指令可以使程序從當(dāng)前地址轉(zhuǎn)移到64 KB程序存儲(chǔ)器

37、地址空間的任意地址,故得名為長(zhǎng)轉(zhuǎn)移。該指令的缺點(diǎn)是執(zhí)行時(shí)間長(zhǎng),字節(jié)多。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 2AJMP(絕對(duì)轉(zhuǎn)移指令絕對(duì)轉(zhuǎn)移指令) AJMP的機(jī)器碼是由11位直接地址addr11和指令操作碼00001,按下列分布組成的: a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 該指令執(zhí)行后,程序轉(zhuǎn)移的目的地址是由AJMP指令所在位置的地址PC值加上該指令字節(jié)數(shù)2,構(gòu)成當(dāng)前PC值。取當(dāng)前PC值的高5位與指令中提供的11位直接地址形成轉(zhuǎn)移的目的地址,即 PC15 PC14 PC13 PC12 PC11a10 a9 a8 a7 a6 a

38、5 a4 a3 a2 a1 a0轉(zhuǎn)移目的地址(PC) 第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 由于11位地址的范圍是0000000000011111111111,即2 KB范圍,而目的地址的高5位是由PC當(dāng)前值,所以程序可轉(zhuǎn)移的位置只能是和PC當(dāng)前值在同一2 KB范圍內(nèi)。本指令轉(zhuǎn)移可以向前也可以向后,指令執(zhí)行后不影響狀態(tài)標(biāo)志位。 例如:若AJMP指令地址(PC)=2300H。執(zhí)行指令A(yù)JMP 0FFH后,結(jié)果為:轉(zhuǎn)移目的地址(PC)=20FFH,程序向前轉(zhuǎn)到20FFH單元開始執(zhí)行。 又如:若AJMP指令地址(PC)=2FFFH。執(zhí)行指令A(yù)JMP 0FFH后,結(jié)果為:轉(zhuǎn)移目的地址(

39、PC)=30FFH,程序向后轉(zhuǎn)到30FFH單元開始執(zhí)行。 由上可見:若addr11相同,則AJMP指令的機(jī)器碼相同,但轉(zhuǎn)移的目的地址卻可能不同,這是因?yàn)檗D(zhuǎn)移的目的地址是由PC當(dāng)前值的高5位與addr11共同決定的。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 3SJMP(相對(duì)短轉(zhuǎn)指令相對(duì)短轉(zhuǎn)指令) 指令的操作數(shù)rel用8位帶符號(hào)數(shù)補(bǔ)碼表示,占指令的一個(gè)字節(jié)。因?yàn)?位補(bǔ)碼的取值范圍為-128+127,所以該指令的轉(zhuǎn)移范圍是:相對(duì)PC當(dāng)前值向前轉(zhuǎn)128字節(jié),向后轉(zhuǎn)127字節(jié)。即轉(zhuǎn)移目的地址= SJMP指令所在地址+2+rel 如在2100H單元有SJMP指令,若rel = 5AH(正數(shù)),

40、則轉(zhuǎn)移目的地址為215CH(向后轉(zhuǎn));若rel = F0H(負(fù)數(shù)),則轉(zhuǎn)移目的地址為20F2H(向前轉(zhuǎn))。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 用匯編語言編程時(shí),指令中的相對(duì)地址rel往往用欲轉(zhuǎn)移至的地址的標(biāo)號(hào)(符號(hào)地址)表示。機(jī)器匯編時(shí),能自動(dòng)算出相對(duì)地址值;但手工匯編時(shí),需自己計(jì)算相對(duì)地址值rel。rel的計(jì)算公式如下: 向前轉(zhuǎn)移:rel = FEH - (SJMP指令地址與目的地址差的絕對(duì)值) 向后轉(zhuǎn)移:rel = FEH - (SJMP指令地址與目的地址差的絕對(duì)值) -2 若rel = FEH,即目的地址就是SJMP指令的地址,在匯編指令中的偏移地址可用 $ 符號(hào)表示。

41、若在程序的末尾加上SJMP $(機(jī)器碼為80 FEH),則程序就不會(huì)再向后執(zhí)行,造成單指令的無限循環(huán),進(jìn)入等待狀態(tài)。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 4JMP A+DPTR(相對(duì)長(zhǎng)轉(zhuǎn)移指令相對(duì)長(zhǎng)轉(zhuǎn)移指令) 它是以數(shù)據(jù)指針DPTR的內(nèi)容為基址,以累加器A的內(nèi)容為相對(duì)偏移量,在64 KB范圍內(nèi)無條件轉(zhuǎn)移。該指令的特點(diǎn)是轉(zhuǎn)移地址可以在程序運(yùn)行中加以改變。例如,當(dāng)DPTR為確定值,根據(jù)A的不同值就可以實(shí)現(xiàn)多分支的轉(zhuǎn)移。該指令在執(zhí)行后不會(huì)改變DPTR及A中原來的內(nèi)容。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例例例16 根據(jù)累加器A的值,轉(zhuǎn)不同處理程序的入口。 MOV DPT

42、R,#TABLE ;表首地址送DPTR JMP A+DPTR ;根據(jù)A值轉(zhuǎn)移 TABLE:AJMP TAB1 ;當(dāng)(A)=0時(shí)轉(zhuǎn)TAB1執(zhí)行 AJMP TAB2 ;當(dāng)(A)=2時(shí)轉(zhuǎn)TAB2執(zhí)行 AJMP TAB3 ;當(dāng)(A)=4時(shí)轉(zhuǎn)TAB3執(zhí)行第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.6.2 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令 條件轉(zhuǎn)移指令是當(dāng)某種條件滿足時(shí),程序轉(zhuǎn)移執(zhí)行;條件不滿足時(shí),程序仍按原來順序執(zhí)行。轉(zhuǎn)移的條件可以是上一條指令或更前一條指令的執(zhí)行結(jié)果(常體現(xiàn)在標(biāo)志位上),也可以是條件轉(zhuǎn)移指令本身包含的某種運(yùn)算結(jié)果。由于該類指令采用相對(duì)尋址,因此程序可在以當(dāng)前PC值為中心的-128+

43、127范圍內(nèi)轉(zhuǎn)移。該類指令共有8條,可以分為累加器判零條件轉(zhuǎn)移指令、比較條件轉(zhuǎn)移指令和減1條件轉(zhuǎn)移指令三類。表3.5中列出了這些指令。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例表表3.5 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 1判零條件轉(zhuǎn)移指令判零條件轉(zhuǎn)移指令 判零條件轉(zhuǎn)移指令以累加器A的內(nèi)容是否為0作為轉(zhuǎn)移的條件。JZ指令是為0轉(zhuǎn)移,不為0則順序執(zhí)行;JNZ指令是不為0轉(zhuǎn)移,為0則順序執(zhí)行。累加器A的內(nèi)容是否為0,是由這條指令以前的其它指令執(zhí)行的結(jié)果決定的,執(zhí)行這條指令不作任何運(yùn)算,也不影響標(biāo)志位。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言

44、程序示例 例17 將片外RAM首地址為DATA1的一個(gè)數(shù)據(jù)塊轉(zhuǎn)送到片內(nèi)RAM首地址為DATA2的存儲(chǔ)區(qū)中。 外部RAM向內(nèi)部RAM的數(shù)據(jù)轉(zhuǎn)送一定要經(jīng)過累加器A,利用判零條件轉(zhuǎn)移正好可以判別是否要繼續(xù)傳送或者終止。完成數(shù)據(jù)傳送的參考程序如下: MOV R0,#DATA1 ;R0作為外部數(shù)據(jù)塊的地址指針 MOV R1,#DATA1 ;R1作為內(nèi)部數(shù)據(jù)塊的地址指針LOOP: MOVX A,R0 ;取外部RAM數(shù)據(jù)送入AHERE: JZ HERE ;數(shù)據(jù)為零則終止傳送 MOV R1,A ;數(shù)據(jù)傳送至內(nèi)部RAM 單元 INC R0 ;修改指針,指向下一數(shù)據(jù)地址 INC R1 SJMP LOOP ;循環(huán)取

45、數(shù)第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 2比較轉(zhuǎn)移指令比較轉(zhuǎn)移指令 比較轉(zhuǎn)移指令共有4條。這組指令是先對(duì)兩個(gè)規(guī)定的操作數(shù)進(jìn)行比較,根據(jù)比較的結(jié)果來決定是否轉(zhuǎn)移。若兩個(gè)操作數(shù)相等,則不轉(zhuǎn)移,程序順序執(zhí)行;若兩個(gè)操作數(shù)不等,則轉(zhuǎn)移。比較是進(jìn)行一次減法運(yùn)算,但其差值不保存,兩個(gè)數(shù)的原值不受影響,而標(biāo)志位要受到影響。利用標(biāo)志位CY作進(jìn)一步的判斷,可實(shí)現(xiàn)三分支轉(zhuǎn)移。 例例18 當(dāng)從P1口輸入數(shù)據(jù)為01H 時(shí),程序繼續(xù)執(zhí)行,否則等待,直到P1口出現(xiàn)01H。參考程序如下: MOV A,#01H ;立即數(shù)01H送AWAIT: CJNE A,P1,WAIT ;(P1)01H,則等待第3章 MCS

46、-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 3減減1條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令 減1條件轉(zhuǎn)移指令有兩條。每執(zhí)行一次這種指令,就把第一操作數(shù)減1,并把結(jié)果仍保存在第一操作數(shù)中,然后判斷是否為零。若不為零,則轉(zhuǎn)移到指定的地址單元,否則順序執(zhí)行。這組指令對(duì)于構(gòu)成循環(huán)程序是十分有用的,可以指定任何一個(gè)工作寄存器或者內(nèi)部RAM單元作為循環(huán)計(jì)數(shù)器。每循環(huán)一次,這種指令被執(zhí)行一次,計(jì)數(shù)器就減1。預(yù)定的循環(huán)次數(shù)不到,計(jì)數(shù)器不會(huì)為0,轉(zhuǎn)移執(zhí)行循環(huán)操作;到達(dá)預(yù)定的循環(huán)次數(shù),計(jì)數(shù)器就被減為0,順序執(zhí)行下一條指令,也就結(jié)束了循環(huán)。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例例19 將內(nèi)部RAM從DATA單元開始

47、的10個(gè)無符號(hào)數(shù)相加,相加結(jié)果送SUM單元保存。 設(shè)相加結(jié)果不超過8位二進(jìn)制數(shù),則相應(yīng)的程序如下: MOV R0,#0AH ;設(shè)置循環(huán)次數(shù) MOV R1,#DATA ;R1作地址指針,指向數(shù)據(jù)塊首地址 CLR A ;A清零LOOP: ADD A,R1 ;加一個(gè)數(shù) INC R1 ;修改指針,指向下一個(gè)數(shù) DJNZ R0,LOOP ;R0減1,不為0循環(huán) MOV SUM,A ;存10個(gè)數(shù)相加的和第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.7 子程序調(diào)用與返回指令子程序調(diào)用與返回指令3.7.1 子程序調(diào)用指令子程序調(diào)用指令子程序調(diào)用指令有長(zhǎng)調(diào)用和絕對(duì)調(diào)用兩條,它們都是雙周期指令。第3章

48、MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 LCALL和ACALL指令類似于轉(zhuǎn)移指令LJMP和AJMP,不同之處在于它們?cè)谵D(zhuǎn)移前要把執(zhí)行完該指令的PC內(nèi)容自動(dòng)壓入堆棧后,才將子程序入口地址addr16(或addr11)送PC,實(shí)現(xiàn)轉(zhuǎn)移。 LCALL與LJMP一樣提供16位地址,可調(diào)用64 KB范圍內(nèi)的子程序。由于該指令為3字節(jié),所以執(zhí)行該指令時(shí)首先應(yīng)執(zhí)行(PC)(PC)+3,以獲得下一條指令地址,并把此時(shí)的PC內(nèi)容壓入堆棧(先壓入低字節(jié),后壓入高字節(jié))作為返回地址,堆棧指針SP加2指向棧頂,然后把目的地址addr16送入PC。該指令執(zhí)行不影

49、響標(biāo)志位。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 ACALL與AJMP一樣提供11位地址,只能調(diào)用與PC在同一2 KB范圍內(nèi)的子程序。由于該指令為2字節(jié)指令,所以執(zhí)行該指令時(shí)應(yīng)執(zhí)行(PC)(PC)+2以獲得下一條指令地址,并把該地址壓入堆棧作為返回地址。該指令機(jī)器碼的構(gòu)成也與AJMP類似,只不過操作碼第一字節(jié)其高半字節(jié)的最后一位是1,機(jī)器碼的組成如下:a10 a9 a8 1 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 被調(diào)用子程序的目的地址也是由執(zhí)行 ACALL指令的當(dāng)前PC值的高5位與指令中提供的11位直接地址形成。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語

50、言程序示例3.7.2 返回指令返回指令 返回指令共兩條:一條是對(duì)應(yīng)兩條調(diào)用指令的子程序返回指令RET,另一條是對(duì)應(yīng)從中斷服務(wù)程序的返回指令RETI。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 從上述兩條指令的功能操作看,都是從堆棧中彈出返回地址送PC,堆棧指針減2,但它們是兩條不同的指令。其有下面兩點(diǎn)不同: (1) 從使用上,RET指令必須作子程序的最后一條指令;RETI必須作中斷服務(wù)程序的最后一條指令。 (2) RETI指令除恢復(fù)斷點(diǎn)地址外,還恢復(fù)CPU響應(yīng)中斷時(shí)硬件自動(dòng)保護(hù)的現(xiàn)場(chǎng)信息。執(zhí)行RETI指令后,將清除中斷響應(yīng)時(shí)所置位的優(yōu)先級(jí)狀態(tài)觸發(fā)器,使得已申請(qǐng)的同級(jí)或低級(jí)中斷申請(qǐng)可以

51、響應(yīng);而RET指令只能恢復(fù)返回地址。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.7.3 空操作指令空操作指令 NOP ;(PC)(PC)+1 空操作指令是一條單字節(jié)單周期指令。它控制 CPU不做任何操作,僅僅是消耗這條指令執(zhí)行所需要的一個(gè)機(jī)器周期的時(shí)間,不影響任何標(biāo)志位,故稱為空操作指令。NOP指令在設(shè)計(jì)延時(shí)程序、拼湊精確延時(shí)時(shí)間及在程序等待或修改程序等場(chǎng)合是很有用的。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.8 位操作類指令位操作類指令 位操作類指令在單片機(jī)指令系統(tǒng)中占有重要地位,這是因?yàn)閱纹瑱C(jī)在控制系統(tǒng)中主要用于控制線路通、斷,繼電器的吸合與釋放等。 位操作也稱布

52、爾變量操作,它是以位(bit)作為單位來進(jìn)行運(yùn)算和操作的。MCS-51單片機(jī)內(nèi)部有一個(gè)功能相對(duì)獨(dú)立的布爾處理機(jī),它有借用進(jìn)位標(biāo)志CY作為位累加器,有位存儲(chǔ)器(即位尋址區(qū)中的各位),指令系統(tǒng)中有17條專門進(jìn)行位處理的指令集。位處理指令可以完成以位為對(duì)象的數(shù)據(jù)轉(zhuǎn)送、運(yùn)算、控制轉(zhuǎn)移等操作。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 在位操作指令中,位地址的表示有以下不同的方法(以下均以程序狀態(tài)字寄存器PSW的第5位F0標(biāo)志為例說明): (1) 直接位地址表示,如D5H。 (2) 點(diǎn)表示(說明是什么寄存器的什么位),如PSW.5,說明是PSW的第5位。 (3) 位名稱表示,如直接用F0表示。

53、 (4) 用戶定義名稱表示,如用戶定義用FLG這一名稱來代替F0,則在指令中允許用FLG表示F0標(biāo)志位。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例表3.6 條件轉(zhuǎn)移指令 第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 例20 利用位操作指令,模擬圖3.6所示硬件邏輯電路的功能。參考程序如下: PR2: MOV C,P1.1 ;(CY) (P1.1) ORL C, P1.2 ;(CY) (P1.1) (P1.2)=AANL C,P1.0 ;(CY)(P1.0)A CPL C ;(CY)(P1.0)A=B MOV F0,C ;F0內(nèi)暫存B MOV C,P1.3 ;(CY)(P1.3

54、) ANL C,/P1.4 ;(CY)(P1.3)(P1.4)=D ORL C,F(xiàn)0 ;(CY)BD MOV P1.5,C ;運(yùn)算結(jié)果送入P1.5 RET第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例圖3.6 硬件邏輯電路圖第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例3.9 匯編程序格式與偽指令匯編程序格式與偽指令 1匯編程序格式匯編程序格式 匯編程序是指令系統(tǒng)的一個(gè)子集,只要指令按格式書寫就構(gòu)成了程序的基本格式。在程序中指令書寫具有如下格式: 標(biāo)號(hào): 操作碼助記符 源操作數(shù),目的操作數(shù) ;注釋 標(biāo)號(hào)用在指令的前邊,必須跟:,表示符號(hào)地址。一般在程序中有特定用途的地方加標(biāo)號(hào),如轉(zhuǎn)

55、移目標(biāo)執(zhí)行指令的前面需加標(biāo)號(hào),并不是所有指令前面都需要加標(biāo)號(hào)。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 2偽指令偽指令 偽指令不要求計(jì)算機(jī)做任何操作,也沒有對(duì)應(yīng)的機(jī)器碼,不產(chǎn)生目標(biāo)程序,不影響程序的執(zhí)行,僅僅是能夠幫助進(jìn)行匯編的一些指令。它主要用來指定程序或數(shù)據(jù)的起始位置,給出一些連續(xù)存放數(shù)據(jù)的地址或?yàn)橹虚g運(yùn)算結(jié)果保留一部分存儲(chǔ)空間以及表示源程序結(jié)束等等。不同版本的匯編語言,偽指令的符號(hào)和含義可能有所不同,但基本用法是相似的。下面介紹幾種常用的偽指令。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 1) 設(shè)置目標(biāo)程序起始地址偽指令ORG 格式:符號(hào): ORG 地址(十六進(jìn)制表

56、示) 該偽指令的功能是規(guī)定其后面的目標(biāo)程序或數(shù)據(jù)塊的起始地址。它放在一段源程序(主程序、子程序)或數(shù)據(jù)塊的前面,說明緊跟在其后的程序段或數(shù)據(jù)塊的起始地址就是ORG后面給出的地址。例如: ORG 2000HSTART:MOV A,#7FH第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 2) 結(jié)束匯編偽指令END 格式:符號(hào): END END是匯編語言源程序的結(jié)束標(biāo)志,表示匯編結(jié)束。在END以后所寫的指令,匯編程序都不予處理。一個(gè)源程序只能有一個(gè)END命令,否則就有一部分指令不能被匯編。如果END前面加標(biāo)號(hào)的話,則應(yīng)與被結(jié)束程序段的起始點(diǎn)的標(biāo)號(hào)一致,以表示結(jié)束的是哪一個(gè)程序段。第3章 MCS

57、-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 3) 定義字節(jié)偽指令DB 格式:標(biāo)號(hào): DB 項(xiàng)或項(xiàng)表 其中項(xiàng)或項(xiàng)表指一個(gè)字節(jié)數(shù)據(jù),用逗號(hào)分開的字節(jié)數(shù)據(jù)串,或以引號(hào)括起來的字符串。該偽指令的功能是把項(xiàng)或項(xiàng)表的數(shù)據(jù)(字符串按字符順序以ASCII碼)存入從標(biāo)號(hào)地址開始的連續(xù)存儲(chǔ)單元中。例如: ORG 2000HTAB1: DB 30H,8AH,7FH,73 DB 5,A,BCD第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 由于ORG 2000H,所以TAB1的地址為2000H,因此,以上偽指令經(jīng)匯編后,將對(duì)2000H開始的連續(xù)存儲(chǔ)單元賦值:(2000H)=30H(2001H)=8AH(2002H)

58、=7FH(2003H)=49H ;十進(jìn)制數(shù)73以十六進(jìn)制數(shù)存放(2004H)=35H ;35H是數(shù)字5的ASCII碼(2005H)=41H ;41H是字母A的ASCII碼(2006H)=42H ;42H是字符串BCD中B的ASCII碼(2007H)=43H ;43H是字符串BCD中C的ASCII碼(2008H)=44H ;44H是字符串BCD中D的ASCII碼第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 4) 定義字偽指令DW 格式:標(biāo)號(hào): DW 項(xiàng)或項(xiàng)表 DW偽指令與DB相似,但用于定義字的內(nèi)容。項(xiàng)或項(xiàng)表指所定義的一個(gè)字(兩個(gè)字節(jié))或用逗號(hào)分開的字串。匯編時(shí),機(jī)器自動(dòng)按高8位先存入,

59、低8位在后的格式排列。例如: ORG 1500HTAB2: DW 1234H,80H 匯編以后:(1500H)=12H,(1501H)=34H,(1502H)=00H, (1503H)=80H第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 5) 預(yù)留存儲(chǔ)空間偽指令DS 格式:標(biāo)號(hào): DS 表達(dá)式 該偽指令的功能是從標(biāo)號(hào)地址開始,保留若干個(gè)字節(jié)的內(nèi)存空間以備存放數(shù)據(jù)。保留的字節(jié)單元數(shù)由表達(dá)式的值決定。例如: ORG 1000H DS 20H BD 30H,8FH 匯編后從1000H開始,預(yù)留32(20H)個(gè)字節(jié)的內(nèi)存單元,然后從1020H開始,按照下一條DB指令賦值,即(1020H)=30

60、H,(1021H)=8FH。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 6) 等值偽指令EQU 格式:標(biāo)號(hào): EQU 項(xiàng) 該偽指令的功能是將指令中的項(xiàng)的值賦予EQU前面的標(biāo)號(hào)。項(xiàng)可以是常數(shù)、地址標(biāo)號(hào)或表達(dá)式。例如:TAB1: EQU 1000HTAB2: EQU 2000H 匯編后TAB1、TAB2分別具有值1000H、2000H。 用EQU偽指令對(duì)某標(biāo)號(hào)賦值后,該標(biāo)號(hào)的值在整個(gè)程序中不能再改變。第3章 MCS-51單片機(jī)指令系統(tǒng)和匯編語言程序示例 7) 位地址定義偽指令BIT 格式:標(biāo)號(hào): BIT 位地址 該偽指令的功能是將位地址賦予BIT前面的標(biāo)號(hào),經(jīng)賦值后可用該標(biāo)號(hào)代替BIT后

溫馨提示

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

評(píng)論

0/150

提交評(píng)論