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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

(1)1個機器周期(12個時鐘振蕩周期)指令64條

(2)2個機器周期(24個時鐘振蕩周期)指令45條

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

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

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

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

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

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

設(shè)置第二個數(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é)束標志,要求將其傳送到DATA2為起始地址的片內(nèi)RAM區(qū)。編寫程序如下:

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

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

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

/*delay函數(shù)*/{unsignedchari,j;/*這個函數(shù)執(zhí)行時間的延遲*/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ù)*/}}標號:操作碼操作數(shù);注釋

指令格式

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

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

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

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

指令前的標號代表該指令的地址,是用符號表示的地址。

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

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

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

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

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

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

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

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

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

寄存器中存放的是操作數(shù)的地址,在寄存器前加前綴標志“@”。訪問內(nèi)部RAM或外部RAM的低256個字節(jié)時,只能采用R0或R1作為間址寄存器。例如:

MOVA,@Ri;i=0或1

其中Ri中的內(nèi)容為40H,把內(nèi)部RAM40H單元內(nèi)容送A。尋址范圍:(1)訪問內(nèi)部RAM低128個單元,其通用形式為@Ri(2)對外部內(nèi)部RAM的64K字節(jié)的間接尋址,例如: MOVXA,@DPTR(3)片外數(shù)據(jù)存儲器的低256字節(jié)例如:MOVXA,@Ri(4)堆棧區(qū)堆棧操作指令PUSH(壓棧)和POP(出棧)使用堆棧指針(SP)作間址寄存器5.基址寄存器加變址寄存器間址尋址方式以16位寄存器DPTR(或PC)作為基址寄存器,累加器作為變址寄存器。變址時,把兩者的內(nèi)容相加,得到的結(jié)果作為操作數(shù)的地址。這種方式常用于查表操作。例如:1)以程序計數(shù)器當(dāng)前值為基址格式:MOVCA,@A+PC

2)以數(shù)據(jù)指針DPTR為基址格式:MOVCA,@A+DPTR

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

MOVCA,@A+DPTR MOVCA,@A+PC JMP@A+DPTR6.相對尋址方式

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

偏移量rel是一帶符號的8位二進制數(shù)補碼數(shù)。范圍是:–128~+127向地址增加方向最大可轉(zhuǎn)移(127+轉(zhuǎn)移指令字節(jié))個單元地址,向地址減少方向最大可轉(zhuǎn)移(128-轉(zhuǎn)移指令字節(jié))個單元地址。

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

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

注意:1)位地址里的數(shù)據(jù)只可能是一個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單片機指令系統(tǒng)

111條指令,按功能分類,可分為下面5大類:(1)數(shù)據(jù)傳送類(29條)(2)算術(shù)操作類(24條(3)邏輯運算類(24條)(4)控制轉(zhuǎn)移類(17條)(5)位操作類(17條)這5大類指令,基本實現(xiàn)單片機無所不能的功能!指令中符號的意義:Rn當(dāng)前寄存器區(qū)的8個工作寄存器R0~R7(n=0~7)。Ri當(dāng)前寄存器區(qū)中可作間接尋址寄存器的2個寄存器R0、R1(i=0,1)。Direct

直接地址,即8位的內(nèi)部RAM或特殊功能寄存器的字節(jié)地址。#data

包含在指令中的8位立即數(shù)。#data16包含在指令中的16位立即數(shù)。rel相對轉(zhuǎn)移指令中的偏移量,為8位的帶符號補碼數(shù)。DPTR

數(shù)據(jù)指針,可用作16位的數(shù)據(jù)地址寄存器。bit內(nèi)部RAM或特殊功能寄存器中的直接尋址位。C(或Cy)進位標志位或位處理機中的累加器。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ù)傳送類指令不影響標志位:Cy、Ac和OV,影響奇偶標志位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中的某一個寄存器。3.以直接地址為目的操作數(shù)的指令

MOVdirect,A ;(A)→directMOVdirect,Rn ;(Rn)→direct,n=0~7MOVdirect1,direct2 ; MOVdirect,@Ri ;((Ri))→direct MOVdirect,#data ;#data→direct功能:把源操作數(shù)送入直接地址指出的存儲單元。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è)定一個后進先出(LIFO-LastInFirstOut)的區(qū)域稱作堆棧.堆棧指針SP指出堆棧的棧頂位置。(1)進棧指令

PUSHdirect其功能是首先將堆棧指針SP的內(nèi)容加1,指向空單元;然后將直接尋址單元中的數(shù)據(jù)壓入到SP所指示的單元中,此時,SP的內(nèi)容就是新的棧頂。(2)出棧指令

POPdirect其功能與PUSH的相反,即首先將棧頂SP所指示的單元內(nèi)容彈出到直接尋址單元中,然后將SP的內(nèi)容減1,此時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,通過堆棧操作實現(xiàn)兩單元內(nèi)容互相交換,程序如下: MOVSP,#1FH PUSH30H PUSH40H POP30H POP40H 程序執(zhí)行結(jié)果:(30H)=Y,(40H)=X。7.查表指令

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

(1)MOVCA,@A+PC;;PC+1→PC,(A+PC)→A以PC作基址寄存器,A的內(nèi)容作為無符號整數(shù)和PC中的內(nèi)容(下一條指令的起始地址)相加后得到一個16位的地址,該地址指出的程序存儲單元的內(nèi)容送到累加器A。注意:PSEN*信號有效。例如:(A)=30H,執(zhí)行地址1000H處的指令

1000H:MOVCA,@A+PC本指令占用一個字節(jié),執(zhí)行結(jié)果將程序存儲器中1031H的內(nèi)容送入A。優(yōu)點:不改變特殊功能寄存器及PC的狀態(tài),根據(jù)A的內(nèi)容就可以取出表格中的常數(shù)。缺點:表格只能存放在該條查表指令后面的256個單元之內(nèi),表格的大小受到限制,且表格只能被一段程序所利用。(2)MOVCA,@A+DPTR;;(A+DPTR)→A以DPTR作為基址寄存器,A的內(nèi)容作為無符號數(shù)和DPTR的內(nèi)容相加得到一個16位的地址,把由該地址指出的程序存儲器單元的內(nèi)容送到累加器A.例如:(DPTR)=8100H(A)=40H執(zhí)行指令

MOVCA,@A+DPTR本指令的執(zhí)行結(jié)果只和指針DPTR及累加器A的內(nèi)容有關(guān),與該指令存放的地址及常數(shù)表格存放的地址無關(guān),因此表格的大小和位置可以在64K程序存儲器中任意安排,一個表格可為各個程序塊公用。兩條指令是在MOV的后面加C,“C”是CODE的第一個字母,即代碼的意思?!纠恳阎猂OM中存有0~9的平方表,首地址為2000H,試根據(jù)累加器A中的數(shù)值查找對應(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ù)存儲器傳送指令

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

注意:伴隨著RD*或WR*信號有效。采用DPTR間接尋址,高8位地址(DPH)由P2口輸出,低8位地址(DPL)由P0口輸出。采用Ri(i=0,1)間接尋址,可尋址片外RAM的256個單元。Ri內(nèi)容由P0口輸出。MOV后“X”表示單片機訪問的是片外RAM存儲器或I/O。內(nèi)RAM(包括特殊功能寄存器):用MOV指令傳送;外RAM:用MOVX指令傳送;ROM:用MOVC指令傳送。三個不同的存儲空間用三種不同的指令傳送:【例】按下列要求傳送數(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的高、低兩個半字節(jié)相互交換3.3.2算術(shù)操作類指令

單字節(jié)的加、減、乘、除法指令,都是針對8位二進制無符號數(shù)。執(zhí)行的結(jié)果對Cy、Ac、OV三種標志位有影響。但增1和減1指令不影響上述標志。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

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

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

ADDA,R0結(jié)果:(A)=4FH,Cy=1,Ac=0,OV=0,P=1注意:上面的運算中,由于位6和位7同時有進位,所以標志位OV=0。例(A)=85H,(R0)=20H,(20H)=AFH,執(zhí)行指令:

ADDA,@R0

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

2.帶進位加法指令標志位Cy參加運算,因此是三個數(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中的任何標志。第5條指令I(lǐng)NCDPTR,是16位數(shù)增1指令。指令首先對低8位指針DPL的內(nèi)容執(zhí)行加1的操作,當(dāng)產(chǎn)生溢出時,就對DPH的內(nèi)容進行加1操作,并不影響標志Cy的狀態(tài)?!纠?.3】設(shè)片內(nèi)RAM30H、31H和32H、33H分別存放兩個16位無符號數(shù),要求將兩個數(shù)的和存入30H、31H(低位在前,高位在后)。程序如下: MOVR0,#30H ;

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

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

取低位 ADDA,@R1 ;

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

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

取高位 ADDCA,@R1 ;

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

存“和”的高位 SJMP $4.十進制調(diào)整指令用于對BCD碼十進制數(shù)加法運算結(jié)果的內(nèi)容修正。

指令格式:DAA兩個BCD碼按二進制相加之后,必須經(jīng)本指令的調(diào)整才能得到正確的壓縮BCD碼的和數(shù)。(1)十進制調(diào)整問題二進制數(shù)的加法運算原則并不能適用于十進制數(shù)的加法運算,有時會產(chǎn)生錯誤結(jié)果。例如:(a)3+6=90011+0101=1001運算結(jié)果正確(b)7+8=150111+1000=1111運算結(jié)果不正確(c)9+8=171001+1000=00001C=1結(jié)果不正確二進制數(shù)加法指令不能完全適用于BCD碼十進制數(shù)的加法運算,對結(jié)果作有條件的修正——十進制調(diào)整(2)出錯原因和調(diào)整方法BCD碼只用了了其中的10個,6個沒用到的編碼。(1010,1011,1100,1101,1110,1111)為無效碼凡結(jié)果進入或者跳過無效碼編碼區(qū)時,其結(jié)果就是錯誤的。調(diào)整的方法是把結(jié)果加6調(diào)整,即所謂十進制調(diào)整修正。修正方法應(yīng)是:(a)累加器低4位大于9或輔助進位位Ac=1,則進行低4位加6修正。(b)累加器高4位大于9或進位位Cy=1,則進行高4位加6修正。(c)累加器高4位為9,低4位大于9,則高4位和低4位分別加6修正。是否加6是通過執(zhí)行指令:DAA來自動實現(xiàn)的。例(A)=56H,(R5)=67H,把它們看作為兩個壓縮的BCD數(shù),進行BCD數(shù)的加法。執(zhí)行指令:

ADDA,R5DAA由于高、低4位分別大于9,所以要分別加6進行十進制調(diào)整對結(jié)果進行修正。結(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;例:兩個十進制數(shù)“65”與“58”相加,根據(jù)常識,顯然其和應(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;又如:兩個十進制數(shù)“39”與“58”相加,根據(jù)常識,顯然其和應(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)容減去指定的變量和進位標志Cy的值,結(jié)果存在累加器A中。如果位7需借位則置“1”Cy,否則清“0”Cy;如果位3需借位則置“1”Ac,否則清“0”Ac;如果位6需借位而位7不需要借位,或者位7需借位,位6不需借位,則置“1”溢出標志位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指令不影響標志位。例(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,不影響其他標志7.乘法指令

MULAB;A×B→BA 如果積大于255,則置“1”溢出標志位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”溢出標志位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邏輯運算類指令這類指令主要用于對8位二進制數(shù)進行邏輯運算,包括邏輯與、邏輯或、邏輯異或、取反、清零以及循環(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 ;

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

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

RLA功能是累加器A的8位向左循環(huán)移位,位7循環(huán)移入位0,不影響標志。2.帶進位左環(huán)移指令

RLCA功能:將累加器A的內(nèi)容和進位標志位Cy一起向左環(huán)移一位,Acc.7移入進位位Cy,Cy移入Acc.0,不影響其它標志。3.右環(huán)移指令

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

RRCA功能:累加器A的內(nèi)容和進位標志Cy一起向右環(huán)移一位,Acc.0進入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)用子程序,或從子程序返回。這些都是通過改變程序計數(shù)器PC中的內(nèi)容來實現(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為長轉(zhuǎn)移指令LJMPaddr16;addr15~0→PC

它的功能是把轉(zhuǎn)移地址addr16送入程序計數(shù)器PC,CPU無條件轉(zhuǎn)移到addr16處執(zhí)行程序。因為addr16是16位二進制數(shù),因此,程序可轉(zhuǎn)移到64KB范圍的任何地址單元去執(zhí)行。該指令轉(zhuǎn)移范圍大,為三字節(jié)指令。2)AJMP為絕對轉(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程序存儲器空間分為32個區(qū),每區(qū)2K字節(jié),轉(zhuǎn)移的目標地址必須與AJMP下一條指令的地址的高5位地址碼A15-A11相同。執(zhí)行指令時,先PC加2,然后把addrll送入PC.10~PC.0,PC.15~PC.11保持不變,程序轉(zhuǎn)移到目標地址。3)JMP@A+DPTR為變址尋址轉(zhuǎn)移指令是單字節(jié)無條件轉(zhuǎn)移指令。在指令執(zhí)行前,應(yīng)預(yù)先把目標轉(zhuǎn)移地址的基地址送入DPTR,目標轉(zhuǎn)移地址對基地址的偏移量放在累加器A中,在執(zhí)行指令時,CPU把DPTR中的基地址和累加器A中的地址偏移量相加,形成目標轉(zhuǎn)移地址送入程序計數(shù)器PC。例如,設(shè)累加器A中的內(nèi)容為0~6的偶數(shù),程序存儲器中存放著標號為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)移指令是無條件相對轉(zhuǎn)移指令,為兩字節(jié)指令,指令的操作數(shù)是相對地址。該指令執(zhí)行后,程序便轉(zhuǎn)移到PC當(dāng)前值與rel值之和所指示的地址單元,rel是一個單字節(jié)的帶符號8位二進制補碼數(shù),所以它所能實現(xiàn)的程序轉(zhuǎn)移是雙向的。rel如為正,則向地址增大的方向轉(zhuǎn)移;如rel為負,則向地址減小的方向轉(zhuǎn)移。

SJMPrel;PC+2→PC,PC+rel→PC實現(xiàn)的程序轉(zhuǎn)移是雙向的。在編寫程序時,直接寫上要轉(zhuǎn)向的目標地址標號就可以。例如:

LOOP: MOVA,R6

SJMPLOOP ┇程序在匯編時,由匯編程序自動計算和填入偏移量。手工匯編時,偏移量rel的值則需程序設(shè)計人員計算。 例如,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)移目標地址是否在轉(zhuǎn)移范圍內(nèi),若超出范圍,程序?qū)⒊鲥e。②指令字節(jié)不一樣。

LJMP是3字節(jié)指令;AJMP、SJMP是2字節(jié)指令。(2)條件轉(zhuǎn)移指令 條件轉(zhuǎn)移指令根據(jù)給定的條件進行檢測,規(guī)定的條件滿足,則進行轉(zhuǎn)移,條件不滿足則順序執(zhí)行下一條指令。當(dāng)條件滿足時,把PC裝入下一條指令的第一個字節(jié)地址,再把帶符號的相對偏移量rel加到PC上,計算出目標地址。 根據(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é)束標志,要求將其傳送到DATA2為起始地址的片內(nèi)RAM區(qū)。編寫程序如下:

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

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

JC rel JNC rel以上兩條指令是以PSW中進位標志Cy作為檢測條件,根據(jù)Cy標志的情況來決定程序是否轉(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比較前面兩個操作數(shù)的大小,如果它們的值不相等則轉(zhuǎn)移。如果第一操作數(shù)(無符號整數(shù))小于第二操作數(shù)(無符號整數(shù)),則置“1”Cy,否則清“0”Cy。 MOV DPTR,#3000H ;置緩沖區(qū)地址指針 MOV R0,#20H ;置正數(shù)區(qū)地址指針 MOV R1,#30H ;置負數(shù)區(qū)地址指針NEXT: MOVX A,@DPTR ;取數(shù)

CJNE A,#0DH,COMP SJMP DONECOMP: JB ACC.7,LOOP ;為負數(shù),則轉(zhuǎn)LOOP MOV @R0,A ;為整數(shù),送正數(shù)區(qū) INC R0 INC DPTR SJMPNEXTLOOP: MOV @R1,A ;送負數(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)計數(shù)器。主要用于控制程序循環(huán)。以減1后是否為“0”作為轉(zhuǎn)移條件,即可實現(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è)計時,為了避免重復(fù)性的編程,通常需要把一些重復(fù)的操作或運算編成子程序獨立出來以供調(diào)用。子程序執(zhí)行完后,需要返回主程序原斷口地址處(或返回地址)繼續(xù)執(zhí)行主程序,這一操作過程是通過子程序返回指令來實現(xiàn)的。LCALL指令執(zhí)行步驟:①產(chǎn)生當(dāng)前PC:PC+3→PC, (PC+3是因為該指令為三字節(jié)指令)②斷口地址低8位保存到堆棧中: SP+1→SP,(PC)0~7→(SP)③斷口地址高8位保存到堆棧中: SP+1→SP,(PC)8~15→(SP)

④形成轉(zhuǎn)移目標地址:addr16→PCLCALLaddr16;PC+3→PC,SP+1→SP,(PC)0~7→(SP) ;SP+1→SP,(PC)8~15→(SP);addr16→PC長調(diào)用指令A(yù)CALL指令執(zhí)行步驟:①產(chǎn)生當(dāng)前PC:PC+2→PC, (PC+2是因為該指令為雙字節(jié)指令)②斷口地址低8位保存到堆棧中: SP+1→SP,(PC)0~7→(SP)③斷口地址高8位保存到堆棧中: SP+1→SP,(PC)8~15→(SP)④形成轉(zhuǎn)移目標地址: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)中斷時置位)的內(nèi)容。它只能用于中斷服務(wù)程序,RETI與RET不能互換使用。。3.空操作指令

NOP

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

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

”)的前面部分是字節(jié)地址或是可位尋址的專用寄存器,其后面部分的數(shù)字表示它們的位。如(D0H).4,PSW.4。3)寄存器的位定義名稱。如RS1,OV。4)用戶定義的位符號地址。如Bit1BITPSW.4 ,即將PSW.4定義為符號地址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.位邏輯運算指令 ANLC,bit;bit∧Cy→Cy ANLC,/bit;;/bit∧Cy→Cy

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

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

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

CJNE A,#0DH,COMP SJMP DONECOMP: JB ACC.7,LOOP ;為負數(shù),則轉(zhuǎn)LOOP MOV @R0,A ;為整數(shù),送正數(shù)區(qū) INC R0 INC DPTR SJMPNEXTLOOP: MOV @R1,A ;送負數(shù) INC R1 INC DPTR SJMPNEXTDONE: SJMP$小結(jié):MCS-51指令集(五大類功能)數(shù)據(jù)傳送類指令(29條)算術(shù)運算類指令(24條)邏輯運算及移位類指令(24條)控制轉(zhuǎn)移類指令(17條)位操作(布爾操作)類指令(17條)內(nèi)部存儲器間傳送:(MOV——16條)外部數(shù)據(jù)存儲器RAM與累加器間傳送:(MOVX——4條)程序存儲器ROM向累加器傳送:(MOVC——2條)數(shù)據(jù)交換:(XCH,XCHD,SWAP——5條)堆棧操作:(PUSH,POP——2條)(一)數(shù)據(jù)傳送類指令(5種/29條)(二)算術(shù)運算類指令(6種/24條)加法運算(ADD——4條)帶進位加法運算(ADDC——4條)帶借位減法運算(SUBB——4條)加1/減1操作(INC,DEC——9條)單字節(jié)乘/除法運算(MUL,DIV——2條)十進制調(diào)整(DAA——1條)(三)邏輯運算及移位指令(5種/24條)邏輯與運算:(ANL——6條)邏輯或運算:(ORL——6條)邏輯異或運算:(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條)位邏輯與/或/非運算:(ANL,ORL,CPL——6條)位條件轉(zhuǎn)移:(JC,JNC,JB,JNB,JBC——5條)3.4MCS-51匯編語言程序設(shè)計匯編語言是面向機器硬件的語言,匯編語言程序設(shè)計是開發(fā)單片機應(yīng)用系統(tǒng)軟件的關(guān)鍵。要求程序設(shè)計者對89C51單片機具有很好的“軟、硬結(jié)合”的功底。

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

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

1.機器語言

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

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

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

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

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

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

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

JNBF0,$與如下指令是等價的:

HERE:JNBF0,HERE

再如:

HERE:SJMPHERE可寫為:

SJMP$(4)注釋字段

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

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

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

ORG 0000H LJMP MAIN

ORG 001BH LJMP INTT1

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

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

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

CPL P1.0;500ms到,對P1.0輸出求反

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

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

字符名稱EQU

溫馨提示

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

評論

0/150

提交評論