第3章1AT89C51的指令系統(tǒng)_第1頁
第3章1AT89C51的指令系統(tǒng)_第2頁
第3章1AT89C51的指令系統(tǒng)_第3頁
第3章1AT89C51的指令系統(tǒng)_第4頁
第3章1AT89C51的指令系統(tǒng)_第5頁
已閱讀5頁,還剩106頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章AT89C51的指令系統(tǒng)本章介紹89C51的匯編語言指令系統(tǒng)。3.1指令系統(tǒng)概述

AT89C51的基本指令共111條,按指令所占的字節(jié)來分:

(1)單字節(jié)指令49條;

(2)雙字節(jié)指令45條;

(3)三字節(jié)指令17條。按指令的執(zhí)行時(shí)間來分:

(1)1個(gè)機(jī)器周期(12個(gè)時(shí)鐘振蕩周期)指令64條

(2)2個(gè)機(jī)器周期(24個(gè)時(shí)鐘振蕩周期)指令45條(3)只有乘、除兩條指令的執(zhí)行時(shí)間為4個(gè)機(jī)器周期(48個(gè)時(shí)鐘振蕩周期)。12MHz晶振:機(jī)器周期為1

s。6MHz晶振:機(jī)器周期為2

s。3.2指令格式

兩部分組成,即操作碼和操作數(shù)。

操作碼:規(guī)定指令進(jìn)行什么操作

操作數(shù):指令操作的對(duì)象有單字節(jié)指令、雙字節(jié)指令、三字節(jié)不同長(zhǎng)度的指令,格式不同:(1)單字節(jié)指令:操作碼、操作數(shù)

同在一個(gè)字節(jié)中。

(2)雙字節(jié)指令:操作碼+操作數(shù)。

(3)三字節(jié)指令:操作碼+操作數(shù)+操作數(shù)。

3.3指令系統(tǒng)的尋址方式尋址方式就是在指令中說明操作數(shù)所在地址的方法。共7種尋址方式。

1.寄存器尋址方式

操作數(shù)在寄存器中

MOVA,Rn;(Rn)→A,n=0~7

MOVA,R1;若R1存放操作數(shù)位3CH,則指令的結(jié)果是A=3CH。執(zhí)行表示把寄存器Rn的內(nèi)容傳送給累加器A尋址范圍:(1)4組通用工作寄存區(qū)共32個(gè)工作寄存器。(OOH~1FH)(2)部分特殊功能寄存器,例如A、B以及數(shù)據(jù)指針寄存器DPTR等。2.直接尋址方式

操作數(shù)直接以單元地址的形式給出:

MOVA,40H;MOVTCON,A;MOVA,P1;

ADDA,43H

尋址范圍:

(1)內(nèi)部RAM的128個(gè)單元

(2)特殊功能寄存器。除了以單元地址的形式外,還可用寄存器符號(hào)的形式給出。例如:

MOVA,80H

與MOVA,P0是等價(jià)的。3.寄存器間接尋址方式

寄存器中存放的是操作數(shù)的地址,在寄存器前加前綴標(biāo)志“@”

。訪問內(nèi)部RAM或外部RAM的低256個(gè)字節(jié)時(shí),只能采用R0或R1作為間址寄存器。例如:

MOVA,@Ri

;i=0或1

其中Ri中的內(nèi)容為40H,把內(nèi)部RAM40H單元內(nèi)容送A。尋址范圍:(1)訪問內(nèi)部RAM低128個(gè)單元,其通用形式為@Ri(2)對(duì)外部?jī)?nèi)部RAM的64K字節(jié)的間接尋址,例如: MOVXA,@DPTR(3)片外數(shù)據(jù)存儲(chǔ)器的低256字節(jié)例如:MOVXA,@Ri(4)堆棧區(qū)堆棧操作指令PUSH(壓棧)和POP(出棧)使用堆棧指針(SP)作間址寄存器4.立即尋址方式

操作數(shù)在指令中直接給出,需在操作數(shù)前面加前綴“#”。例如:MOVA,#40H;A40H

MOVDPTR,#2000H;DPTR2000H5.基址寄存器加變址寄存器間址尋址方式

本尋址方式是以DPTR或PC作基址寄存器,以累加器A作為變址寄存器。例如:指令MOVCA,@A+DPTR

其中A的原有內(nèi)容為05H,DPTR的內(nèi)容為0400H,該指令執(zhí)行的結(jié)果是把程序存儲(chǔ)器0405H單元的內(nèi)容傳送給A。說明:(1)本尋址方式是專門針對(duì)程序存儲(chǔ)器的尋址方式,尋址范圍可達(dá)到64KB。(2)本尋址方式的指令只有3條:

MOVCA,@A+DPTR MOVCA,@A+PC JMP@A+DPTR(3)用程序指針PC作基地址,A作變址,形成操作數(shù)地址:@A+PC。例如:執(zhí)行下列指令:地址目標(biāo)代碼匯編指令

21007406MOVA,#06H210283MOVCA,@A+PC210300NOP210400NOP

﹕﹕﹕﹕

210932DB32H

當(dāng)執(zhí)行到MOVCA,@A+PC時(shí),當(dāng)前PC=2103H,A=06H,因此@A+PC指示的地址是2109H,該指令的執(zhí)行結(jié)果是A=32H。(4)用數(shù)據(jù)指針DPTR作基地址,A作變址,形成操作數(shù)地址:@A+DPTR。例如,執(zhí)行下列指令:

MOVA,#01HMOVDPTR,#TABLEMOVCA,@A+DPTRTABLE:DB41HDB42H

﹕﹕上面程序中,變址偏移量A=01H,基地址為表的首地址TABLE,指令執(zhí)行后將地址為TABLE=01H程序存儲(chǔ)器單元的內(nèi)容送給A,執(zhí)行結(jié)果是A=42H。6.位尋址方式

MCS-51有位處理功能,可以對(duì)數(shù)據(jù)位進(jìn)行操作。例如:MOVC,40H

是把位40H的值送到進(jìn)位位C。尋址范圍包括:(1)內(nèi)部RAM中的位尋址區(qū)。位有兩種等價(jià)的表示方法:(1)直接就是位地址,如40H;(2)另一種(28H).0,是28H單元中的最低位。(2)特殊功能寄存器中的可尋址位

在指令中有4種表示方法:a.直接使用位地址。例如PSW.5的位地址為0D5H。b.位名稱的表示方法。例如:PSW.5是F0標(biāo)志位,可使用F0表示該位。c.單元地址加位數(shù)的表示方法。例如:(0D0H).5。d.特殊功能寄存器符號(hào)加位數(shù)的表示方法。例如:PSW.5。位地址包括:內(nèi)部RAM地址空間的可進(jìn)行位尋址的128位和SFR地址空間的可位尋址的11個(gè)8位寄存器的88位。例:MOVC,07H;C(07H)SETBEX0;EX01

07H是內(nèi)部RAM的位地址空間的1個(gè)位地址,該指令的功能是將07H內(nèi)的操作數(shù)位送累加器C中。若(07H)=1,則指令執(zhí)行結(jié)果C=1。

EX0是IE寄存器的第0位,相對(duì)位地址是A8H,指令功能是將EX0位置1,指令執(zhí)行結(jié)果是EX0=1。7.相對(duì)尋址方式

在相對(duì)尋址的轉(zhuǎn)移指令中,給出了地址偏移量,以“rel”表示,即把PC的當(dāng)前值加上偏移量就構(gòu)成了程序轉(zhuǎn)移的目的地址:目的地址=轉(zhuǎn)移指令所在的地址+轉(zhuǎn)移指令的字節(jié)數(shù)+rel

偏移量rel是一帶符號(hào)的8位二進(jìn)制數(shù)補(bǔ)碼數(shù)。范圍是:–128-+127

例如:SJMP08H;雙字節(jié)指令設(shè)PC=2000H為本指令的地址,則PC的當(dāng)前值為2002H,轉(zhuǎn)移目標(biāo)地址為(2000H+02H)+08H=200AH例如:

JZ30H;若A=0時(shí),跳轉(zhuǎn)PCPC+2+rel;若A≠0時(shí),則程序順序執(zhí)行這時(shí)一個(gè)零跳轉(zhuǎn)指令,是雙字節(jié)指令。指令執(zhí)行完后,PC當(dāng)前值為該指令首字節(jié)所在單元地址+2,所以,目的地址=當(dāng)前PC的值+rel。向地址增加方向最大可轉(zhuǎn)移(127+轉(zhuǎn)移指令字節(jié))個(gè)單元地址,向地址減少方向最大可轉(zhuǎn)移(128-轉(zhuǎn)移指令字節(jié))個(gè)單元地址。

7種尋址方式及尋址空間,見表3-1。3.4AT89C51指令系統(tǒng)分類介紹111條指令,按功能分類,可分為下面5大類:(1)數(shù)據(jù)傳送類(28條)

(2)算術(shù)操作類(24條(3)邏輯運(yùn)算類(25條)

(4)控制轉(zhuǎn)移類(17條)

(5)位操作類(17條)指令中符號(hào)的意義:Rn當(dāng)前寄存器區(qū)的8個(gè)工作寄存器R0~R7(n=0~7)。Ri當(dāng)前寄存器區(qū)中可作間接尋址寄存器的2個(gè)寄存器R0、

R1(i=0,1)。Direct

直接地址,即8位的內(nèi)部RAM或特殊功能寄存器的字節(jié)地址。(RAM單元地址0~127,特殊功能寄存器的地址,如I/O端口、控制寄存器、狀態(tài)寄存器(128~255)#data

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

包含在指令中的16位立即數(shù)。rel

相對(duì)轉(zhuǎn)移指令中的偏移量,為8位的帶符號(hào)補(bǔ)碼數(shù)。DPTR

數(shù)據(jù)指針,可用作16位的數(shù)據(jù)地址寄存器。bit

內(nèi)部RAM或特殊功能寄存器中的直接尋址位。C(或Cy)進(jìn)位標(biāo)志位或位處理機(jī)中的累加器。addr11

11位目的地址(ACALL和AJMP;2K范圍調(diào)用)addr16

16位目的地址(LCALL和LJMP;64KB范圍調(diào)用)@間接尋址寄存器前綴,如@Ri,@A+DPTR(X)

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

由X尋址的單元中的內(nèi)容?!^右邊的內(nèi)容被箭頭左邊的內(nèi)容所取代。$當(dāng)前指令的首地址3.4.1數(shù)據(jù)傳送類指令

使用最頻繁的一類指令,通用格式:

MOV<目的操作數(shù)>,<源操作數(shù)>屬“復(fù)制”,而不是“搬家”數(shù)據(jù)傳送類指令不影響標(biāo)志位:Cy、Ac和OV,影響奇偶標(biāo)志位P。1.以累加器為目的操作數(shù)的指令

MOVA,Rn;(Rn)→A,n=0~7 MOVA,@Ri;((Ri))→A,i=0,1 MOVA,direct;(direct)→A MOVA,#data;#data→A

例如:

MOVA,R6;(R6)→A,寄存器尋址

MOVA,70H;(70H)→A,直接尋址

MOVA,@R0;((R0))→A,間接尋址

MOVA,#78H;78H→A,立即尋址

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

MOVRn,A;(A)→Rn,n=0~7 MOVRn,direct;(direct)→Rn,n=0~7MOVRn,#dat;#data→Rn,n=0~7功能:是把源操作數(shù)的內(nèi)容送入當(dāng)前一組工作寄存器區(qū)的R0~R7中的某一個(gè)寄存器。3.以直接地址direct為目的操作數(shù)的指令

MOVdirect,A;(A)→directMOVdirect,Rn;(Rn)→direct,n=0~7MOVdirect1,direct2; MOVdirect,@Ri;((Ri))→direct MOVdirect,#data;#data→direct功能:把源操作數(shù)送入直接地址指出的存儲(chǔ)單元。direct指的是內(nèi)部RAM或SFR的地址。4.以寄存器間接地址為目的操作數(shù)的指令

MOV@Ri,A;(A)→((Ri)),i=0,1MOV@Ri,direct;(direct)→((Ri))MOV@Ri,#data;#data→((Ri))5.16位數(shù)傳送指令

MOVDPTR,#data16;#data16→DPTR

唯一的16位數(shù)據(jù)的傳送指令

,立即數(shù)的高8位送入DPH,立即數(shù)的低8位送入DPL。6.堆棧操作指令MCS-51內(nèi)部RAM中可以設(shè)定一個(gè)后進(jìn)先出(LIFO-LastInFirstOut)的區(qū)域稱作堆棧.堆棧指針SP指出堆棧的棧頂位置。(1)進(jìn)棧指令

PUSHdirect

先將棧指針SP加1,然后把direct中的內(nèi)容送到棧指針SP指示的內(nèi)部RAM單元中。例如:當(dāng)(SP)=60H,(A)=30H,(B)=70H時(shí),

執(zhí)行:

PUSHACC

(SP)+1=61H→SP,(A)→61H

PUSHB ;(SP)+1=62H→SP,(B)→62H結(jié)果:(61H)=30H,(62H)=70H,(SP)=62H(2)出棧指令

POPdirectSP指示的棧頂(內(nèi)部RAM單元)內(nèi)容送入direct字節(jié)單元中,棧指針SP減1。例如:

當(dāng)(SP)=62H,(62H)=70H,(61H)=30H,

執(zhí)行:

POPDPH ;((SP))→DPH,(SP)-1→SPPOPDPL ;((SP))→DPL,(SP)-1→SP

結(jié)果:(DPTR)=7030H,(SP)=60H7.累加器A與外部數(shù)據(jù)存儲(chǔ)器傳送指令

MOVXA,@DPTR ;((DPTR))→A,讀外部RAM/IOMOVXA,@Ri ;((Ri))→A,讀外部RAM/IOMOVX@DPTR,A ;(A)→((DPTR)),寫外部RAM/IOMOVX@Ri,A ;(A)→((Ri)),寫外部RAM/IO功能:讀外部RAM存儲(chǔ)器或I/O中的一個(gè)字節(jié),或把A中一個(gè)字節(jié)的數(shù)據(jù)寫到外部RAM存儲(chǔ)器或I/O中。

注意:伴隨著RD*或WR*信號(hào)有效。

采用DPTR間接尋址,高8位地址(DPH)由P2口輸出,低8位地址(DPL)由P0口輸出。采用Ri(i=0,1)間接尋址,可尋址片外RAM的256個(gè)單元。Ri內(nèi)容由P0口輸出。MOV后“X”表示單片機(jī)訪問的是片外RAM存儲(chǔ)器或I/O。8.查表指令

共兩條,用于讀程序存儲(chǔ)器中的數(shù)據(jù)表格的指令,均采用基址寄存器加變址寄存器間接尋址方式。

(1)MOVCA,@A+PC

以PC作基址寄存器,A的內(nèi)容作為無符號(hào)整數(shù)和PC中的內(nèi)容(下一條指令的起始地址)相加后得到一個(gè)16位的地址,該地址指出的程序存儲(chǔ)單元的內(nèi)容送到累加器A。注意:PSEN*信號(hào)有效。(讀外部程序存儲(chǔ)器的選通信號(hào))

在訪問外部RAM時(shí),PSEN信號(hào)無效。例如:(A)=30H,執(zhí)行地址1000H處的指令

1000H:

MOVCA,@A+PC

本指令占用一個(gè)字節(jié),執(zhí)行結(jié)果將程序存儲(chǔ)器中1031H的內(nèi)容送入A。優(yōu)點(diǎn):不改變特殊功能寄存器及PC的狀態(tài),根據(jù)A的內(nèi)容就可以取出表格中的常數(shù)。缺點(diǎn):表格只能存放在該條查表指令后面的256個(gè)單元之內(nèi),表格的大小受到限制,且表格只能被一段程序所利用。

(2)MOVCA,@A+DPTR

以DPTR作為基址寄存器,A的內(nèi)容作為無符號(hào)數(shù)和DPTR的內(nèi)容相加得到一個(gè)16位的地址,把由該地址指出的程序存儲(chǔ)器單元的內(nèi)容送到累加器A.例如:(DPTR)=8100H(A)=40H執(zhí)行指令

MOVCA,@A+DPTR

本指令的執(zhí)行結(jié)果只和指針DPTR及累加器A的內(nèi)容有關(guān),與該指令存放的地址及常數(shù)表格存放的地址無關(guān),

因此表格的大小和位置可以在64K程序存儲(chǔ)器中任意安排,一個(gè)表格可為各個(gè)程序塊公用。兩條指令是在MOV的后面加C,“C”是CODE的第一個(gè)字母,即代碼的意思。9.字節(jié)交換指令

XCHA,Rn XCHA,direct XCHA,@Ri例如:

(A)=80H,(R7)=08H,(40H)=F0H(R0)=30H,(30H)=OFH執(zhí)行下列指令:

XCHA,R7;(A)與(R7)互換

XCHA,40H;(A)與(40H)互換

XCHA,@R0;(A)與((R0))互換結(jié)果:(A)=0FH,(R7)=80H,(40H)=08H,(30H)=F0H

10.半字節(jié)交換指令

XCHDA,@Ri

累加器的低4位與內(nèi)部RAM低4位交換。例如:

(R0)=60H,(60H)=3EH,(A)=59H執(zhí)行完XCHDA,@RO

指令,則(A)=5EH,(60H)=39H。1.數(shù)據(jù)傳送類指令(1)片內(nèi)數(shù)據(jù)傳送指令1)以累加器A為目的操作數(shù)的指令有以下形式:【例1-1】將R1的內(nèi)容傳送至A。

MOVA,R1【例1-2】將立即數(shù)16H傳送至A。

MOVA,#16H【例1-3】將R0指示的內(nèi)存單元20H的內(nèi)容傳送至A。

MOVR0,#20HMOVA,@R0【例1-4】將30H單元的內(nèi)容傳送至A。

MOVA,30H2)以工作寄存器Rn為目的操作數(shù)的指令有以下形式:【例1-5】將A的內(nèi)容傳送至R1;30H單元的內(nèi)容傳送至R3;立即數(shù)80H傳送至R7。用如下指令完成。

MOVR1,A;R1AMOVR3,30H;R3(30H)MOVR7,#80H;R780H3)以直接地址為目的操作數(shù)的指令有以下形式:【例1-6】將A的內(nèi)容傳送至30H單元;R7的內(nèi)容傳送至20H單元;立即數(shù)0FH傳送至27H單元;40H單元內(nèi)容傳送至50H單元。用以下指令完成。

MOV30H,AMOV27H,#0FHMOV20H,R7MOV50H,40H4)以間接地址為目的操作數(shù)的指令:

【例1-7】將20H開始的32個(gè)單元全部清0。

MOVA,#00H;A00HMOVR0,#20H;R020H,以R0作地址指針

MOVR7,#20H;R7計(jì)數(shù),R732LP1:MOV@R0,A;將R0指示的單元清0INCR0;R0R0+1,R0指下一單元

DJNZR7,LP1;R7R7-1,若R7不為0則轉(zhuǎn)LP1重復(fù)5)16位數(shù)據(jù)傳送指令有以下惟一形式:

【例1-8】將外部RAM的8000H單元的內(nèi)容傳送至A中。

MOVDPTR,#8000H;DPTR8000HMOVXA,@DPTR;A(8000H)(2)片外數(shù)據(jù)存儲(chǔ)器傳送指令【例1-9】有一輸入設(shè)備,其端口地址為2040H,該端口數(shù)據(jù)為41H,將此值存入片內(nèi)RAM的20H單元。用如下指令完成。

MOVDPTR,#2040H;MOVXA,@DPTR;A(2040H),即A41HMOV20H,A;(20H)A【例1-10】有一輸出設(shè)備,其端口地址為2041H,將片內(nèi)RAM的20H單元的數(shù)據(jù)輸出給該設(shè)備。用如下指令完成。

MOVDPTR,#2041H;DPTR2041HMOVA,20H;A(20H)MOVX@DPTR,A;(2041H)A【例1-11】把片外RAM的2000H單元中的數(shù)61H取出,傳送到片外RAM的3FFFH單元中去。用如下指令完成。

MOVDPTR,#2000H;DPTR2000HMOVXA,@DPTR;A(2000H),即A61HMOVDPTR,#3FFFH;DPTR3FFFHMOVX@DPTR,A;(3FFFH)A(3)程序存儲(chǔ)器數(shù)據(jù)傳送指令【例1-12】LED顯示器0~9的字形顯示段碼在程序存儲(chǔ)器中存放情況(表格)如下:210AH:0C0H字符“0”的段碼210BH:0F9H字符“1”的段碼210CH:0A4H字符“2”的段碼210DH:0B0H字符“3”的段碼210EH:99H字符“4”的段碼從段碼表中取出“3”并送LED(端口地址為1200H)顯示,可用如下指令完成:2100H:MOVA,#0AH;A0AH(偏移量)2102H:MOVCA,@A+PC;A(2103H+0AH=210DH),即A0B0H2103H:MOVDPTR,#1200H;DPTR1200H2106H:MOVX@DPTR,A;輸出顯示“3”執(zhí)行結(jié)果:A=0B0H,PC=2107H。字符“3”段碼送1200H顯示?!纠?-13】在程序存儲(chǔ)器中,有一表示數(shù)字字符ASCII代碼的數(shù)據(jù)表格,表格的起始地址為7000H。7000H:30H(字符“0”的代碼)7001H:31H(字符“1”的代碼)7002H:32H(字符“2”的代碼)7003H:33H(字符“3”的代碼)7004H:34H(字符“4”的代碼)7005H:35H(字符“5”的代碼)將A中的數(shù)字2轉(zhuǎn)換為字符“2”的ASCII代碼,可用如下指令完成:1004H:MOVA,#02H;A02H1006H:MOVDPTR,#7000H;DPTR7000H1009H:MOVCA,@A+DPTR;A(7000H+02H),即A32H執(zhí)行結(jié)果:A=32H,PC=100AH。(4)數(shù)據(jù)交換指令【例1-14】A=3FH,R0=20H,(20H)(即內(nèi)部RAM的20H單元)=46H。執(zhí)行指令:XCHA,@R0執(zhí)行結(jié)果:A=46H,(20H)=3FH【例1-15】A=7FH,R0=20H,(20H)=35H執(zhí)行指令:XCHDA,@R0執(zhí)行結(jié)果:A=475H,(20H)=3FH【例1-16】將20H單元的內(nèi)容與A的內(nèi)容互換,然后將A的高四位存入R1指向的內(nèi)部RAM單元中的低四位,A的低四位存入該單元的高四位。

XCHA,20H;A(20H)SWAPA;ACC.7~ACC.4與ACC.3~ACC.0互換

MOV@R1,A;(R1)A【例1-17】已知外部RAM的20H單元的內(nèi)容為38H,內(nèi)部RAM的20H單元的內(nèi)容為08H,為使這兩個(gè)單元的內(nèi)容相互交換,可由下列指令完成:

MOVR1,20HMOVXA,@R1;A38H(片內(nèi)20H單元的內(nèi)容)

XCHA,@R1;A08H,(20H)38H(38H送片內(nèi)20H單元)

MOVX@R1,A;(20H)08H(5)堆棧操作指令【例1-18】設(shè)堆棧棧底為30H,將現(xiàn)場(chǎng)A和DPTR的內(nèi)容。已知A=12H,DPTR=3456H??捎梢韵轮噶钔瓿桑篗OVSP,#30HPUSHAPUSHDPLPUSHDPH執(zhí)行結(jié)果:SP=33H,片內(nèi)RAM的31H、32H、33H單元的內(nèi)容分別為12H、56H、34H。【例1-19】將上題中已壓棧的內(nèi)容彈出至原處,即恢復(fù)現(xiàn)場(chǎng)。可由以下指令完成:POPDPHPOPDPLPOPA執(zhí)行結(jié)果:SP=30H,A=12HDPTR=3456H【例1-20】將片內(nèi)2500H單元中的內(nèi)容壓入堆棧后彈出到片內(nèi)40H單元。可由以下指令完成:MOVDPTR,#2500HMOVXA,@DPTR;A(2500H)MOV20H,A;(20H)AMOVSP,#30H;SP30HPUSH20H;20H單元內(nèi)容壓入堆棧POP40H;彈出到40H單元3.4.2算術(shù)操作類指令

單字節(jié)的加、減、乘、除法指令,都是針對(duì)8位二進(jìn)制無符號(hào)數(shù)。執(zhí)行的結(jié)果對(duì)Cy、Ac、OV

三種標(biāo)志位有影響。但增1和減1指令不影響上述標(biāo)志。1.加法指令

共有4條加法運(yùn)算指令:

ADDA,Rn;(A)+(Rn)→A,n=0~7ADDA,direct;(A)+(direct)→AADDA,@Ri;(A)+((Ri))→A,i=0,1

ADDA,#data;(A)+#data→A一個(gè)加數(shù)總是來自累加器A,而另一個(gè)加數(shù)可由不同的尋址方式得到。結(jié)果總是放在A中。使用加法指令時(shí),要注意累加器A中的運(yùn)算結(jié)果對(duì)各個(gè)標(biāo)志位的影響:(1)如果位7有進(jìn)位,則置“1”進(jìn)位標(biāo)志Cy,否則清“0”Cy(2)如果位3有進(jìn)位,置“1”輔助進(jìn)位標(biāo)志Ac,否則清“0”Ac(Ac為PSW寄存器中的一位)(3)如果位6有進(jìn)位,而位7沒有進(jìn)位,或者位7有進(jìn)位,而位6沒有,則溢出標(biāo)志位OV置“1”,否則清“0”O(jiān)V。溢出標(biāo)志位OV的狀態(tài),只有在帶符號(hào)數(shù)加法運(yùn)算時(shí)才有意義。當(dāng)兩個(gè)帶符號(hào)數(shù)相加時(shí),OV=1,表示加法運(yùn)算超出了累加器A所能表示的帶符號(hào)數(shù)的有效范圍。

例3-1

(A)=53H,(R0)=FCH,執(zhí)行指令

ADDA,R0結(jié)果:(A)=4FH,Cy=1,Ac=0,OV=0,P=1注意:上面的運(yùn)算中,由于位6和位7同時(shí)有進(jìn)位,所以標(biāo)志位OV=0。

例3-2(A)=85H,(R0)=20H,(20H)=AFH,執(zhí)行指令:

ADDA,@R0

結(jié)果:(A)=34H,Cy=1,Ac=1,OV=1,P=1注意:由于位7有進(jìn)位,而位6無進(jìn)位,所以標(biāo)志位OV=1

2.帶進(jìn)位加法指令標(biāo)志位Cy參加運(yùn)算,因此是三個(gè)數(shù)相加。共4條:

ADDC A,Rn ;(A)+(Rn)+C→A,n=0~7ADDC A,direct ;(A)+(direct)+C→AADDC A,@Ri ;(A)+(Ri)+C→A,i=0,1 ADDC A,#data ;(A)+#data+C→A

例3-3(A)=85H,(20H)=FFH,Cy=1,執(zhí)行指令:

ADDCA,20H結(jié)果為:(A)=85H,Cy=1,Ac=1,OV=0,P=1(A中1的位數(shù)為奇數(shù))3.增1指令

5條增1指令:

INCA INCRn;n=0~7 INCdirect INC@Ri;i=0,1 INCDPTR不影響PSW中的任何標(biāo)志。第5條指令I(lǐng)NCDPTR,是16位數(shù)增1指令。指令首先對(duì)低8位指針DPL的內(nèi)容執(zhí)行加1的操作,當(dāng)產(chǎn)生溢出時(shí),就對(duì)DPH的內(nèi)容進(jìn)行加1操作,并不影響標(biāo)志Cy的狀態(tài)。4.十進(jìn)制調(diào)整指令用于對(duì)BCD碼十進(jìn)制數(shù)加法運(yùn)算結(jié)果的內(nèi)容修正。

指令格式:DAA兩個(gè)BCD碼按二進(jìn)制相加之后,必須經(jīng)本指令的調(diào)整才能得到正確的壓縮BCD碼的和數(shù)。(1)十進(jìn)制調(diào)整問題二進(jìn)制數(shù)的加法運(yùn)算原則并不能適用于十進(jìn)制數(shù)的加法運(yùn)算,有時(shí)會(huì)產(chǎn)生錯(cuò)誤結(jié)果。例如:(a)3+6=90011+0101=1001運(yùn)算結(jié)果正確(b)7+8=150111+1000=1111運(yùn)算結(jié)果不正確(c)9+8=171001+1000=00001C=1結(jié)果不正確二進(jìn)制數(shù)加法指令不能完全適用于BCD碼十進(jìn)制數(shù)的加法運(yùn)算,對(duì)結(jié)果作有條件的修正

——十進(jìn)制調(diào)整(2)出錯(cuò)原因和調(diào)整方法BCD碼只用了了其中的10個(gè),6個(gè)沒用到的編碼。(1010,1011,1100,1101,1110,1111)為無效碼凡結(jié)果進(jìn)入或者跳過無效碼編碼區(qū)時(shí),其結(jié)果就是錯(cuò)誤的。①相加結(jié)果大于9,說明已經(jīng)進(jìn)入無效編碼區(qū);②相加結(jié)果有進(jìn)位,說明已跳過無效編碼區(qū)。調(diào)整的方法是把結(jié)果加6調(diào)整,即所謂十進(jìn)制調(diào)整修正。修正方法應(yīng)是:(a)累加器低4位大于9或輔助進(jìn)位位Ac=1,則進(jìn)行低4位加6修正。(b)累加器高4位大于9或進(jìn)位位Cy=1,則進(jìn)行高4位加6修正。(c)累加器高4位為9,低4位大于9,則高4位和低4位分別加6修正。是否加6是通過執(zhí)行指令:DAA

來自動(dòng)實(shí)現(xiàn)的。例3-4

(A)=56H,(R5)=67H,把它們看作為兩個(gè)壓縮的BCD數(shù),進(jìn)行BCD數(shù)的加法。執(zhí)行指令:

ADDA,R5DAA由于高、低4位分別大于9,所以要分別加6進(jìn)行十進(jìn)制調(diào)整對(duì)結(jié)果進(jìn)行修正。01010110+)0110011110111101+)01100110100100011結(jié)果為:(A)=23H,Cy=1

可見,56+67=123,結(jié)果是正確的。

十進(jìn)制調(diào)整,高、低位分別加6設(shè)累加器A中置有兩位BCD數(shù)01010110(56),R2中為01110101(75),用兩條指令實(shí)現(xiàn)十進(jìn)制加法。ADDA,R2DAA(A)=01010110+)(R2)=0111010111001011+)01100110100110001BCD:結(jié)果1315.帶借位的減法指令

4條指令:

SUBBA,Rn;(A)-(Rn)-Cy→A,n=0~7SUBBA,direct;(A)-(direct)-Cy→ASUBBA,@Ri;(A)-((Ri))-Cy→A,i=0,1SUBBA,#data;(A)-#data-Cy→A從累加器A中的內(nèi)容減去指定的變量和進(jìn)位標(biāo)志Cy的值,結(jié)果存在累加器A中。如果位7需借位則置“1”Cy,否則清“0”Cy;如果位3需借位則置“1”Ac,否則清“0”Ac;如果位6需借位而位7不需要借位,或者位7需借位,位6不需借位,則置“1”溢出標(biāo)志位OV,否則清“0”O(jiān)V。例3-5

(A)=C9H,(R2)=54H,Cy=1,執(zhí)行指令:SUBBA,R2

結(jié)果:(A)=74H,Cy=0,Ac=0,OV=1(位6向位7借位)

6.減1指令

4條指令:

DECA ;(A)-1→A DECRn ;(Rn)-1→Rn,n=0~7 DECdirect ;(direct)-1→direct DEC@Ri ;((Ri))-1→(Ri),i=0,1

減1指令不影響標(biāo)志位。例3-6(A)=0FH,(R7)=19H,(30H)=00H,(R1)=40H,(40H)=0FFH,執(zhí)行指令

DEC A ;(A)-1→A DEC R7 ;(R7)-1→R7 DEC 30H ;(30H)-1→30H DEC @R1 ;((R1))-1→(R1)

結(jié)果為

(A)=0EH,(R7)=18H,(30H)=0FFH,(40H)=0FEH,P=1,不影響其他標(biāo)志7.乘法指令

MULAB;A×B→BA

如果積大于255,則置“1”溢出標(biāo)志位OV8.除法指令

DIVAB;A/B→A(商),余數(shù)→B如果B的內(nèi)容為“0”(即除數(shù)為“0”),則存放結(jié)果的A、B中的內(nèi)容不定,并置“1”溢出標(biāo)志位OV。例3-7(A)=FBH,(B)=12H,執(zhí)行指令

DIV AB

結(jié)果為

(A)=0DH,(B)=11H,Cy=0,OV=0。2.算術(shù)運(yùn)算類指令(1)不帶進(jìn)位的加法指令[例2-1]已知A=B5H,R1=96H,執(zhí)行指令:ADDA,R1A10110101+R11001011001001011運(yùn)算結(jié)果:A=4BH,OV=D6

7⊕D7

C=0⊕1=1,其和產(chǎn)生溢出。則標(biāo)志位:Cy=1,AC=0,OV=1。(2)帶進(jìn)位加法指令[例2-2]設(shè)A=0AEH,(20H)=81H,Cy=1,求兩數(shù)的和及對(duì)標(biāo)志位的影響。ADDCA,20H執(zhí)行結(jié)果為:A=0AEH+81H+1=30H,Cy=1,AC=1,OV=1。

(3)加1指令[例2-3]設(shè)R0=7EH,DPTR=10FEH,(7EH)=0FFH,(7FH)=38H,執(zhí)行下列指令:INC@R0;(7EH)=00HINCR0;R0=7FHINC@R0;(7FH)=39HINCDPTR;DPTR=10FFHINCDPTR;DPTR=1100HINCDPTR;DPTR=1101H執(zhí)行結(jié)果:(7EH)=00H,R0=7FH,(7FH)=39H,DPTR=1101H(4)十進(jìn)制調(diào)整指令[例2-4]A=56H,R3=67H,執(zhí)行指令:ADDA,R3;A56H+67H(A=0BDH)DAA

則結(jié)果為:A=23H,Cy=1(5)帶借位減法指令[例2-5]設(shè)A=0BDH,R1=73H,Cy=1執(zhí)行指令:SUBBA,R1結(jié)果為:A=67H,Cy=0,AC=0,OV=0(6)減1指令(略)(7)乘法指令[例2-6]設(shè)A=50H,B=32H,執(zhí)行指令:MULAB

A01010000×B00110010111110100000執(zhí)行結(jié)果:A=0A0H,B=0FH,OV=1,Cy=0(8)除法指令[例2-7]設(shè)A=0FAH(250),B=14H(20)執(zhí)行指令:DIVAB執(zhí)行結(jié)果:A=0CH(12),B=0AH(10),OV=0,Cy=03.4.3邏輯操作類指令1.簡(jiǎn)單邏輯操作指令

(1)CLRA功能是累加器A清“0”。不影響Cy、Ac、OV等標(biāo)志。

(2)CPLA功能:累加器A的內(nèi)容按位邏輯取反,不影響標(biāo)志。

例:設(shè)(A)=10101010B,執(zhí)行指令CPLA結(jié)果(A)=01010101B

2.左環(huán)移指令

RLA功能是累加器A的8位向左循環(huán)移位,位7循環(huán)移入位0,不影響標(biāo)志。設(shè)執(zhí)行RL

A執(zhí)行前(A)=01001011B,執(zhí)行RLA后,(A)=10010110BA7A03.帶進(jìn)位左環(huán)移指令

RLCA功能:將累加器A的內(nèi)容和進(jìn)位標(biāo)志位Cy一起向左環(huán)移一位,Acc.7移入進(jìn)位位Cy,Cy移入Acc.0,不影響其它標(biāo)志。A7A0A7A0CY設(shè)執(zhí)行前RLCA指令前(A)=01001011,CY=1,執(zhí)行RLCA指令后(A)=10010111B,CY=0。把進(jìn)位標(biāo)志連同A的內(nèi)容一起向左移一位。A7CYA04.右環(huán)移指令

RRA功能是累加器A的內(nèi)容向右環(huán)移一位,Acc.0移入Acc.7,不影響其它標(biāo)志。設(shè)執(zhí)行指令RRA指令前(A)=01001011B,執(zhí)行RRA后(A)=10100101BA0A7A7A0

5.帶進(jìn)位環(huán)移指令

RRCA功能:累加器A的內(nèi)容和進(jìn)位標(biāo)志Cy一起向右環(huán)移一位,Acc.0進(jìn)入Cy,Cy移入Acc.7。設(shè)執(zhí)行RRCA指令前(A)=01001010B,CY=1,執(zhí)行RRCA指令后(A)=10100101B,CY=0,把進(jìn)位連同A內(nèi)容一起向右移。例:設(shè)(A)=5AH,C=1執(zhí)行指令:CPLA后(A)=A5H執(zhí)行指令:CLRA后(A)=001011010執(zhí)行指令:RLA后(A)=B4H10110100執(zhí)行指令:RRA后(A)=2DH執(zhí)行指令:RRCA后(A)=ADH6.累加器半字節(jié)交換指令

SWAPA將累加器A的高半字節(jié)(Acc.7~Acc.4)和低半字節(jié)(Acc.3~Acc.0)互換。例3-8

(A)=0C5H,執(zhí)行指令:

SWAPA

結(jié)果:(A)=5CH執(zhí)行指令:RLCA后(A)=B5H總結(jié):左移一位相當(dāng)于乘2。例如:MOVA,#01H;01H送累加器ARLA;02H送ARLA;04H送ARLA;08H送A右移一位相當(dāng)于除2。上述累加器A=08H,執(zhí)行指令:RRA;(A)04HRRA;(A)02HRRA;(A)01H。累加器內(nèi)容又變?yōu)?。7.邏輯與指令

ANL A,Rn;(A)∧(Rn)→A,n=0~7 ANL A,direct;(A)∧(direct)→A ANL A,#data;(A)∧#data→AANL A,@Ri;(A)∧((Ri))→A,i=0~1 ANL direct,A;(direct)∧(A)→direct ANL direct,#data ;(direct)∧#data→direct例3-9

(A)=07H,(R0)=0FDH,執(zhí)行指令:

ANLA,R0

結(jié)果:(A)=05H8.邏輯或指令

ORLA,Rn;(A)∨(Rn)→A,n=0~7 ORLA,direct;(A)∨(direct)→A ORLA,#data;(A)∨data→A ORLA,@Ri;(A)∨((Ri))→A,i=0,1 ORLdirect,A;(direct)∨(A)→direct ORLdirect,#data

;(direct)∨#data→direct

例3-10

(P1)=05H,(A)=33H,執(zhí)行指令

ORLP1,A

結(jié)果:(P1)=37H

9.邏輯異或指令

XRLA,Rn;(A)⊕(Rn)→A XRLA,direct;(A)⊕(direct)→A XRLA,@Ri

;(A)⊕((Ri))→A,i=0,1 XRLA,#data;(A)⊕#data→A XRLdirect,A

;(direct)⊕(A)→direct XRLdirect,#data

;(direct)⊕#data→direct

例3-11

(A)=90H,(R3)=73H執(zhí)行指令:

XRLA,R3結(jié)果:(A)=E3H3.邏輯運(yùn)算類指令(1)邏輯”與”指令[例3-1]設(shè)A=0AAH,將A的低4位保持不變,高4位屏蔽,然后將其經(jīng)P1口輸出??蓤?zhí)行如下指令:ANLA,#0FHMOVP1,A執(zhí)行結(jié)果為:A=0AH(高4位清0,低4位不變)(2)邏輯”或”指令[例3-2]已知A=0D4H,執(zhí)行指令:ORLA,#0FH11010100ⅴ0000111111011111執(zhí)行結(jié)果為:A=0DFH(高4位不變,低4位置1)。(3)邏輯“異或”指令[例3-3]A=0D4H,執(zhí)行指令:

XRLA,#0FH11010100⊕0000111111011011執(zhí)行結(jié)果為:A=0DBH(高4位不變,低位求反)

(4)累加器A清0與求反[例3-4]利用求反指令,對(duì)40H單元內(nèi)容求補(bǔ)(即求反加1)。

MOVA,40HCPLAINCAMOV40H,A[例3-5]要求將累加器A的內(nèi)容送到P1口的低5位,傳送時(shí)要絕對(duì)

不影響P1口的高3位。ANLA,#00011111B;屏蔽A中的高3位ANLP1,#11100000B;屏蔽P1口鎖存器中的低5位ORLP1,A;將A中低5位送到P1口,保留P1的高3位3.4.4控制轉(zhuǎn)移類指令

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

AJMPaddrll2K字節(jié)范圍內(nèi)的無條件跳轉(zhuǎn)指令,64K程序存儲(chǔ)器空間分為32個(gè)區(qū),每區(qū)2K字節(jié),轉(zhuǎn)移的目標(biāo)地址必須與AJMP下一條指令的地址的高5位地址碼A15-A11相同。執(zhí)行指令時(shí),先PC加2,然后把a(bǔ)ddrll送入PC.10~PC.0,PC.15~PC.11保持不變,程序轉(zhuǎn)移到目標(biāo)地址。本指令是為能與MCS-48的JMP指令兼容而設(shè)的。2.相對(duì)轉(zhuǎn)移指令

SJMPrel實(shí)現(xiàn)的程序轉(zhuǎn)移是雙向的。在編寫程序時(shí),直接寫上要轉(zhuǎn)向的目標(biāo)地址標(biāo)號(hào)就可以。例如:

LOOP: MOVA,R6

SJMPLOOP ┇程序在匯編時(shí),由匯編程序自動(dòng)計(jì)算和填入偏移量。手工匯編時(shí),偏移量rel的值則需程序設(shè)計(jì)人員計(jì)算。3.長(zhǎng)跳轉(zhuǎn)指令

LJMPaddr16指令執(zhí)行時(shí)把指令的第二和第三字節(jié)分別裝入PC的高位和低位字節(jié)中,無條件地轉(zhuǎn)向addr16指出的目標(biāo)地址。目標(biāo)地址可以在64K程序存儲(chǔ)器地址空間的任何位置。4.間接跳轉(zhuǎn)指令

JMP@A+DPTR由A中8位無符號(hào)數(shù)與DPTR的16位數(shù)內(nèi)容之和來確定。以DPTR內(nèi)容作為基址,A的內(nèi)容作變址。給A賦予不同的值,即可實(shí)現(xiàn)程序的多分支轉(zhuǎn)移。5.條件轉(zhuǎn)移指令

規(guī)定的條件滿足,則進(jìn)行轉(zhuǎn)移,條件不滿足則順序執(zhí)行下一條指令。當(dāng)條件滿足時(shí),把PC裝入下一條指令的第一個(gè)字節(jié)地址,再把帶符號(hào)的相對(duì)偏移量rel加到PC上,計(jì)算出目標(biāo)地址。

JZrel ;如果累加器為“0”,則轉(zhuǎn)移

JNZrel ;如果累加器非“0”,則轉(zhuǎn)移

例:累加器原始內(nèi)容為01H,執(zhí)行指令JZLABEL1;未發(fā)生跳變,不為0DECA;00HJZLABEL2;為0跳轉(zhuǎn)到LABEL2處例:累加器

原始內(nèi)容為00H,執(zhí)行指令JNZLABEL1;不為0轉(zhuǎn)移至LABEL1,為0,向下執(zhí)行INCAJNZLABEL2;(A)=01H時(shí),不為0跳轉(zhuǎn)到LABEL2處6.比較不相等轉(zhuǎn)移指令

CJNEA,direct,rel CJNEA,#data,rel CJNERn,#data,rel CJNE@Ri,#data,rel比較前面兩個(gè)操作數(shù)的大小,如果它們的值不相等則轉(zhuǎn)移。如果第一操作數(shù)(無符號(hào)整數(shù))小于第二操作數(shù)(無符號(hào)整數(shù)),則置“1”Cy,否則清“0”Cy。以上四條指令都執(zhí)行以下操作:a:若目的操作數(shù)=源操作數(shù);PCPC+3,CY0b:若目的操作數(shù)>源操作數(shù);則程序轉(zhuǎn)移PCPC+3+relCY0c:若目的操作數(shù)<源操作數(shù);則程序轉(zhuǎn)移PCPC+3+relCY1d:指令執(zhí)行后根據(jù)CY的狀態(tài)判斷數(shù)值大小CY=0,目的操作數(shù)>源操作數(shù)CY=1,目的操作數(shù)<源操作數(shù)由于rel的地址范圍為-128-+127,因此指令相對(duì)轉(zhuǎn)移范圍為-125-+130例:下列程序只有當(dāng)P1端口輸入位01H時(shí)程序才進(jìn)行下去,否則計(jì)算機(jī)等待:MOVA,#01HWAIT:CJNEA,P1,WAIT;P1口為01H向下執(zhí)行7.減1不為0轉(zhuǎn)移指令這是一組把減1與條件轉(zhuǎn)移兩種功能結(jié)合在一起的指令。共兩條指令:

DJNZRn,rel ;n=0~7 DJNZdirect,rel

將源操作數(shù)(Rn或direct)減1,結(jié)果回送到Rn寄存器或direct中去。如果結(jié)果不為0則轉(zhuǎn)移。允許程序員把寄存器Rn或內(nèi)部RAM的direct單元用作程序循環(huán)計(jì)數(shù)器。主要用于控制程序循環(huán)。以減1后是否為“0”作為轉(zhuǎn)移條件,即可實(shí)現(xiàn)按次數(shù)控制循環(huán)。例:RAM地址為40H、50H和60H的內(nèi)容分別為01H、70H和15H。

執(zhí)行指令:DJNZ40H,LABEL-1;為0,順序執(zhí)行DJNZ50H,LABEL-2;6F不為0,轉(zhuǎn)到LABEL-2DJNZ60H,LABEL-3;其結(jié)果:程序轉(zhuǎn)到LABEL-2處,40H、50H和60H單元的內(nèi)容分別為00H、6FH、15H。8.調(diào)用子程序指令(1)短調(diào)用指令

ACALLaddrll與AJMP指令相類似,是為了與MCS-48中的CALL指令兼容而設(shè)的。(2)長(zhǎng)調(diào)用指令

LCALLaddr169.子程序的返回指令

RET執(zhí)行本指令時(shí): (

溫馨提示

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