官术网_书友最值得收藏!

4.2 MCS-51單片機(jī)指令系統(tǒng)基礎(chǔ)

4.2.1 概述

MCS-51單片機(jī)指令系統(tǒng)具有功能強(qiáng)、指令短、執(zhí)行快等特點(diǎn)。MCS-51單片機(jī)指令系統(tǒng)共有42種操作為助記符,用來(lái)描述33種操作功能,它由111條指令組成。

從功能上可劃分為數(shù)據(jù)傳送類指令(29條)、算術(shù)運(yùn)算類指令(24條)、邏輯運(yùn)算類指令(24條)、控制轉(zhuǎn)移類指令(17條)、位操作類指令(17條);從空間屬性上分為單字節(jié)指令(49條)、雙字節(jié)指令(45條)和最長(zhǎng)的三字節(jié)指令(17條);從時(shí)間屬性上可分為單機(jī)器周期指令(64條)、雙機(jī)器周期指令(45條)和乘、除兩條需4個(gè)機(jī)器周期的指令。

MCS-51單片機(jī)指令系統(tǒng)在存儲(chǔ)空間和執(zhí)行時(shí)間方面具有較高的效率,是一種簡(jiǎn)明、易掌握、功能強(qiáng)的指令系統(tǒng)。

MCS-51單片機(jī)指令系統(tǒng)中有一個(gè)處理布爾變量的指令子集。這個(gè)指令子集在設(shè)計(jì)處理大量位變量程序時(shí)十分有效、方便,使MCS-51單片機(jī)更適合于實(shí)時(shí)控制,使其指令系統(tǒng)大增特色。

4.2.2 指令描述約定

為便于后面對(duì)MCS-51單片機(jī)指令系統(tǒng)的學(xué)習(xí),在這里先對(duì)描述指令的一些符號(hào)的約定意義進(jìn)行說(shuō)明:

Rn:現(xiàn)行選定的工作寄存器區(qū)中8個(gè)寄存器R7~R0(n=0~7)。

direct:8位片內(nèi)數(shù)據(jù)存儲(chǔ)單元地址。它可以是一個(gè)內(nèi)部數(shù)據(jù)RAM單元(0~127)或一個(gè)專用寄存器地址(即I/O接口、控制寄存器、狀態(tài)寄存器等)(128~255)。

@Ri:通過(guò)寄存器R1或R0間接尋址的8位片內(nèi)數(shù)據(jù)RAM單元(0~255),i=0,1。

#data:指令中8位立即數(shù)。

#data16:指令中16位立即數(shù)。

addr16:16位目標(biāo)地址。用于LCALL和LJMP指令,可指向64KB程序存儲(chǔ)器地址空間的任何地方。

addr11:11位目標(biāo)地址。用于ACALL和AJMP指令,轉(zhuǎn)向至下一條指令第一字節(jié)所在的同一個(gè)2KB程序存儲(chǔ)器地址空間內(nèi)。

rel:帶符號(hào)的8位偏移量字節(jié)。用于SJMP和所有條件轉(zhuǎn)移指令中。偏移字節(jié)相對(duì)于下一條指令第一字節(jié)計(jì)算,在-128~+127范圍內(nèi)取值。

bit:內(nèi)部數(shù)據(jù)RAM或?qū)S眉拇嫫骼锏闹苯訉ぶ肺弧?/p>

/bit:表示對(duì)該位取反操作。

(X):X中的內(nèi)容。

((X)):由X所指向的單元中的內(nèi)容。

4.2.3 尋址方式

尋址就是尋找指令中操作數(shù)或操作數(shù)所在的地址。

在高級(jí)語(yǔ)言編程時(shí),程序設(shè)計(jì)人員不必關(guān)心程序和數(shù)據(jù)的內(nèi)存空間的安排問(wèn)題,但在匯編語(yǔ)言程序設(shè)計(jì)時(shí),要針對(duì)系統(tǒng)的硬件環(huán)境編程,數(shù)據(jù)的存放、傳送、運(yùn)算都要通過(guò)指令來(lái)完成,編程者必須自始至終都十分清楚操作數(shù)的位置,以便將它們傳送至適當(dāng)?shù)目臻g去操作。因此,如何尋找存放操作數(shù)的空間位置和提取操作數(shù)就變得十分重要。所謂尋址方式,就是如何找到存放操作數(shù)的地址,把操作數(shù)提取出來(lái)的方法,它是計(jì)算機(jī)的重要性能指標(biāo)之一,也是匯編語(yǔ)言程序設(shè)計(jì)中最基本的內(nèi)容之一。

MCS-51單片機(jī)基本尋址方式有7種:立即尋址、寄存器尋址、直接尋址、寄存器間接尋址、基寄存器加變址寄存器間接尋址、相對(duì)尋址、位尋址。

1.立即尋址

指令中給出的是一個(gè)具體的數(shù)值,操作時(shí)是對(duì)該數(shù)據(jù)操作。立即數(shù)只能作為源操作數(shù)出現(xiàn)在指令中,緊跟在操作碼的后面,作為指令的一部分與操作碼一起存放在程序存儲(chǔ)器中,可以立即得到并執(zhí)行,不需要經(jīng)過(guò)別的途徑去尋找,故稱為立即尋址。在匯編指令中,在一個(gè)數(shù)的前面冠以“#”號(hào)作為前綴,就表示該數(shù)為立即數(shù)。例如:

            MOV     A,#70H

指令中70H就是立即數(shù)。這一條指令的功能是執(zhí)行將立即數(shù)70H傳送到累加器A中的操作。該指令操作碼的機(jī)器碼為74H,占用一個(gè)字節(jié)存儲(chǔ)單元,立即數(shù)70H存放在緊跟在其后的一個(gè)字節(jié)存儲(chǔ)單元,作為指令代碼的一部分。整條指令的機(jī)器碼為74H 70H。

2.寄存器尋址

指令中給出的是某一寄存器的名字,操作時(shí)是將該寄存器中的內(nèi)容取出來(lái)進(jìn)行操作。例如:

            MOV     A,R0

指令中源操作數(shù)和目的操作數(shù)都是寄存器尋址。該指令的功能是把工作寄存器R0中的內(nèi)容傳送到累加器A中,如R0中的內(nèi)容為70H,則執(zhí)行該指令后A的內(nèi)容也是70H。

寄存器尋址按所選定的工作寄存器R0~R7進(jìn)行操作,指令機(jī)器碼的低3位的8種組合000, 001, …, 110, 111分別指明所用的工作寄存器R0, R1, …, R6, R7。如MOV A,Rn(n=0~7),這8條指令對(duì)應(yīng)的機(jī)器碼分別位E8H~EFH。

累加器ACC、寄存器B、數(shù)據(jù)指針DPTR和進(jìn)位C(位累加器C)也可用寄存器尋址方式訪問(wèn),只是對(duì)它們的尋址,具體寄存器名隱含在操作碼中。

3.直接尋址

指令中給出的是某一存儲(chǔ)單元地址,操作時(shí)是對(duì)該單元中的內(nèi)容進(jìn)行操作。該地址指出了參與運(yùn)算或傳送的數(shù)據(jù)所在的字節(jié)單元或位的地址。例如:

            MOV     A,70H

指令中源操作數(shù)就是直接尋址,70H為操作數(shù)的地址。該指令的功能是把片內(nèi)RAM地址為70H單元的內(nèi)容送到A中。該指令的機(jī)器碼為E5H 70H,8位直接地址在指令操作碼中占一個(gè)字節(jié)。

直接尋址方式訪問(wèn)以下存儲(chǔ)空間:

① 特殊功能寄存器(特殊功能寄存器只能用直接尋址方式訪問(wèn),既可以用它們的地址,也可以使用它們的名字)。

② 片內(nèi)數(shù)據(jù)存儲(chǔ)器的低128B(對(duì)于52子系列芯片,其內(nèi)部數(shù)據(jù)存儲(chǔ)器高128B(80~0FFH)不能用直接尋址方式訪問(wèn))。

由于52子系列的片內(nèi)RAM有256個(gè)單元,其高128個(gè)單元與SFR的地址是重疊的。為了避免混亂,單片機(jī)規(guī)定:直接尋址的指令不能訪問(wèn)片內(nèi)RAM的高128 個(gè)單元(80H~FFH),若要訪問(wèn)這些單元只能用寄存器間接尋址指令,而要訪問(wèn)SFR只能用直接尋址指令。另外,訪問(wèn)SFR可在指令中直接使用該寄存器的名字來(lái)代替地址,如:

            MOV     A,80H

可以寫(xiě)成

            MOV     A,P0

因?yàn)镻0口的地址為80H。

③位地址空間。

4.寄存器間接尋址

指令中給出的是某一寄存器的名字,操作時(shí)以該寄存器中的內(nèi)容為地址,將該地址中的數(shù)據(jù)取出來(lái)進(jìn)行操作。這里需要強(qiáng)調(diào)的是,寄存器中的內(nèi)容并不表示操作數(shù)本身,而是操作數(shù)的地址,到該地址單元中才能得到操作數(shù)。寄存器起地址指針的作用。例如:

            MOV     A,@R1

指令的源操作數(shù)是寄存器間接尋址。該指令的功能是將以工作寄存器R1中的內(nèi)容為地址的片內(nèi)RAM單元的數(shù)據(jù)傳送到A中去。若R1中的內(nèi)容為70H,片內(nèi)RAM地址為70H的單元中的內(nèi)容為2FH,則執(zhí)行該指令后,片內(nèi)RAM 70H單元的內(nèi)容2FH被送到A中。寄存器間接尋址示意圖如圖4-2所示。

圖4-2 寄存器間接尋址方式示意圖

可用做寄存器間接尋址的寄存器只有工作寄存器R0、R1和DPTR。用R0、R1作為地址指針時(shí),可尋址片內(nèi)RAM的256個(gè)單元,但不能訪問(wèn)SFR塊,也可以8位地址訪問(wèn)片外RAM的低256個(gè)地址單元。DPTR作為地址指針用于訪問(wèn)片外RAM的64KB范圍。

5.基寄存器加變址寄存器間接尋址

指令中給出的是某一基寄存器(數(shù)據(jù)指針DPTR或PC)和某一變址寄存器(累加器A),操作時(shí)以給出的基寄存器和變址寄存器中的內(nèi)容之和為地址,將該地址中的數(shù)據(jù)取出來(lái)進(jìn)行操作。這種尋址方式常用于訪問(wèn)程序存儲(chǔ)器中的常數(shù)表。例如:

            MOVC    A,@A+DPTR

指令中的源操作數(shù)就是這種尋址方式。該指令尋址及操作功能如圖4-3所示。

圖4-3 基寄存器加變址寄存器的間接尋址方式示意圖

6.相對(duì)尋址

相對(duì)尋址是以當(dāng)前程序計(jì)數(shù)器PC值加上指令中給出的偏移量rel,而構(gòu)成實(shí)際操作數(shù)地址的尋址方式。它用于訪問(wèn)程序存儲(chǔ)器,常出現(xiàn)在相對(duì)轉(zhuǎn)移指令中。

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

① 當(dāng)前PC值是指相對(duì)轉(zhuǎn)移指令的存儲(chǔ)地址加上該指令的字節(jié)數(shù)。例如:

            JZ  rel

是一條累加器A為0就轉(zhuǎn)移的雙字節(jié)指令。若該指令的存儲(chǔ)地址為2050H,則執(zhí)行該指令時(shí)的當(dāng)前PC值即為2052H,即當(dāng)前PC值是相對(duì)轉(zhuǎn)移指令取指結(jié)束時(shí)的值。

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

目的地址=當(dāng)前PC值+rel=指令存儲(chǔ)地址+指令字節(jié)數(shù)+rel

7.位尋址

位尋址是在位操作指令中直接給出位操作數(shù)的地址,可以對(duì)片內(nèi)RAM中的128位和特殊功能寄存器SFR中的93位進(jìn)行尋址。

雖然MCS-51單片機(jī)的尋址方式有多種,但指令對(duì)哪一個(gè)存儲(chǔ)器空間進(jìn)行操作是由指令的操作碼和尋址方式確定的??傮w來(lái)說(shuō),具有以下幾點(diǎn)原則:

① 對(duì)程序存儲(chǔ)器只能采用基寄存器加變址寄存器間接尋址方式。

② 對(duì)特殊功能寄存器空間只能采用直接尋址方式(可以用符號(hào)來(lái)代表地址),不能采用寄存器間接尋址方式。

③(對(duì)52單片機(jī))內(nèi)部數(shù)據(jù)存儲(chǔ)器的高128B,只能采用寄存器間接尋址方式,不能采用直接尋址方式。

④ 內(nèi)部數(shù)據(jù)存儲(chǔ)器低128B既能采用寄存器間接尋址方式,又能采用直接尋址方式。

⑤ 外部擴(kuò)展的數(shù)據(jù)存儲(chǔ)器及I/O接口只能采用MOVX指令來(lái)訪問(wèn)。

主站蜘蛛池模板: 白山市| 和政县| 廉江市| 都兰县| 兰溪市| 临高县| 双柏县| 修水县| 叙永县| 和政县| 加查县| 昌江| 博乐市| 安达市| 桦川县| 拜城县| 贵定县| 大姚县| 嘉禾县| 蓬莱市| 大连市| 沾化县| 高淳县| 奉新县| 砀山县| 额尔古纳市| 盐山县| 大足县| 宁夏| 策勒县| 双流县| 绍兴市| 富锦市| 衡南县| 镇巴县| 扎鲁特旗| 札达县| 嵊泗县| 洪江市| 台山市| 黔江区|