第3章 MCS-51 的指令系統(tǒng)與匯編語言程序設(shè)計(jì)_第1頁(yè)
第3章 MCS-51 的指令系統(tǒng)與匯編語言程序設(shè)計(jì)_第2頁(yè)
第3章 MCS-51 的指令系統(tǒng)與匯編語言程序設(shè)計(jì)_第3頁(yè)
第3章 MCS-51 的指令系統(tǒng)與匯編語言程序設(shè)計(jì)_第4頁(yè)
第3章 MCS-51 的指令系統(tǒng)與匯編語言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩131頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章MCS-51的指令系統(tǒng)與匯編語言程序設(shè)計(jì)

【學(xué)習(xí)目標(biāo)】掌握單片機(jī)的指令系統(tǒng),熟悉指令功能、指令格式以及指令的尋址方式;理解匯編語言的特點(diǎn)以及與機(jī)器語言之間的區(qū)別和聯(lián)系;掌握匯編語言程序設(shè)計(jì)的步驟、匯編語言程序的結(jié)構(gòu);熟練掌握匯編語言應(yīng)用程序的開發(fā)

【例3.11】有一數(shù)據(jù)塊存放起始地址為DATA1的片外RAM區(qū),數(shù)據(jù)塊以“0”為結(jié)束標(biāo)志,要求將其傳送到DATA2為起始地址的片內(nèi)RAM區(qū)。編寫程序如下:

MOVDPTR,#DATA1 ;設(shè)置片外RAM數(shù)據(jù)塊地址指針MOVR0,#DATA2 ;設(shè)置片內(nèi)RAM數(shù)據(jù)塊地址指針LOOP:MOVXA,@DPTR ;取數(shù)JZENDO ;檢測(cè)是否為0?為0,轉(zhuǎn)ENDOMOV@R0,A ;不為0,傳送INCDPTR ;修改地址指針I(yè)NCR0AJMPLOOPENDO:SJMP $3.1MCS-51單片機(jī)指令系統(tǒng)概述1.指令的概念

指令是由CPU解釋執(zhí)行,用于控制功能部件完成某種指定操作的命令。由于CPU只能識(shí)別二進(jìn)制數(shù),所以計(jì)算機(jī)的指令均由二進(jìn)制代碼組成,通常把這樣的指令稱為機(jī)器指令。一般的計(jì)算機(jī)都有幾十甚至上百條機(jī)器指令,這些指令就構(gòu)成了計(jì)算機(jī)的指令系統(tǒng)。不同類型的CPU具有不同的指令系統(tǒng)。2.指令系統(tǒng)說明MCS-51的基本指令共111條:

每條指令在程序存儲(chǔ)器ROM中占據(jù)一定的空間,以字節(jié)為單位。按指令所占的字節(jié)來分:

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

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

(3)三字節(jié)指令17條。每條指令在執(zhí)行時(shí)要花去一定的時(shí)間,以機(jī)器周期為單位。按指令的執(zhí)行時(shí)間來分:

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

(2)2個(gè)機(jī)器周期(24個(gè)時(shí)鐘振蕩周期)指令45條

(3)4個(gè)機(jī)器周期(48個(gè)時(shí)鐘振蕩周期)只有乘、除兩條指令的執(zhí)行時(shí)間。

12MHz晶振:機(jī)器周期為1s。按指令的功能分類,可分為5大類:

數(shù)據(jù)傳送類(29條);算術(shù)運(yùn)算類(24條)

邏輯運(yùn)算及移位類(24);控制轉(zhuǎn)移類(17條)

位操作類(17條)【例3.3】設(shè)片內(nèi)RAM30H、31H和32H、33H分別存放兩個(gè)16位無符號(hào)數(shù),要求將兩個(gè)數(shù)的和存入30H、31H(低位在前,高位在后)。程序如下: 【例3.3】設(shè)片內(nèi)RAM30H、31H和32H、33H分別存放兩個(gè)16位無符號(hào)數(shù),要求將兩個(gè)數(shù)的和存入30H、31H(低位在前,高位在后)。程序如下: MOVR0,#30H ;

設(shè)置第一個(gè)數(shù)地址指針 MOV R1,#32H ;

設(shè)置第二個(gè)數(shù)地址指針 MOVA,@R0 ;

取低位 ADDA,@R1 ;

兩數(shù)低位相加 MOV @R0,A ;

存“和”的低位 INC R0 INC R1 MOV A,@R0 ;

取高位 ADDCA,@R1 ;

兩數(shù)高位相加 MOV @R0,A ;

存“和”的高位 SJMP $【例3.11】有一數(shù)據(jù)塊存放起始地址為DATA1的片外RAM區(qū),數(shù)據(jù)塊以“0”為結(jié)束標(biāo)志,要求將其傳送到DATA2為起始地址的片內(nèi)RAM區(qū)。編寫程序如下:

MOVDPTR,#DATA1 ;設(shè)置片外RAM數(shù)據(jù)塊地址指針MOVR0,#DATA2 ;設(shè)置片內(nèi)RAM數(shù)據(jù)塊地址指針LOOP:MOVXA,@DPTR ;取數(shù)JZENDO ;檢測(cè)是否為0?為0,轉(zhuǎn)ENDOMOV@R0,A ;不為0,傳送INCDPTR ;修改地址指針I(yè)NCR0AJMPLOOPENDO:SJMP $例1、LED的控制

使用89C5l的Port1連接8個(gè)LED,以產(chǎn)生跑馬燈的效果。連接好電路并且完成程序之后,您將可以看到8個(gè)LED依次輪流閃爍。在這次練習(xí)中,您將學(xué)會(huì)如何使用I/OPort輸出數(shù)據(jù),以及如何使用循環(huán)實(shí)現(xiàn)時(shí)間延遲。

電路圖#include<REGX51.H>voiddelay(void)

/*delay函數(shù)*/{unsignedchari,j;/*這個(gè)函數(shù)執(zhí)行時(shí)間的延遲*/for(i=0;i<255;i++)for(j=0;j<255;j++) ;}voidmain(void)

{unsignedcharj=0XFE;/*聲明變量j,11111110*/while(1) /*無窮循環(huán)*/{/*依次讓LED0,1,2,3,4,5,6,7閃爍*/ j=(j<<1)|0x01; if(j==0XFF)j=0XFE;P1=j;/*將數(shù)值輸出到Port1,控制LED亮或滅*/delay();/*調(diào)用delay函數(shù)*/}}標(biāo)號(hào):操作碼操作數(shù);注釋

指令格式

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

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

操作數(shù):指令操作的對(duì)象方括符[]表示可選項(xiàng)標(biāo)號(hào)代表指令所在地址,1-8個(gè)字母/數(shù)字,“:”結(jié)尾[標(biāo)號(hào):]操作碼[目的操作數(shù)][,源操作數(shù)][;注釋]START:MOVA,#30H;將立即數(shù)30H傳送至A中MOVDPTR,#5678H;將立即數(shù)5678H傳送至DPTR⑴標(biāo)號(hào):指令的符號(hào)地址。

用于一段功能程序的識(shí)別標(biāo)記或控制轉(zhuǎn)移地址。

指令前的標(biāo)號(hào)代表該指令的地址,是用符號(hào)表示的地址。

一般用英文字母和數(shù)字組成。標(biāo)號(hào)必須用冒號(hào)“:”與操作碼分隔。

⑵操作碼:表示指令的操作功能。

操作碼用助記符表示,它代表了指令的操作功能。

操作碼是指令的必需部分,是指令的核心,不可缺少。START:MOVA,#30H;將立即數(shù)30H傳送至A中MOVDPTR,#5678H;將立即數(shù)5678H傳送至DPTR⑶操作數(shù):參加操作的數(shù)據(jù)或數(shù)據(jù)地址。⑤操作數(shù)與操作碼之間用空格分隔,操作數(shù)與 操作數(shù)之間用逗號(hào)“,”分隔。①操作數(shù)可以是數(shù)據(jù),也可以是數(shù)據(jù)的地址、數(shù)據(jù)地址的地址或操作數(shù)的其他信息。②操作數(shù)可分為目的操作數(shù)和源操作數(shù)。③操作數(shù)可用二進(jìn)制數(shù)、十進(jìn)制數(shù)或十六進(jìn)制 數(shù)表示。④操作數(shù)的個(gè)數(shù)可以是0~3個(gè)。⑷注釋:指令功能說明。①注釋屬于非必需項(xiàng),是為便于閱讀, 對(duì)指令功能作的說明和注解。②注釋必須以“;”開始。3.指令系統(tǒng)中的特殊符號(hào)1)Rn:選定當(dāng)前寄存器區(qū)的寄存器R0~R7。2)@:間接尋址方式中,表示間址寄存器的符號(hào)。如@Ri,表示當(dāng)前選中的工作寄存器組中可作為地址指針的兩個(gè)工作寄存器R0和R1。3)#data:8位常數(shù),即包含在指令中的8位常數(shù)。4)#data16:16位常數(shù),即包含在指令中的16位常數(shù)。5)direct:8位片內(nèi)RAM單元(包括SFR)的直接地址。6)addr11:11位目的地址,用于ACALL和AJMP指令中。目的地址必須放在與下一條指令第一個(gè)字節(jié)同一個(gè)2KB程序存儲(chǔ)地址空間之內(nèi)。7)addr16:16位目的地址,用于LCALL和LJMP指令中。目的地址范圍在64KB程序存儲(chǔ)器地址空間。8)rel:補(bǔ)碼形式的8位地址偏移量,用于相對(duì)轉(zhuǎn)移指令中。偏移量以下一條指令第一字節(jié)地址為基值,偏移范圍為-128~+127。9)bit:片內(nèi)RAM或特殊功能寄存器的直接尋址位地址。MOVDPTR,#5678HMOVR1,#32HMOVA,@R03.2指令系統(tǒng)的尋址方式尋址方式就是在指令中說明操作數(shù)所在地址的方法。共7種尋址方式。立即尋址直接尋址寄存器尋址寄存器間接尋址變址尋址(基址寄存器+變址寄存器間接尋址)相對(duì)尋址位尋址1.立即尋址方式指令的操作數(shù)是要參與運(yùn)算的數(shù),所以又叫立即數(shù),用“#”號(hào)表示。立即數(shù)就是存放在程序存儲(chǔ)器中的常數(shù)。例如:ADDA,#34H

把立即數(shù)34H與累加器A中內(nèi)容相加,結(jié)果送A中。在MCS-51的指令系統(tǒng)中,僅有一條指令的操作數(shù)是16位的立即數(shù),其功能是向地址指針DPTR傳送16位的地址,即把立即數(shù)的高8位送入DPH,低8位送入DPL。例如:MOVDPTR,#3FA6H表示把16位二進(jìn)制表示的地址送給DPTR寄存器。2.直接尋址方式

直接尋址方式是指操作數(shù)給出的是參與運(yùn)算的數(shù)的地址。在MCS-51單片機(jī)中,直接地址只能用來表示特殊功能寄存器、內(nèi)部數(shù)據(jù)存儲(chǔ)器以及位地址空間。其中,特殊功能寄存器和位地址空間只能用直接尋址方式來訪問。例如:MOVA,3AH

表示把內(nèi)部RAM的3AH單元的內(nèi)容傳送到A。尋址范圍:(1)內(nèi)部RAM的128個(gè)單元 (2)特殊功能寄存器。除了以單元地址的形式外,還可用寄存器符號(hào)的形式給出。例如:

MOVA,80H與MOVA,P0是等價(jià)的。直接尋址是給出操作數(shù)的直接地址。3.寄存器尋址方式操作數(shù)在寄存器中

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

表示把寄存器Rn的內(nèi)容傳送給累加器A尋址范圍:(1)4組通用工作寄存區(qū)共32個(gè)工作寄存器。(2)部分特殊功能寄存器,例如A、B以及數(shù)據(jù)指針寄存器DPTR等。MOVA,R0;將R0中的數(shù)據(jù)傳送至A中INCAMULAB【例】這些被尋址寄存器中的內(nèi)容就是操作數(shù)4.寄存器間接尋址方式

寄存器中存放的是操作數(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)作間址寄存器5.基址寄存器加變址寄存器間址尋址方式以16位寄存器DPTR(或PC)作為基址寄存器,累加器作為變址寄存器。變址時(shí),把兩者的內(nèi)容相加,得到的結(jié)果作為操作數(shù)的地址。這種方式常用于查表操作。例如:1)以程序計(jì)數(shù)器當(dāng)前值為基址格式:MOVCA,@A+PC

2)以數(shù)據(jù)指針DPTR為基址格式: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+DPTR6.相對(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向地址增加方向最大可轉(zhuǎn)移(127+轉(zhuǎn)移指令字節(jié))個(gè)單元地址,向地址減少方向最大可轉(zhuǎn)移(128-轉(zhuǎn)移指令字節(jié))個(gè)單元地址。

注意:1)“當(dāng)前PC值”指程序中下一條指令所在的首地址,是一個(gè)16位數(shù);2)符號(hào)“rel”表示“偏移量”,是一個(gè)帶符號(hào)的單字節(jié)數(shù),范圍是:-128~+127(80H~7FH)在實(shí)際編程中,“rel”通常用標(biāo)號(hào)代替例:2000H:SJMP08H;在實(shí)際編程中,“rel”通常用標(biāo)號(hào)代替例:SJMPLOOP1例:2000H:SJMP08H;原PC值為2000H;執(zhí)行這條指令后的當(dāng)前PC值為2002H,rel為08H。2002H+08H=200AH,轉(zhuǎn)移目的地址為200AH,程序就跳轉(zhuǎn)至200AH去執(zhí)行了。右圖為SJMP08H相對(duì)尋址示意圖。;將位地址07H(字節(jié)地址20H中最高位)中的數(shù)據(jù)傳送至進(jìn)位位Cy。

7.位尋址方式位尋址是對(duì)內(nèi)RAM和特殊功能寄存器中的可尋址位進(jìn)行操作的尋址方式。指令中直接給出了操作數(shù)所在的位地址。例:CLRP1.0;(P1.0)←0SETBACC.7;(ACC.7)←1CPLC;(C)←NOT(C)MOVC,07H

注意:1)位地址里的數(shù)據(jù)只可能是一個(gè)0或12)有的位地址十分明確,如P1.0,ACC.7等,有的位地址則“不太明確”,如:MOVA,17H;(A)←(17H),17H是字節(jié)地址MOVACC.0,17H;(ACC.0)←(17H),這里ACC.0是位地址所以該指令中的17H是22H單元的第7位3.3MCS-51單片機(jī)指令系統(tǒng)

111條指令,按功能分類,可分為下面5大類:(1)數(shù)據(jù)傳送類(29條)(2)算術(shù)操作類(24條(3)邏輯運(yùn)算類(24條)(4)控制轉(zhuǎn)移類(17條)(5)位操作類(17條)這5大類指令,基本實(shí)現(xiàn)單片機(jī)無所不能的功能!指令中符號(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é)地址。#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位目的地址addr16

16位目的地址@間接尋址寄存器前綴,如@Ri,@A+DPTR(X)

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

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

MOV<目的操作數(shù)>,<源操作數(shù)>屬“復(fù)制”,而不是“搬家”數(shù)據(jù)傳送類指令不影響標(biāo)志位:Cy、Ac和OV,影響奇偶標(biāo)志位P。1.以累加器為目的操作數(shù)的指令 MOVA,#data;#data→(A) MOVA,Rn;(Rn)→(A),n=0~7 MOVA,@Ri;((Ri))→(A),i=0,1 MOVA,direct;(direct)→(A)例如:

MOVA,#0F5H;

立即數(shù)F5H→(A) MOVA,R5;(R5)→(A) MOVA,@R0;((R0))→(A) MOVA,30H;((30H))→(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.以直接地址為目的操作數(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ù)目標(biāo)地址傳送指令

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的內(nèi)容加1,指向空單元;然后將直接尋址單元中的數(shù)據(jù)壓入到SP所指示的單元中,此時(shí),SP的內(nèi)容就是新的棧頂。(2)出棧指令

POPdirect其功能與PUSH的相反,即首先將棧頂SP所指示的單元內(nèi)容彈出到直接尋址單元中,然后將SP的內(nèi)容減1,此時(shí)SP指向新的棧頂。

例如,設(shè)SP=30H,(50H)=8FH,指令如下: PUSH50H ;SP+1→SP,(50H)→(31H) POP40H ;(31H)→(40H),SP-1→SP例如,設(shè)片內(nèi)RAM(30H)=X,(40H)=Y,通過堆棧操作實(shí)現(xiàn)兩單元內(nèi)容互相交換,程序如下: MOVSP,#1FH PUSH30H PUSH40H POP30H POP40H 程序執(zhí)行結(jié)果:(30H)=Y,(40H)=X。7.查表指令

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

(1)MOVCA,@A+PC;;PC+1→PC,(A+PC)→A以PC作基址寄存器,A的內(nèi)容作為無符號(hào)整數(shù)和PC中的內(nèi)容(下一條指令的起始地址)相加后得到一個(gè)16位的地址,該地址指出的程序存儲(chǔ)單元的內(nèi)容送到累加器A。注意: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;;(A+DPTR)→A以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è)字母,即代碼的意思?!纠恳阎猂OM中存有0~9的平方表,首地址為2000H,試根據(jù)累加器A中的數(shù)值查找對(duì)應(yīng)的平方值,存入內(nèi)RAM30H。(設(shè)A=3)

解:若用DPTR作為基址寄存器,可編程如下:1000H:MOVDPTR,#2000H;置ROM平方表首地址MOVCA,@A+DPTR;A+2000H=2003H(設(shè)A=3),;A=(2003H)=09HMOV30H,A ;平方值存入內(nèi)RAM30H中 …………2000H:00H ;平方表:02=02001H:01H ;12=12002H:04H ;22=42003H:09H ;32=92004H:10H ;42=16,16=10H…………2009H:51H ;92=81,81=51H8.累加器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。內(nèi)RAM(包括特殊功能寄存器):用MOV指令傳送;外RAM:用MOVX指令傳送;ROM:用MOVC指令傳送。三個(gè)不同的存儲(chǔ)空間用三種不同的指令傳送:【例】按下列要求傳送數(shù)據(jù):設(shè)ROM(2000H)=ABH(1)ROM2000H單元數(shù)據(jù)送內(nèi)RAM10H單元;(2)R0M2000H單元數(shù)據(jù)送外RAM80H單元;(3)ROM2000H單元數(shù)據(jù)送外RAM1000H單元;解(1):MOVDPTR,#2000H;置基址2000H,DPTR=2000H MOVA,#00H;置變址0,A=00H MOVCA,@A+DPTR;讀ROM2000H,A=ABH MOV10H,A;存內(nèi)RAM10H單元,(10H)=ABH解(2):MOVDPTR,#1FFFH;置基址1FFFH,DPTR=1FFFH MOVA,#01H;置變址01H,A=01H MOVCA,@A+DPTR;讀ROM2000H,A=ABH NOVR0,#80H;置外RAM間址,R0=80H MOVX@R0,A;寫外RAM80H,外RAM(80H)=ABH解(3):MOVDPTR,#2000H;置基址2000H,DPTR=2000H MOVA,#00H;置變址0,A=00H MOVCA,@A+DPTR;讀ROM2000H,A=ABH MOVDPH,1OH;修改外RAM地址,DPTR=1000H MOVX@DPTR,A;寫外RAM1000H,外RAM(1000H)=ABH9.交換指令(1)字節(jié)交換指令

XCHA,Rn XCHA,direct XCHA,@Ri例如,已知R0=15H,A=46H,(15H)=50H,執(zhí)行指令XCHA,@R0程序執(zhí)行的結(jié)果:A=50H, (15H)=46H。執(zhí)行下列指令:

XCHA,R7;(A)與(R7)互換XCHA,40H;(A)與(40H)互換XCHA,@R0;(A)與((R0))互換(2)半字節(jié)交換指令

XCHDA,@Ri累加器的低4位與內(nèi)部RAM低4位交換。例如:例如,已知R0=20H,A=5AH,片內(nèi)RAM(20H)=46H,執(zhí)行指令XCHDA,@R0程序執(zhí)行結(jié)果:A=56H,(20H)=4AH。(3)累加器A的高4位與低4位內(nèi)容互換指令SWAP A ;A.3~A.0A.7~A.4該指令的功能是,將A的高、低兩個(gè)半字節(jié)相互交換3.3.2算術(shù)操作類指令

單字節(jié)的加、減、乘、除法指令,都是針對(duì)8位二進(jìn)制無符號(hào)數(shù)。執(zhí)行的結(jié)果對(duì)Cy、Ac、OV三種標(biāo)志位有影響。但增1和減1指令不影響上述標(biāo)志。1.加法指令,(不帶Cy加法指令)(4條)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”,否則OV清“0”。溢出標(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ù)的有效范圍。例

(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。例(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條:

ADDCA,Rn ;A+(Rn)+Cy→A,n=0~7ADDCA,direct ;A+(direct)+Cy→AADDCA,@Ri ;A+(Ri)+Cy→A,i=0,1 ADDCA,#data ;A+#data+Cy→A

例(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)。【例3.3】設(shè)片內(nèi)RAM30H、31H和32H、33H分別存放兩個(gè)16位無符號(hào)數(shù),要求將兩個(gè)數(shù)的和存入30H、31H(低位在前,高位在后)。程序如下: MOVR0,#30H ;

設(shè)置第一個(gè)數(shù)地址指針 MOV R1,#32H ;

設(shè)置第二個(gè)數(shù)地址指針 MOVA,@R0 ;

取低位 ADDA,@R1 ;

兩數(shù)低位相加 MOV @R0,A ;

存“和”的低位 INC R0 INC R1 MOV A,@R0 ;

取高位 ADDCA,@R1 ;

兩數(shù)高位相加 MOV @R0,A ;

存“和”的高位 SJMP $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ò)誤的。調(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)的。例(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)行修正。結(jié)果為:(A)=23H,Cy=1可見,56+67=123,結(jié)果是正確的。若(A)3~09或(AC)=1則(A)3~0(A)3~0+6;若(A)7~49或(CY)=1則(A)7~4(A)7~4+6;例:兩個(gè)十進(jìn)制數(shù)“65”與“58”相加,根據(jù)常識(shí),顯然其和應(yīng)當(dāng)為“123”。MOVA,#65HADDA,#58HDAA結(jié)果:(A)=23H(CY)=1指令“DAA”完成的操作:

65011001015801011000

+13181926601100110若(A)3~09或(AC)=1則(A)3~0(A)3~0+6;若(A)7~49或(CY)=1則(A)7~4(A)7~4+6;又如:兩個(gè)十進(jìn)制數(shù)“39”與“58”相加,根據(jù)常識(shí),顯然其和應(yīng)當(dāng)為“97”。MOVA,#39HADDA,#58HDAA結(jié)果:(A)=97H(CY)=0

39001110015801011000

+0723960110指令“DAA”完成的操作:5.帶借位的減法指令

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。例(A)=C9H,(R2)=54H,Cy=1,執(zhí)行指令:SUBBA,R2

結(jié)果:(A)=74H,Cy=0,Ac=0,OV=1(位6向位7借位)6.減1指令 4條指令:

DECA DECRn DECdirect DEC@Ri ;((Ri))-1→(Ri),i=0,1 減1指令不影響標(biāo)志位。例(A)=0FH,(R7)=19H,(30H)=00H,(R1)=40H,(40H)=0FFH,執(zhí)行指令

DEC A DEC R7 DEC 30H DEC @R1

結(jié)果為

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

MULAB;A×B→BA 如果積大于255,則置“1”溢出標(biāo)志位OV例如,設(shè)A=39H,B=5AH,執(zhí)行指令MULAB結(jié)果:A=0AH,B=14H,乘積是140AH,OV=1

8.除法指令

DIVAB;A/B→A(商),余數(shù)→B如果B的內(nèi)容為“0”(即除數(shù)為“0”),則存放結(jié)果的A、B中的內(nèi)容不定,并置“1”溢出標(biāo)志位OV。例如,設(shè)A=E6H,B=1BH,執(zhí)行指令:DIV AB結(jié)果:A=8H(商),B=0EH(余數(shù))。1.邏輯與指令

ANLA,Rn ANLA,direct ANLA,@Ri ANLA,#data ANLdirect,A ANLdirect,#data

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

ANLA,R0結(jié)果:(A)=05H3.3.3邏輯運(yùn)算類指令這類指令主要用于對(duì)8位二進(jìn)制數(shù)進(jìn)行邏輯運(yùn)算,包括邏輯與、邏輯或、邏輯異或、取反、清零以及循環(huán)移位指令,共有24條指令。2.邏輯或指令

ORLA,Rn ORLA,direct ORLA,@Ri ORLA,#data ORLdirect,A ORLdirect,#data

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

ORLP1,A 結(jié)果:(P1)=37H

3.邏輯異或指令

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

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

XRLA,R3結(jié)果:(A)=E3H4.累加器A清零指令 CLR A;0→A這條指令的功能是將累加器A的內(nèi)容清零。5.累加器A取反指令 CPL A以上指令的功能是將累加器A的內(nèi)容逐位取反。6.累加器A循環(huán)移位指令 RL A ;

左循環(huán)移位指令 RR A ;

右循環(huán)移位指令 RLC A ;

帶進(jìn)位左循環(huán)移位指令 RRC A ;

帶進(jìn)位右循環(huán)移位指令 1.左環(huán)移指令

RLA功能是累加器A的8位向左循環(huán)移位,位7循環(huán)移入位0,不影響標(biāo)志。2.帶進(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)志。3.右環(huán)移指令

RRA功能是累加器A的內(nèi)容向右環(huán)移一位,Acc.0移入Acc.7,不影響其它標(biāo)志。4.帶進(jìn)位環(huán)移指令

RRCA功能:累加器A的內(nèi)容和進(jìn)位標(biāo)志Cy一起向右環(huán)移一位,Acc.0進(jìn)入Cy,Cy移入Acc.7。①循環(huán)左移:RLA②帶Cy循環(huán)左移:RLCA

③循環(huán)右移:RRA

④帶Cy循環(huán)右移:RRCA

3.3.4控制轉(zhuǎn)移類指令控制轉(zhuǎn)移類指令的功能是改變程序執(zhí)行的方向,或調(diào)用子程序,或從子程序返回。這些都是通過改變程序計(jì)數(shù)器PC中的內(nèi)容來實(shí)現(xiàn)的。這類指令可分為轉(zhuǎn)移類指令、調(diào)用子程序及返回指令、空操作指令。1.轉(zhuǎn)移類指令(1)無條件轉(zhuǎn)移指令 LJMPaddr16;addr16→PC AJMPaddr11;PC+2→PC,addr11→PC.10~PC.0 JMP @A+DPTR;A+DPTR→PC SJMPrel ;PC+rel→PC1)LJMP為長(zhǎng)轉(zhuǎn)移指令LJMPaddr16;addr15~0→PC

它的功能是把轉(zhuǎn)移地址addr16送入程序計(jì)數(shù)器PC,CPU無條件轉(zhuǎn)移到addr16處執(zhí)行程序。因?yàn)閍ddr16是16位二進(jìn)制數(shù),因此,程序可轉(zhuǎn)移到64KB范圍的任何地址單元去執(zhí)行。該指令轉(zhuǎn)移范圍大,為三字節(jié)指令。2)AJMP為絕對(duì)轉(zhuǎn)移指令由于指令中只提供了低11位地址,所以程序只能轉(zhuǎn)移到下一條指令開始的2KB范圍內(nèi)執(zhí)行。 AJMPaddrll;PC+2→PC,addr10~0→PC10~0,PC15~11不變2K字節(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)地址。3)JMP@A+DPTR為變址尋址轉(zhuǎn)移指令是單字節(jié)無條件轉(zhuǎn)移指令。在指令執(zhí)行前,應(yīng)預(yù)先把目標(biāo)轉(zhuǎn)移地址的基地址送入DPTR,目標(biāo)轉(zhuǎn)移地址對(duì)基地址的偏移量放在累加器A中,在執(zhí)行指令時(shí),CPU把DPTR中的基地址和累加器A中的地址偏移量相加,形成目標(biāo)轉(zhuǎn)移地址送入程序計(jì)數(shù)器PC。例如,設(shè)累加器A中的內(nèi)容為0~6的偶數(shù),程序存儲(chǔ)器中存放著標(biāo)號(hào)為JMPTBL的轉(zhuǎn)移表。執(zhí)行下面程序,將根據(jù)A的內(nèi)容轉(zhuǎn)到相應(yīng)的分支處理程序。

MOV DPTR,#JMPTBL JMP@A+DPTR ;單字節(jié)無條件轉(zhuǎn)移指令JMPTBL:AJMPLABEL0 ;轉(zhuǎn)LABEL0分支程序

AJMPLABEL1 ;轉(zhuǎn)LABEL1分支程序

AJMPLABEL2 ;轉(zhuǎn)LABEL2分支程序

AJMPLABEL3 ;轉(zhuǎn)LABEL3分支程序4)SJMP為短轉(zhuǎn)移指令是無條件相對(duì)轉(zhuǎn)移指令,為兩字節(jié)指令,指令的操作數(shù)是相對(duì)地址。該指令執(zhí)行后,程序便轉(zhuǎn)移到PC當(dāng)前值與rel值之和所指示的地址單元,rel是一個(gè)單字節(jié)的帶符號(hào)8位二進(jìn)制補(bǔ)碼數(shù),所以它所能實(shí)現(xiàn)的程序轉(zhuǎn)移是雙向的。rel如為正,則向地址增大的方向轉(zhuǎn)移;如rel為負(fù),則向地址減小的方向轉(zhuǎn)移。

SJMPrel;PC+2→PC,PC+rel→PC實(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ì)算。 例如,HERE:SJMPHERE 或 SJMP$LJMP、AJMP、SJMP三條無條件轉(zhuǎn)移指令的區(qū)別:①轉(zhuǎn)移范圍不一樣。

LJMP轉(zhuǎn)移范圍是64KB;AJMP轉(zhuǎn)移范圍是與當(dāng)前PC值同一2KB;SJMP轉(zhuǎn)移范圍是當(dāng)前PC-128B~+127B。使用AJMP和SJMP指令應(yīng)注意轉(zhuǎn)移目標(biāo)地址是否在轉(zhuǎn)移范圍內(nèi),若超出范圍,程序?qū)⒊鲥e(cuò)。②指令字節(jié)不一樣。

LJMP是3字節(jié)指令;AJMP、SJMP是2字節(jié)指令。(2)條件轉(zhuǎn)移指令 條件轉(zhuǎn)移指令根據(jù)給定的條件進(jìn)行檢測(cè),規(guī)定的條件滿足,則進(jìn)行轉(zhuǎn)移,條件不滿足則順序執(zhí)行下一條指令。當(dāng)條件滿足時(shí),把PC裝入下一條指令的第一個(gè)字節(jié)地址,再把帶符號(hào)的相對(duì)偏移量rel加到PC上,計(jì)算出目標(biāo)地址。 根據(jù)條件的不同,條件轉(zhuǎn)移指令可分為以下四種指令:1)判0轉(zhuǎn)移指令如下: JZrel ;如果累加器為“0”,則轉(zhuǎn)移 JNZrel ;如果累加器非“0”,則轉(zhuǎn)移【例3.11】有一數(shù)據(jù)塊存放起始地址為DATA1的片外RAM區(qū),數(shù)據(jù)塊以“0”為結(jié)束標(biāo)志,要求將其傳送到DATA2為起始地址的片內(nèi)RAM區(qū)。編寫程序如下:

MOVDPTR,#DATA1 ;設(shè)置片外RAM數(shù)據(jù)塊地址指針MOVR0,#DATA2 ;設(shè)置片內(nèi)RAM數(shù)據(jù)塊地址指針LOOP:MOVXA,@DPTR ;取數(shù)

JZENDO ;檢測(cè)是否為0?為0,轉(zhuǎn)ENDOMOV@R0,A ;不為0,傳送INCDPTR ;修改地址指針I(yè)NCR0AJMPLOOPENDO:SJMP $2)判Cy轉(zhuǎn)移指令如下:

JC rel JNC rel以上兩條指令是以PSW中進(jìn)位標(biāo)志Cy作為檢測(cè)條件,根據(jù)Cy標(biāo)志的情況來決定程序是否轉(zhuǎn)移。JCrel和JNCrel指令執(zhí)行過程如圖3.2所示。圖3.2JCrel和JNCrel指令執(zhí)行過程Cy也是位(布爾)處理器的累加器,所以也可以作為位處理器Cy轉(zhuǎn)移指令,用于控制程序轉(zhuǎn)移。3)比較轉(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。 MOV DPTR,#3000H ;置緩沖區(qū)地址指針 MOV R0,#20H ;置正數(shù)區(qū)地址指針 MOV R1,#30H ;置負(fù)數(shù)區(qū)地址指針NEXT: MOVX A,@DPTR ;取數(shù)

CJNE A,#0DH,COMP SJMP DONECOMP: JB ACC.7,LOOP ;為負(fù)數(shù),則轉(zhuǎn)LOOP MOV @R0,A ;為整數(shù),送正數(shù)區(qū) INC R0 INC DPTR SJMPNEXTLOOP: MOV @R1,A ;送負(fù)數(shù) INC R1 INC DPTR SJMPNEXTDONE: SJMP$4)循環(huán)轉(zhuǎn)移指令

減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)。程序如下: ORG 0000H MOV R7,#32H ;循環(huán)次數(shù)送R7 MOV R1,#30H ;R1指向內(nèi)部RAM30H單元處 MOV DPTR,#2000H;DPTR指向外部RAM2000H單元處LOOP: MOVX A,@DPTR;外部RAM內(nèi)容送A MOV @R1,A;A送內(nèi)部RAM INC DPTR;指向外部RAM的指針增1 INC R1 ;指向內(nèi)部RAM的指針增1

DJNZ R7,

LOOP;修改循環(huán)次數(shù),循環(huán)是否結(jié)束?未結(jié)束轉(zhuǎn)去繼續(xù)送數(shù)

SJMP $ ;循環(huán)結(jié)束,停止

END2.調(diào)用子程序及返回指令(1)調(diào)用子程序指令

LCALLaddr16 ACALLaddr11

在程序設(shè)計(jì)時(shí),為了避免重復(fù)性的編程,通常需要把一些重復(fù)的操作或運(yùn)算編成子程序獨(dú)立出來以供調(diào)用。子程序執(zhí)行完后,需要返回主程序原斷口地址處(或返回地址)繼續(xù)執(zhí)行主程序,這一操作過程是通過子程序返回指令來實(shí)現(xiàn)的。LCALL指令執(zhí)行步驟:①產(chǎn)生當(dāng)前PC:PC+3→PC, (PC+3是因?yàn)樵撝噶顬槿止?jié)指令)②斷口地址低8位保存到堆棧中: SP+1→SP,(PC)0~7→(SP)③斷口地址高8位保存到堆棧中: SP+1→SP,(PC)8~15→(SP)

④形成轉(zhuǎn)移目標(biāo)地址:addr16→PCLCALLaddr16;PC+3→PC,SP+1→SP,(PC)0~7→(SP) ;SP+1→SP,(PC)8~15→(SP);addr16→PC長(zhǎng)調(diào)用指令A(yù)CALL指令執(zhí)行步驟:①產(chǎn)生當(dāng)前PC:PC+2→PC, (PC+2是因?yàn)樵撝噶顬殡p字節(jié)指令)②斷口地址低8位保存到堆棧中: SP+1→SP,(PC)0~7→(SP)③斷口地址高8位保存到堆棧中: SP+1→SP,(PC)8~15→(SP)④形成轉(zhuǎn)移目標(biāo)地址:addr11→PC0~10,PC11~15不變短調(diào)用指令A(yù)CALLaddr11;PC+2→PC,SP+1→SP,(PC)0~7→(SP);SP+1→SP,(PC)8~15→(SP);addr0~10→PC0~10,PC11~15不變

(2)返回指令

RET RETI

RET指令是子程序返回指令。該指令的功能是將堆棧內(nèi)的斷口地址彈出送入PC,使CPU返回到原斷口地址處,繼續(xù)執(zhí)行原程序。

RETI指令是中斷返回指令。該指令除了執(zhí)行RET指令的功能外,還清除內(nèi)部相應(yīng)的中斷狀態(tài)寄存器(該寄存器由CPU響應(yīng)中斷時(shí)置位)的內(nèi)容。它只能用于中斷服務(wù)程序,RETI與RET不能互換使用。。3.空操作指令

NOP

;PC+1→PCNOP為單機(jī)周指令,在時(shí)間上占用一個(gè)機(jī)器周期,常用于時(shí)間“微調(diào)”。

3.3.5位操作類指令在匯編語言中,位操作類指令共有17條,位地址的表示方法有以下幾種:1)直接用位地址表示,如1FH。2)用點(diǎn)操作符號(hào)表示。點(diǎn)操作符(“.

”)的前面部分是字節(jié)地址或是可位尋址的專用寄存器,其后面部分的數(shù)字表示它們的位。如(D0H).4,PSW.4。3)寄存器的位定義名稱。如RS1,OV。4)用戶定義的位符號(hào)地址。如Bit1BITPSW.4 ,即將PSW.4定義為符號(hào)地址Bit1,經(jīng)定義以后,允許在指令中使用Bit1代替PSW.4。

1.位數(shù)據(jù)傳送指令

MOVC,bit MOVbit,C例MOVC,06H;(20H).6→Cy 06H是內(nèi)部RAM20H字節(jié)位6的位地址。

MOVP1.0,C;Cy→P1.02.位狀態(tài)修改指令

CLRC ;清“0”Cy CLRbit ;清“0”bit位 CPLC ;Cy求反 CPLbit ;bit位求反 SETBC ;置“1”Cy SETBbit ;置“1”bit位例:

CLRC ;0→Cy CLR27H ;0→(24H).7位 CPL08H ;(21H).0求反→(21H).0位 SETBP1.7 ;1→P1.7位3.位邏輯運(yùn)算指令 ANLC,bit;bit∧Cy→Cy ANLC,/bit;;/bit∧Cy→Cy

ORLC,bit ORLC,/bit4.位條件轉(zhuǎn)移指令

JCrel;如果進(jìn)位位Cy=1,則轉(zhuǎn)移 JNCrel;如果進(jìn)位位Cy=0,則轉(zhuǎn)移 JBbit,rel;如果直接尋址位=1,則轉(zhuǎn)移 JNBbit,rel;如果直接尋址位=0,則轉(zhuǎn)移 JBCbit,rel;如果直接尋址位=1, 則轉(zhuǎn)移,并清0直接尋址位

【例3.12】已知片外RAM3000H單元為起始的一個(gè)數(shù)據(jù)緩沖區(qū),以回車符(0DH)為結(jié)束標(biāo)志,試編寫程序把正負(fù)數(shù)分別送入片內(nèi)RAM20H和30H開始的存儲(chǔ)區(qū)?!纠?.12】已知片外RAM3000H單元為起始的一個(gè)數(shù)據(jù)緩沖區(qū),以回車符(0DH)為結(jié)束標(biāo)志,試編寫程序把正負(fù)數(shù)分別送入片內(nèi)RAM20H和30H開始的存儲(chǔ)區(qū)。 MOV DPTR,#3000H ;置緩沖區(qū)地址指針 MOV R0,#20H ;置正數(shù)區(qū)地址指針 MOV R1,#30H ;置負(fù)數(shù)區(qū)地址指針NEXT: MOVX A,@DPTR ;取數(shù)

CJNE A,#0DH,COMP SJMP DONECOMP: JB ACC.7,LOOP ;為負(fù)數(shù),則轉(zhuǎn)LOOP MOV @R0,A ;為整數(shù),送正數(shù)區(qū) INC R0 INC DPTR SJMPNEXTLOOP: MOV @R1,A ;送負(fù)數(shù) INC R1 INC DPTR SJMPNEXTDONE: SJMP$小結(jié):MCS-51指令集(五大類功能)數(shù)據(jù)傳送類指令(29條)算術(shù)運(yùn)算類指令(24條)邏輯運(yùn)算及移位類指令(24條)控制轉(zhuǎn)移類指令(17條)位操作(布爾操作)類指令(17條)內(nèi)部存儲(chǔ)器間傳送:(MOV——16條)外部數(shù)據(jù)存儲(chǔ)器RAM與累加器間傳送:(MOVX——4條)程序存儲(chǔ)器ROM向累加器傳送:(MOVC——2條)數(shù)據(jù)交換:(XCH,XCHD,SWAP——5條)堆棧操作:(PUSH,POP——2條)(一)數(shù)據(jù)傳送類指令(5種/29條)(二)算術(shù)運(yùn)算類指令(6種/24條)加法運(yùn)算(ADD——4條)帶進(jìn)位加法運(yùn)算(ADDC——4條)帶借位減法運(yùn)算(SUBB——4條)加1/減1操作(INC,DEC——9條)單字節(jié)乘/除法運(yùn)算(MUL,DIV——2條)十進(jìn)制調(diào)整(DAA——1條)(三)邏輯運(yùn)算及移位指令(5種/24條)邏輯與運(yùn)算:(ANL——6條)邏輯或運(yùn)算:(ORL——6條)邏輯異或運(yùn)算:(XRL——6條)累加器清零/取反:(CLR,CPL——2條)累加器移位操作:(RL,RLC,RR,RRC—4條)(四)控制轉(zhuǎn)移類指令(4種/17條)無條件轉(zhuǎn)移:(LJMP,AJMP,SJMP,JMP——4條)條件轉(zhuǎn)移(判斷跳轉(zhuǎn)):(JZ,JNZ,CJNE,DJNZ——8條)子程序調(diào)用及返回:(LCALL,ACALL,RET,RETI——4條)空操作:(NOP——1條)

(五)位操作類指令(4種17條)位傳送:(MOV——2條)位清零/置位:(CLR,SETB——4條)位邏輯與/或/非運(yùn)算:(ANL,ORL,CPL——6條)位條件轉(zhuǎn)移:(JC,JNC,JB,JNB,JBC——5條)3.4MCS-51匯編語言程序設(shè)計(jì)匯編語言是面向機(jī)器硬件的語言,匯編語言程序設(shè)計(jì)是開發(fā)單片機(jī)應(yīng)用系統(tǒng)軟件的關(guān)鍵。要求程序設(shè)計(jì)者對(duì)89C51單片機(jī)具有很好的“軟、硬結(jié)合”的功底。

本節(jié)著重介紹MCS-51單片機(jī)匯編語言及其程序設(shè)計(jì)的一些基本方法,并列舉一些典型的匯編語言程序?qū)嵗?.4.1匯編語言程序設(shè)計(jì)概述程序是若干指令的有序集合,單片機(jī)的運(yùn)行就是執(zhí)行這一指令序列的過程,編寫這一指令序列的過程稱為程序設(shè)計(jì)。

用于程序設(shè)計(jì)的語言基本上分為3種:機(jī)器語言、匯編語言和高級(jí)語言。

1.機(jī)器語言

二進(jìn)制代碼表示的指令、數(shù)字和符號(hào)簡(jiǎn)稱為機(jī)器語言不易懂,難記憶,易出錯(cuò)。2.匯編語言英文助記符表示的指令稱為符號(hào)語言或匯編語言將匯編語言程序轉(zhuǎn)換成為二進(jìn)制代碼表示的機(jī)器語言程序稱為匯編程序經(jīng)匯編程序“匯編(翻譯)”得到的機(jī)器語言程序稱為目標(biāo)程序,原來的匯編語言程序稱為源程序。匯編語言特點(diǎn):指令容易理解、記憶,用匯編語言編寫的程序可讀性好。匯編語言指令與機(jī)器語言指令一一對(duì)應(yīng),用它編寫的程序能最有效地利用存儲(chǔ)空間。指令直接訪問CPU的寄存器、存儲(chǔ)單元和I/O端口,可以充分發(fā)揮CPU的功能,滿足實(shí)時(shí)控制的要求。匯編語言是面向機(jī)器的語言,對(duì)使用者來說,必須對(duì)機(jī)器的硬件結(jié)構(gòu)、指令系統(tǒng)都要熟悉,所以掌握起來不太容易。此外,匯編語言程序的通用性差,程序不能移植。匯編語言和機(jī)器語言都脫離不開具體機(jī)器的硬件,均是面向“機(jī)器”的語言,缺乏通用性。3.高級(jí)語言高級(jí)語言是以接近人的常用語言形式編寫程序的語言總稱,它是一種面向過程而獨(dú)立于機(jī)器的通用語言。用高級(jí)語言編寫程序與人們通常解題的步驟比較接近,而且不依賴于計(jì)算機(jī)的結(jié)構(gòu)和指令系統(tǒng)。用高級(jí)語言編寫的源程序,必須經(jīng)編譯程序或解釋程序進(jìn)行翻譯生成目標(biāo)程序,計(jì)算機(jī)才能執(zhí)行。高級(jí)語言的特點(diǎn)是簡(jiǎn)單、易學(xué)、易懂,編程快,具有通用性,便于移植到不同機(jī)型。C語言和匯編語言混合編程

在很多需要直接控制硬件的應(yīng)用場(chǎng)合,則更是非用匯編語言不可。使用匯編語言編程,是單片機(jī)程序設(shè)計(jì)的基本功之一3.4.2匯編語言語句和格式兩種基本類型:指令性語句和指示性語句(偽指令)(1)指令性語句每一條指令語句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼——機(jī)器代碼(2)指示性語句(偽指令)是為匯編服務(wù)的。在匯編時(shí)沒有機(jī)器代碼與之對(duì)應(yīng)。

MCS-51的匯編語言的四分段格式如下:

標(biāo)號(hào):操作碼字段操作數(shù)字段注釋字段如START: MOV A,#20H ;20H→A規(guī)則:(1)標(biāo)號(hào)字段和操作字碼段之間要有冒號(hào)“:”相隔;(2)操作碼字段和操作數(shù)字段間的分界符是空格;(3)雙操作數(shù)之間用逗號(hào)相隔;(4)操作數(shù)字段和注釋字段之間的分界符用分號(hào)“;”相隔。操作碼字段為必選項(xiàng),其余各段為任選項(xiàng)。

基本語法規(guī)則:(1)標(biāo)號(hào)是語句所在地址的標(biāo)志符號(hào)(1)標(biāo)號(hào)后邊必須跟以冒號(hào)“:”(2)由1-8個(gè)ASCII字符組成(3)同一標(biāo)號(hào)在一個(gè)程序中只能定義一次(4)不能使用匯編語言已經(jīng)定義的符號(hào)作為標(biāo)號(hào)(2)操作碼

是匯編語言指令中唯一不能空缺的部分。匯編程序就是根據(jù)這一字段來生成機(jī)器代碼的。(3)操作數(shù)

操作數(shù)是指令操作碼的操作對(duì)象,它是參加操作的數(shù)或是操作數(shù)據(jù)所在的地址。通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是雙操作數(shù),則操作數(shù)之間,要以逗號(hào)隔開。MCS-51單片機(jī)指令的操作數(shù)有三種類型的信息:立即數(shù)(8位或16位)、寄存器和地址。十六進(jìn)制的操作數(shù)以字符A-F中的某個(gè)開頭時(shí),則需在它前面加一個(gè)“0”,以便在匯編時(shí)把它和字符A~F區(qū)別開來。工作寄存器和特殊功能寄存器的表示采用工作寄存器和特殊功能寄存器的代號(hào)來表示,也可用其地址來表示。例如,累加器可用A(或Acc)表示。也可用0E0H來表示,0E0H為累加器A的地址。美元符號(hào)$的使用用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下指令:

JNBF0,$與如下指令是等價(jià)的:

HERE:JNBF0,HERE

再如:

HERE:SJMPHERE可寫為:

SJMP$(4)注釋字段

必須以分號(hào)“;”開頭,換行書寫,但必須注意也要以分號(hào)“;”開頭。匯編時(shí),注釋字段不會(huì)產(chǎn)生機(jī)器代碼。偽指令偽指令是非執(zhí)行指令,它只是在對(duì)源程序進(jìn)行匯編的過程中起某些控制作用。例如,設(shè)置目標(biāo)程序或數(shù)據(jù)存儲(chǔ)區(qū)的起始地址,給程序分配一定的存儲(chǔ)單元、定義符號(hào),判斷程序是否結(jié)束等。偽指令匯編后不產(chǎn)生目標(biāo)代碼,它不影響程序執(zhí)行。所以“偽”體現(xiàn)在匯編時(shí),偽指令沒有相應(yīng)的機(jī)器代碼產(chǎn)生。常用的偽指令:

(1)ORG(ORiGin)匯編起始地址命令ORG用來設(shè)定程序或數(shù)據(jù)存儲(chǔ)區(qū)的起始地址。它的格式如下: ORG 16位地址例如, ORG 2000H START: MOVA,#40H上例說明程序的起始地址是2000H,第一條指令就從2000H開始存放。在一個(gè)源程序中,可多次使用ORG指令,來規(guī)定不同的程序段的起始地址。但是,地址必須由小到大排列,地址不能交叉、重疊。例如:

ORG4000HTAB:DB73H,45,“A”,“2”TAB1:DB101B以上指令經(jīng)匯編后,將對(duì)4000H開始的若干內(nèi)存單元賦值。(4000H)=73H,(4001H):2DH(注:45的16進(jìn)制數(shù)),

ORG 0000H LJMP MAIN

ORG 001BH LJMP INTT1

ORG 0100HMAIN:MOV SP,#60H;主程序入口,設(shè)堆棧指針 MOV R3,#100;置5ms計(jì)數(shù)循環(huán)初值 MOV TMOD,#00H;設(shè)定時(shí)器1為方式0 MOV TH1,#63H;置定時(shí)器初值 MOV TL1,#18H CLR P1.0 SETB EA;開中斷 SETB ET1 SETB TR1 ;啟動(dòng)T1

SJMP $INTT1:MOV TH1,#63H;重新置定時(shí)器初值

MOV TL1,#18H DJNZ R3,LOOP1;未到500ms繼續(xù)循環(huán)

CPL P1.0;500ms到,對(duì)P1.0輸出求反

MOV R3,#100;恢復(fù)5ms計(jì)數(shù)循環(huán)初值LOOP1:RETI ;返回主程序

END(2)END(ENDofassembly)匯編終止命令END是匯編語言源程序結(jié)束的偽指令,表示源程序結(jié)束。在END以后所寫的指令,匯編程序都不予處理。一個(gè)源程序只能有一個(gè)END指令,放在程序的末尾。(3)EQU賦值(或等值)指令它的作用是把操作數(shù)段中的地址或數(shù)據(jù)賦值給字符名稱。經(jīng)賦值后的字符名稱,其值在整個(gè)程序中不改變,且可多次使用。它的格式如下:

字符名稱EQU

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論