版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
匯編語言程序設(shè)計 4.1匯編語言基本概念按照語言的結(jié)構(gòu)及其功能可以分為三種:1.機(jī)器語言:機(jī)器語言是用二進(jìn)制代碼0和1表示指令和數(shù)據(jù)的最原始的程序設(shè)計語言。2.匯編語言:在匯編語言中,指令用助記符表示,地址、操作數(shù)可用標(biāo)號、符號地址及字符等形式來描述。3.高級語言:高級語言是接近于人的自然語言,面向過程而獨立于機(jī)器的通用語言。
匯編語言的語句結(jié)構(gòu)
1.匯編語言的指令類型MCS-51單片機(jī)匯編語言,包含兩類不同性質(zhì)的指令。(1)基本指令:即指令系統(tǒng)中的指令。它們都是機(jī)器能夠執(zhí)行的指令,每一條指令都有對應(yīng)的機(jī)器碼。(2)偽指令:匯編時用于控制匯編的指令。它們都是機(jī)器不執(zhí)行的指令,無機(jī)器碼。2.匯編語言的語句格式匯編語言源程序是由匯編語句(即指令)組成的。匯編語言一般由四部分組成。其典型的匯編語句格式如下:
[標(biāo)號:]操作碼[目的操作數(shù)][,源操作數(shù)][;注釋]
START: MOV A,30H ;A←(30H)
(1)標(biāo)號位于語句的開始,代表該語句的地址;由1~8個字母和數(shù)字組成,必須以字母打頭,以冒號結(jié)束,不能使用指令助記符、偽指令或寄存器名。
(2)操作碼即指令的助記符,表示具體執(zhí)行的操作,不可省略。(3)操作數(shù)操作數(shù)與操作碼之間用空格分開。源操作數(shù)與目的操作數(shù)之間用逗號分開,必須滿足尋址方式的規(guī)定。(4)注釋對程序的必要說明,注釋與操作數(shù)之間用分號隔開?!讨噶钪幸訟—F
開頭的十六進(jìn)制數(shù)前必須添一個“0”?!潭M(jìn)制數(shù)必須帶后綴“B”或“b”;十六進(jìn)制數(shù)必須帶后綴“H”或“h”;十進(jìn)制數(shù)的后綴是“D”或“d”或無?!藼CD碼:用二進(jìn)制數(shù)表達(dá)的十進(jìn)制數(shù)。(0~9表示為:0000~1001B后綴:B/b,H/h)偽指令 匯編程序:匯編語言編寫的程序借助編譯工具編譯成為目標(biāo)代碼,計算機(jī)才能識別。這個編譯工具稱為匯編程序。
指令:告訴計算機(jī)如何操作以及做何種操作。
偽指令:告訴匯編程序在翻譯應(yīng)用程序時有何具體約定。偽指令不進(jìn)行具體的操作,那是真指令的事。比如:從何處開始,何處結(jié)束,某些編程者自己規(guī)定的表述代表什么意思……匯編程序的常用偽指令偽指令DB、DW都只對程序存儲器起作用,它們不能對數(shù)據(jù)存儲器初始化。可用DB、DW在程序存儲器定義數(shù)據(jù)表格,DW還能定義一個地址表。字符名稱4.2匯編語言程序設(shè)計4.2.1匯編語言程序設(shè)計步驟4.2.2順序程序4.2.3分支程序4.2.4循環(huán)程序4.2.5子程序
4.2.1匯編語方程序設(shè)計步驟1.分析問題2.確定算法3.設(shè)計程序流程圖4.分配內(nèi)存單元5.編寫匯編語言源程序6.調(diào)試程序4.2.2順序程序
順序程序是一種最簡單,最基本的程序。特點:程序按編寫的順序依次往下執(zhí)行每一條指令,直到最后一條。
【例】將30H單元內(nèi)的兩位BCD碼拆開并轉(zhuǎn)換成ASCII碼,存入RAM兩個單元中。程序流程如圖所示。參考程序如下:結(jié)束取數(shù)據(jù)低4位轉(zhuǎn)換成ASCII碼存ASCII碼取數(shù)據(jù)高4位轉(zhuǎn)換成ASCII碼存ASCII碼開始ORG 2000HMOV A,30H ;取值
ANL A,#0FH ;取低4位
ADD A,#30H ;轉(zhuǎn)換成ASCII碼
MOV 32H,A ;保存結(jié)果
MOV A,30H ;取值
SWAP A ;高4位與低4位互換
ANL A,#0FH ;取低4位(原來的高4位)
ADD A,#30H ;轉(zhuǎn)換成ASCII碼
MOV 31H,A ;保存結(jié)果
SJMP $END【例】設(shè)X、Y兩個小于10的整數(shù)分別存于片內(nèi)30H、31H單元,試求兩數(shù)的平方和并將結(jié)果存于32H單元。解:兩數(shù)均小于10,故兩數(shù)的平方和小于100,可利用乘法指令求平方。程序流程如圖所示。參考程序如下:結(jié)束取數(shù)據(jù)X求X2暫存X2取數(shù)據(jù)Y求Y2求X2+Y2開始保存平方和
ORG 2000HMOV A,30H ;取30H單元數(shù)據(jù)MOV B,A ;將X送入B寄存器MUL AB ;求X2,結(jié)果在累加器中MOV R1,A ;將結(jié)果暫存于R1寄存器中MOV A,31H ;取31H單元數(shù)據(jù)MOV B,A ;將Y送入B寄存器MUL AB ;求Y2,結(jié)果在累加器中ADD A,R1 ;求X2+Y2MOV 32H,A ;保存數(shù)據(jù)SJMP $ ;暫停END4.2.3分支程序
1.分支程序的基本形式分支程序有三種基本形式,如圖所示。分支程序的設(shè)計要點如下:(1)先建立可供條件轉(zhuǎn)移指令測試的條件。(2)選用合適的條件轉(zhuǎn)移指令。(3)在轉(zhuǎn)移的目的地址處設(shè)定標(biāo)號。條件滿足?AYN(a)條件滿足?ABNY(b)(c)A0A1AnK=0K=1…K=nK=?……分支程序結(jié)構(gòu)流程圖2.雙向分支程序設(shè)計舉例【例】設(shè)X存在30H單元中,根據(jù)下式
X+2X>0Y=100X=0求出Y值,將Y值存入31H單元。
∣X∣X<0解:根據(jù)數(shù)據(jù)的符號位判別該數(shù)的正負(fù),若最高位為0,再判別該數(shù)是否為0。程序流程如圖所示。
A為負(fù)數(shù)?取數(shù),A←(30H)開始結(jié)束A=0?YNNA←|X|A←64HA←X+2存數(shù),(31H)←A(30H)參考程序如下:
ORG 1000HMOV A,30H ;取數(shù)
JBACC.7,NEG;負(fù)數(shù),轉(zhuǎn)NEGJZZER0 ;為零,轉(zhuǎn)ZER0ADD A,#02H ;為正數(shù),求X+2AJMPSAVE;轉(zhuǎn)到SAVE,保存數(shù)據(jù)ZER0:MOV A,#64H ;數(shù)據(jù)為零,Y=100AJMPSAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)
NEG:DECA;
CPLA ;求∣X∣SAVE:MOV 31H,A;保存數(shù)據(jù)
SJMP$ ;暫停
END3.多向分支程序設(shè)計舉例【例】根據(jù)R0的值轉(zhuǎn)向7個分支程序。R0<10,轉(zhuǎn)向SUB0;R0<20,轉(zhuǎn)向SUB1;
R0<60,轉(zhuǎn)向SUB5;R0<70,轉(zhuǎn)向SUB6;解:利用JMP@A+DPTR指令直接給PC賦值,使程序?qū)崿F(xiàn)轉(zhuǎn)移。程序流程如圖所示。K=?轉(zhuǎn)SUB0轉(zhuǎn)SUB1轉(zhuǎn)SUB6K=0K=1……K=6開始多向分支程序流程圖參考程序:ORG2000H MOVDPTR,#TAB;轉(zhuǎn)移指令表首地址
MOVA,R0 ;取數(shù)
MOVB,#10 DIV AB;A/10,商在A中
CLR C RLCA;A←2A,A中的值為偏移量,
AJMP指令占2個字節(jié)
JMP@A+DPTR ;PC←A+DPTRTAB:AJMPSUB0 ;轉(zhuǎn)移指令表
AJMPSUB1AJMPSUB2
…AJMPSUB64.2.4循環(huán)程序 1.循環(huán)程序的結(jié)構(gòu)(如圖4-6所示)循環(huán)程序一般包括如下四個部分:(1)初始化(2)循環(huán)體(3)循環(huán)控制(4)結(jié)束☆循環(huán)程序按結(jié)構(gòu)形式,有單重循環(huán)與多重循環(huán)?!钤诙嘀匮h(huán)中,只允許外重循環(huán)嵌套內(nèi)重循環(huán)。☆不允許循環(huán)相互交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部(如圖4-7所示)。(a)當(dāng)型循環(huán)結(jié)構(gòu)(b)直到型循環(huán)結(jié)構(gòu)循環(huán)結(jié)束?循環(huán)體YN初始化修改循環(huán)參數(shù)結(jié)束部分開始結(jié)束循環(huán)結(jié)束?循環(huán)體Y初始化修改循環(huán)參數(shù)結(jié)束部分開始N結(jié)束圖4-6循環(huán)結(jié)構(gòu)程序流程圖外循環(huán)中循環(huán)內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)內(nèi)循環(huán)(a)嵌套正確(b)嵌套正確(c)交叉不正確圖4-7多重循環(huán)示意圖2.循環(huán)程序設(shè)計舉例【例】有一數(shù)據(jù)塊從片內(nèi)RAM的30H單元開始存入,設(shè)數(shù)據(jù)塊長度為10個單元。根據(jù)下式:
X+2 X>0Y=100X=0求出Y值,并將Y值放回原處。
∣X∣X<0解:設(shè)置一個計數(shù)器控制循環(huán)次數(shù),每處理完一個數(shù)據(jù),計數(shù)器減1。程序流程如圖所示。A=0?YYNNYNA為負(fù)數(shù)?取數(shù),A←((R1))開始結(jié)束A←∣X∣A←64HA←X+2存數(shù),((R1))←A(30H)設(shè)置地址指針R1、計數(shù)器R0初值R1←R1+1;R0←R0-1R0=0?參考程序:
ORG 2000H MOV R0,#10MOV R1,#30HSTART:MOV A,@R1 ;取數(shù)
JB ACC.7,NEG ;若為負(fù)數(shù),轉(zhuǎn)NEG JZ ZER0 ;若為零,轉(zhuǎn)ZER0 ADD A,#02H ;若為正數(shù),求X+2 AJMP SAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)
ZER0:MOV A,#64H ;數(shù)據(jù)為零,Y=100AJMP SAVE ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)
NEG:DEC ACPL A ;求∣X∣SAVE:MOV @R1,A ;保存數(shù)據(jù)
INC R1 ;地址指針指向下一個地址
DJNZ R0,START;數(shù)據(jù)未處理完,繼續(xù)處理
SJMP $ ;暫停4.2.5子程序
1.子程序概念所謂調(diào)用子程序,暫時中斷主程序的執(zhí)行,而轉(zhuǎn)到子程序的入口地址去執(zhí)行子程序。如圖所示。RETLCALLSUB子程序的調(diào)用與返回調(diào)用子程序應(yīng)注意:(1)子程序占用的存儲單元和寄存器。(2)參數(shù)的傳遞。(3)子程序經(jīng)過調(diào)用后得到的數(shù)據(jù)來完成程序之間的參數(shù)傳遞。
(4)嵌套調(diào)用與遞歸調(diào)用。如圖所示。LCALLARETRETLCALLB子程序的嵌套調(diào)用與返回2.子程序設(shè)計舉例【例】有一數(shù)據(jù)塊從片內(nèi)RAM的30H單元開始存入,設(shè)數(shù)據(jù)塊長度為10個單元。根據(jù)下式:
X+2 X>0Y=100X=0求出Y值,并將Y值放回原處。
∣X∣X<0解:數(shù)據(jù)塊中的十個數(shù)都需要進(jìn)行符號判斷并作相應(yīng)處理,可把一部分工作交給子程序完成,主程序只負(fù)責(zé)讀取數(shù)據(jù)、調(diào)用判斷處理子程序、保存數(shù)據(jù)、循環(huán)控制工作。源程序如下:
ORG0000H MOVR0,#10 MOV R1,#30HSTART:MOV A,@R1 ;取數(shù)
ACALL DISPOSE ;調(diào)用判斷、處理子程序SAVE:MOV @R1,A ;保存數(shù)據(jù)
INC R1 ;修改地址指針,指向下一個地址
DJNZ R0,START ;數(shù)據(jù)未處理完,繼續(xù)處理
SJMP $ ;暫停
ORG 0200HDISPOSE:JB ACC.7,NEG ;若為負(fù)數(shù),轉(zhuǎn)NEGJZ ZER0 ;若為零,轉(zhuǎn)ZER0ADD A,#02H ;若為正數(shù),求X+2AJMP BACK ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)
ZER0:MOV A,#64H ;數(shù)據(jù)為零,Y=100AJMP BACK ;轉(zhuǎn)到SAVE,保存數(shù)據(jù)
NEG:DEC ACPL A ;求∣X∣BACK:RET**80C51的程序設(shè)計
*4.1
程序編制的方法和技巧
4.1.1程序編制的步驟
一、預(yù)完成任務(wù)的分析首先,要對單片機(jī)應(yīng)用系統(tǒng)預(yù)完成的任務(wù)進(jìn)行深入的分析,明確系統(tǒng)的設(shè)計任務(wù)、功能要求和技術(shù)指標(biāo)。其次,要對系統(tǒng)的硬件資源和工作環(huán)境進(jìn)行分析。這是單片機(jī)應(yīng)用系統(tǒng)程序設(shè)計的基礎(chǔ)和條件。
*二、進(jìn)行算法的優(yōu)化
算法是解決具體問題的方法。一個應(yīng)用系統(tǒng)經(jīng)過分析、研究和明確規(guī)定后,對應(yīng)實現(xiàn)的功能和技術(shù)指標(biāo)可以利用嚴(yán)密的數(shù)學(xué)方法或數(shù)學(xué)模型來描述,從而把一個實際問題轉(zhuǎn)化成由計算機(jī)進(jìn)行處理的問題。同一個問題的算法可以有多種,結(jié)果也可能不盡相同,所以,應(yīng)對各種算法進(jìn)行分析比較,并進(jìn)行合理的優(yōu)化。比如,用迭代法解微分方程,需要考慮收斂速度的快慢(即在一定的時間里能否達(dá)到精度要求)。而有的問題則受內(nèi)存容量的限制而對時間要求并不苛刻。對于后一種情況,速度不快但節(jié)省內(nèi)存的算法則應(yīng)是首選。*三、程序總體設(shè)計及流程圖繪制經(jīng)過任務(wù)分析、算法優(yōu)化后,就可以進(jìn)行程序的總體構(gòu)思,確定程序的結(jié)構(gòu)和數(shù)據(jù)形式,并考慮資源的分配和參數(shù)的計算等。然后根據(jù)程序運(yùn)行的過程,勾畫出程序執(zhí)行的邏輯順序,用圖形符號將總體設(shè)計思路及程序流向繪制在平面圖上,從而使程序的結(jié)構(gòu)關(guān)系直觀明了,便于檢查和修改。*清晰正確的流程圖是編制正確無誤的應(yīng)用程序的基礎(chǔ)和條件。所以,繪制一個好的流程圖,是程序設(shè)計的一項重要內(nèi)容。流程圖可以分為總流程圖和局部流程圖??偭鞒虉D側(cè)重反映程序的邏輯結(jié)構(gòu)和各程序模塊之間的相互關(guān)系。局部流程圖反映程序模塊的具體實施細(xì)節(jié)。對于簡單的應(yīng)用程序,可以不畫流程圖。但是當(dāng)程序較為復(fù)雜時,繪制流程圖是一個良好的編程習(xí)慣。*常用的流程圖符號有:開始和結(jié)束符號、工作任務(wù)符號、判斷分支符號、程序連接符號、程序流向符號等
*4.1.2編制程序的方法和技巧
一、采用模塊化程序設(shè)計方法應(yīng)用系統(tǒng)的程序一般由包含多個模塊的主程序和各種子程序組成。各程序模塊都要完成一個明確的任務(wù),實現(xiàn)某個具體的功能,如:發(fā)送、接收、延時、打印和顯示等。采用模塊化的程序設(shè)計方法,就是將這些不同的具體功能程序進(jìn)行獨立的設(shè)計和分別調(diào)試,最后將這些模塊程序裝配成整體程序并進(jìn)行聯(lián)調(diào)。模塊化的程序設(shè)計方法具有明顯的優(yōu)點。把一個多功能的復(fù)雜的程序劃分為若干個簡單的、功能單一的程序模塊,有利于程序的設(shè)計和調(diào)試,有利于程序的優(yōu)化和分工,提高了程序的閱讀性和可靠性,使程序的結(jié)構(gòu)層次一目了然。
*二、盡量采用循環(huán)結(jié)構(gòu)和子程序采用循環(huán)結(jié)構(gòu)和子程序可以使程序的長度減少、占用內(nèi)存空間減少。多重循環(huán),注意各重循環(huán)的初值和循環(huán)結(jié)束條件,避免出現(xiàn)“死循環(huán)”現(xiàn)象;通用的子程序,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其它寄存器的內(nèi)容應(yīng)壓入堆棧進(jìn)行現(xiàn)場保護(hù),并要特別注意堆棧操作的壓入和彈出的平衡;中斷處理子程序除了要保護(hù)程序中用到的寄存器外,還應(yīng)保護(hù)標(biāo)志寄存器。*4.1.3匯編語言的語句格式
語句行由四個字段組成:
[標(biāo)號:]操作碼[操作數(shù)][;注釋]
括號內(nèi)的部分可以根據(jù)實際情況取舍。每個字段之間要用分隔符分隔,可以用作分隔符的符號有空格、冒號、逗號、分號等。如:LOOP:MOVA,#7FH;A←7FH*一、標(biāo)號標(biāo)號是語句地址的標(biāo)志符號,用于引導(dǎo)對該語句的非順序訪問。有關(guān)標(biāo)號的規(guī)定為:標(biāo)號由1~8個ASCII字符組成。第一個字符必須是字母,其余字符可以是字母、數(shù)字或其他特定字符;不能使用該匯編語言已經(jīng)定義了的符號作為標(biāo)號。如指令助記符、寄存器符號名稱等;標(biāo)號后邊必須跟冒號。二、操作碼操作碼用于規(guī)定語句執(zhí)行的操作。它是匯編語句中唯一不能空缺的部分。它由指令助記符表示。
*三、操作數(shù)操作數(shù)用于給指令的操作提供數(shù)據(jù)或地址。在一條匯編語句中操作數(shù)可能是空缺的,也可能包括一項,還可能包括兩項或三項。各操作數(shù)間以逗號分隔。操作數(shù)字段的內(nèi)容可能包括以下幾種情況:(1)工作寄存器名;(2)特殊功能寄存器名;(3)標(biāo)號名;(4)常數(shù);(5)符號“$”,表示程序計數(shù)器PC的當(dāng)前值;(6)表達(dá)式。*四、注釋注釋不屬于匯編語句的功能部分,它只是對語句的說明。注釋字段可以增加程序的可讀性,有助于編程人員的閱讀和維護(hù)。注釋字段必須以分號“;”開頭,長度不限,當(dāng)一行書寫不下時,可以換行接著書寫,但換行時應(yīng)注意在開頭使用分號“;”。五、數(shù)據(jù)的表示形式80C51匯編語言的數(shù)據(jù)可以有以下幾種表示形式:二進(jìn)制數(shù),末尾以字母B標(biāo)識。如:10001111B;十進(jìn)制數(shù),末尾以字母D標(biāo)識或?qū)⒆帜窪省略。如:88D,66;十六進(jìn)制數(shù),末尾以字母H標(biāo)識。如:78H,0A8H(但應(yīng)注意的是,十六進(jìn)制數(shù)以字母A~F開頭時應(yīng)在其前面加上數(shù)字“0”。);ASCII碼,以單引號括起來標(biāo)識。如:‘AB’,‘1245’
*4.2源程序的編輯和匯編
一、源程序的編輯源程序的編寫要依據(jù)80C51匯編語言的基本規(guī)則,特別要用好常用的匯編命令(即偽指令),例如下面的程序段:
ORG0040HMOVA,#7FHMOVR1,#44HEND
這里的ORG和END是兩條偽指令,其作用是告訴匯編程序此匯編源程序的起止位置。編輯好的源程序應(yīng)以“.ASM”擴(kuò)展名存盤,以備匯編程序調(diào)用。
4.2.1源程序的編輯與匯編
*二、源程序的匯編
將匯編語言源程序轉(zhuǎn)換為單片機(jī)能執(zhí)行的機(jī)器碼形式的目標(biāo)程序的過程叫匯編。常用的方法有兩種:手工匯編時,把程序用助記符指令寫出后,通過手工方式查指令編碼表,逐個把助記符指令翻譯成機(jī)器碼,然后把得到的機(jī)器碼程序(以十六進(jìn)制形式)鍵入到單片機(jī)開發(fā)機(jī)中,并進(jìn)行調(diào)試。機(jī)器匯編是在常用的個人計算機(jī)PC上,使用交叉匯編程序?qū)R編語言源程序轉(zhuǎn)換為機(jī)器碼形式的目標(biāo)程序。匯編工作由計算機(jī)完成,生成的目標(biāo)程序由PC機(jī)傳送到開發(fā)機(jī)上,經(jīng)調(diào)試無誤后,再固化到單片機(jī)的程序存儲器ROM中。*
源程序經(jīng)過機(jī)器匯編后,形成的若干文件中含有兩個主要文件,一是列表文件,另一個是目標(biāo)碼文件。因匯編軟件的不同,文件的格式及信息會有一些不同。但主要信息如下:列表文件主要信息為:地址目標(biāo)碼匯編程序
ORG0040H0040H747FMOVA,#7FH0042H7944MOVR1,#44HEND目標(biāo)碼文件主要信息為:首地址末地址目標(biāo)碼0040H0044H747F7944*
偽指令是匯編程序能夠識別并對匯編過程進(jìn)行某種控制的匯編命令。它不是單片機(jī)執(zhí)行的指令,所以沒有對應(yīng)的可執(zhí)行目標(biāo)碼,匯編后產(chǎn)生的目標(biāo)程序中不會再出現(xiàn)偽指令。一、起始地址設(shè)定偽指令ORG格式為:ORG表達(dá)式該指令的功能是向匯編程序說明下面緊接的程序段或數(shù)據(jù)段存放的起始地址。表達(dá)式通常為16進(jìn)制地址,也可以是已定義的標(biāo)號地址。
4.2.2偽指令
*ORG8000HSTART:MOVA,#30H……
此時規(guī)定該段程序的機(jī)器碼從地址8000H單元開始存放。在每一個匯編語言源程序的開始,都要設(shè)置一條ORG偽指令來指定該程序在存儲器中存放的起始位置。若省略O(shè)RG偽指令,則該程序段從0000H單元開始存放。在一個源程序中,可以多次使用ORG偽指令規(guī)定不同程序段或數(shù)據(jù)段存放的起始地址,但要求地址值由小到大依序排列,不允許空間重疊。*二、匯編結(jié)束偽指令END格式為:END該指令的功能是結(jié)束匯編。匯編程序遇到END偽指令后即結(jié)束匯編。處于END之后的程序,匯編程序?qū)⒉惶幚怼?三、字節(jié)數(shù)據(jù)定義偽指令DB[標(biāo)號:]DB字節(jié)數(shù)據(jù)表功能是從標(biāo)號指定的地址開始,在ROM中定義字節(jié)數(shù)據(jù)。字節(jié)數(shù)據(jù)表可以是一個或多個字節(jié)數(shù)據(jù)、字符串或表達(dá)式。該偽指令將字節(jié)數(shù)據(jù)表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲單元中。一個數(shù)據(jù)占一個存儲單元。例如:DB“howareyou?”把字符串中的字符以ASCII碼的形式存放在連續(xù)的ROM單元中。又如:DB-2,-4,-6,8,10,18把6個數(shù)轉(zhuǎn)換為十六進(jìn)制表示(FEH,F(xiàn)CH,F(xiàn)AH,08H,0AH,12H),并連續(xù)地存放在6個ROM。
*該偽指令常用于存放數(shù)據(jù)表格。如要存放顯示用的十六進(jìn)制的字形碼,可以用多條DB指令完成:
DB0C0H,0F9H,0A4H,0B0HDB99H,92H,82H,0F8HDB80H,90H,88H,83HDBC6H,A1H,86H,84H*四、字?jǐn)?shù)據(jù)定義偽指令DW[標(biāo)號:]DW字?jǐn)?shù)據(jù)表功能是從標(biāo)號指定的地址單元開始,在程序存儲器中定義字?jǐn)?shù)據(jù)。該偽指令將字或字表中的數(shù)據(jù)根據(jù)從左到右的順序依次存放在指定的存儲單元中。應(yīng)特別注意:16位的二進(jìn)制數(shù),高8位存放在低地址單元,低8位存放在高地址單元。例如:
ORG1400HDATA:DW324AH,3CH……
匯編后,(1400H)=32H,(1401H)=4AH,(1402H)=00H,(1403H)=3CH。*五、空間定義偽指令DS[標(biāo)號:]DS表達(dá)式功能是從標(biāo)號指定的地址單元開始,在程序存儲器中保留由表達(dá)式所指定的個數(shù)的存儲單元作為備用的空間,并都填以零值。例如:
ORG3000HBUF:DS50……匯編后,從地址3000H開始保留50個存儲單元作為備用單元。
*六、賦值偽指令EQU符號名EQU表達(dá)式功能是將表達(dá)式的值或特定的某個匯編符號定義為一個指定的符號名。例如:
LENEQU10SUMEQU21HBLOCKEQU22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,AEND該程序的功能是,把BLOCK單元開始存放的10個無符號數(shù)進(jìn)行求和,并將結(jié)果存入SUM單元中。*七、位地址符號定義偽指令BIT格式為:符號名BIT位地址表達(dá)式功能是將位地址賦給指定的符號名。其中,位地址表達(dá)式可以是絕對地址,也可以是符號地址。例如:
STBITP1.0將P1.0的位地址賦給符號名ST,在其后的編程中就可以用ST來代替P1.0。*4.3基本程序結(jié)構(gòu)
4.3.1順序程序順序程序是指無分支、無循環(huán)結(jié)構(gòu)的程序。其執(zhí)行流程是依指令在存儲器中的存放順序進(jìn)行的。一、數(shù)據(jù)傳送例內(nèi)部RAM的2AH~2EH單元中存儲的數(shù)據(jù)如圖所示。試編寫程序?qū)崿F(xiàn)圖示的數(shù)據(jù)傳送結(jié)果。
*方法一:MOVA,2EH;2字節(jié),1個機(jī)器周期MOV2EH,2DH;3字節(jié),2個機(jī)器周期MOV2DH,2CH;3字節(jié),2個機(jī)器周期MOV2CH,2BH;3字節(jié),2個機(jī)器周期MOV2BH,#00H;3字節(jié),2個機(jī)器周期*方法二:CLRA;1字節(jié),1個機(jī)器周期XCHA,2BH;2字節(jié),1個機(jī)器周期XCHA,2CH;2字節(jié),1個機(jī)器周期XCHA,2DH;2字節(jié),1個機(jī)器周期XCHA,2EH;2字節(jié),1個機(jī)器周期以上兩種方法均可以實現(xiàn)所要求的傳送任務(wù)。方法一使用14個字節(jié)的指令代碼,執(zhí)行時間為9個機(jī)器周期;方法二僅用了9個字節(jié)的代碼,執(zhí)行時間也減少到了5個機(jī)器周期。實際應(yīng)用中應(yīng)盡量采用指令代碼字節(jié)數(shù)少、執(zhí)行時間短的高效率程序,即注意程序的優(yōu)化。*
例有一變量存放在片內(nèi)RAM的20H單元,其取值范圍為:00H~05H。要求編制一段程序,根據(jù)變量值求其平方值,并存入片內(nèi)RAM的21H單元。程序如下:
ORG1000HSTART:MOVDPTR,#2000HMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$ORG2000HTABLE:DB00,01,04,09,16,25END。
*在程序存儲器的一片存儲單元中建立起該變量的平方表。用數(shù)據(jù)指針DPTR指向平方表的首址,則變量與數(shù)據(jù)指針之和的地址單元中的內(nèi)容就是變量的平方值。采樣MOVCA,@A+PC指令也可以實現(xiàn)查表功能,且不破壞DPTR的內(nèi)容,從而可以減少保護(hù)DPTR的內(nèi)容所需的開銷。但表格只能存放在MOVCA,@A+PC指令后的256字節(jié)內(nèi),即表格存放的地點和空間有一定限制。
*
三、簡單運(yùn)算由于80C51指令系統(tǒng)中只有單字節(jié)加法指令,因此對于多字節(jié)的相加運(yùn)算必須從低位字節(jié)開始分字節(jié)進(jìn)行。除最低字節(jié)可以使用ADD指令外,其他字節(jié)相加時要把低字節(jié)的進(jìn)位考慮進(jìn)去,這時就應(yīng)該使用ADDC指令。例雙字節(jié)無符號數(shù)加法。設(shè)被加數(shù)存放在內(nèi)部RAM的51H、50H單元,加數(shù)存放在內(nèi)部RAM的61H、60H單元,相加的結(jié)果存放在內(nèi)部RAM的51H、50H單元,進(jìn)位存放在位尋址區(qū)的00H位中。
*
程序段如下:MOVR0,#50H;被加數(shù)的低字節(jié)地址 MOVR1,#60H;加數(shù)的低字節(jié)地址 MOVA,@R0;取被加數(shù)低字節(jié)ADDA,@R1;加上加數(shù)低字節(jié)MOV@R0,A;保存低字節(jié)相加結(jié)果INCR0;指向被加數(shù)高字節(jié)INCR1;指向加數(shù)高字節(jié)MOVA,@R0;取被加數(shù)高字節(jié)ADDCA,@R1;加上加數(shù)高字節(jié)(帶進(jìn)位加)MOV@R0,A;存高字節(jié)相加結(jié)果MOV00H,C;保存進(jìn)位。
*
4.3.2分支程序
分支結(jié)構(gòu)可以分成單分支、雙分支和多分支幾種情況:*一、單分支程序例求雙字節(jié)補(bǔ)碼。設(shè)在內(nèi)部RAM的addr1和addr+1單元存有一個雙字節(jié)數(shù)(高位字節(jié)存于高地址單元)。編寫程序?qū)⑵渥x出取補(bǔ)后再存入addr2和addr2+1單元。首先對低字節(jié)取補(bǔ),然后判其結(jié)果是否為全“0”。若是,則高字節(jié)取補(bǔ),否則高字節(jié)取反。
*START:MOVR0,#addr1;原碼低字節(jié)地址送R0 MOVR1,#addr2;補(bǔ)碼低字節(jié)地址送R1 MOVA,@R0;原碼低字節(jié)送A CPLA;A內(nèi)容取補(bǔ)
INCAMOV@R1,A;存補(bǔ)碼低字節(jié)
INCR0;調(diào)整地址,指向下一單元
INCR1JZZERO;(A)=0時轉(zhuǎn)ZEROMOVA,@R0;原碼高字節(jié)送A CPLAMOV@R1,A;高字節(jié)反碼存入addr2+1單元
SJMPLOOP1ZERO:MOVA,@R0;高字節(jié)取補(bǔ)存入addr2+1單元
CPLAINCAMOV@R1,ALOOP1:RET*二、雙分支程序例設(shè)變量x以補(bǔ)碼的形式存放在片內(nèi)RAM的30H單元,變量y與x的關(guān)系是:當(dāng)x大于0時,y=x;當(dāng)x=0時,y=20H;當(dāng)x小于0時,y=x+5。編制程序,根據(jù)x的大小求y并送回原單元。程序段如下:START:MOVA,30HJZNEXTANLA,#80H;判斷符號位
JZLPMOVA,#05HADDA,30HMOV30H,ASJMPLPNEXT:MOV30H,#20HLP:SJMP$
*三、多分支程序例根據(jù)R7的內(nèi)容轉(zhuǎn)向相應(yīng)的處理程序。設(shè)R7的內(nèi)容為0~N,對應(yīng)的處理程序的入口地址分別為PP0~PPN。程序段如下:START:MOVDPTR,#TAB;置分支入口地址表首址
MOVA,R7;分支轉(zhuǎn)移序號送AADDA,R7;分支轉(zhuǎn)移序號乘以2MOVR3,A;暫存于R3MOVCA,@A+DPTR;取高位地址
XCHA,R3INCAMOVCA,@A+DPTR;取低位地址
MOVDPL,A;處理程序入口地址低8位送DPLMOVDPH,R3;處理程序入口地址高8位送DPLCLRAJMP@A+DPTRTAB:DWPP0DWPP1………DWPPN
*4.3.3循環(huán)程序
按某種控制規(guī)律重復(fù)執(zhí)行的程序稱為循環(huán)程序。循環(huán)程序有先執(zhí)行后判斷和先判斷后執(zhí)行兩種基本結(jié)構(gòu):
*一、先執(zhí)行后判斷例50ms延時程序。若晶振頻率為12MHz,則一個機(jī)器周期為1μs。執(zhí)行一條DJNZ指令需要2個機(jī)器周期,即2μs。采用循環(huán)計數(shù)法實現(xiàn)延時,循環(huán)次數(shù)可以通過計算獲得,并選擇先執(zhí)行后判斷的循環(huán)結(jié)構(gòu)。程序段如下:
DEL:MOVR7,#200;1μsDEL1:MOVR6,#123;1μsNOP ;1μsDEL2:DJNZR6,DEL2;2μs,計(2×123)μsDJNZR7,DEL1;2μs,
RET
共計[(2×123+2+2)×200+1]μs,即50.001ms
*例無符號數(shù)排序程序。在片內(nèi)RAM中,起始地址為30H的8個單元中存放有8個無符號數(shù)。試對這些無符號數(shù)進(jìn)行升序排序。數(shù)據(jù)排序常用的方法是冒泡排序法。執(zhí)行時從前向后進(jìn)行相鄰數(shù)的比較,如數(shù)據(jù)的大小次序與要求的順序不符就將這兩個數(shù)互換,否則不互換。對于升序排序,通過這種相鄰數(shù)的互換,使小數(shù)向前移動,大數(shù)向后移動。從前向后進(jìn)行一次冒泡(相鄰數(shù)的互換),就會把最大的數(shù)換到最后。再進(jìn)行一次冒泡,就會把次大的數(shù)排在倒數(shù)第二的位置。設(shè)R7為比較次數(shù)計數(shù)器,初始值為07H,位地址00H為數(shù)據(jù)互換標(biāo)志位。
*START:CLR00H;互換標(biāo)志清0 MOVR7,#07H;各次冒泡比較次數(shù)
MOVR0,#30H;數(shù)據(jù)區(qū)首址
LOOP:MOVA,@R0;取前數(shù)
MOV2BH,A;暫存
INCR0MOV2AH,@R0;取后數(shù)
CLRCSUBBA,@R0;前數(shù)減后數(shù)
JCNEXT;前數(shù)小于后數(shù),不互換
MOV@R0,2BHDECR0MOV@R0,2AH;兩數(shù)交換
INCR0;準(zhǔn)備下一次比較
SETB00H;置互換標(biāo)志
NEXT:DJNZR7,LOOP;進(jìn)行下一次比較
JB00H,START;進(jìn)行下一輪冒泡
SJMP$*二、先判斷后執(zhí)行例將內(nèi)部RAM中起始地址為data的數(shù)據(jù)串傳送到外部RAM中起始地址為buffer的存儲區(qū)域內(nèi),直到發(fā)現(xiàn)‘$’字符停止傳送。由于循環(huán)次數(shù)事先不知道,但循環(huán)條件可以測試到。所以,采用先判斷后執(zhí)行的結(jié)構(gòu)比較適宜。程序段如下:
MOVR0,#dataMOVDPTR,#bufferLOOP0:MOVA,@R0CJNEA,#24H,LOOP1;判斷是否為‘$’字符
SJMPLOOP2;是‘$’字符,轉(zhuǎn)結(jié)束LOOP1:MOVX@DPTR,A;不是‘$’字符,執(zhí)行傳送
INCR0INCDPTRSJMPLOOP0;傳送下一數(shù)據(jù)
LOOP2:……
*4.3.4子程序及其調(diào)用
一、子程序的調(diào)用在實際應(yīng)用中,經(jīng)常會遇到一些帶有通用性的問題,例如:數(shù)值轉(zhuǎn)換、數(shù)值計算等,在一個程序中可能要使用多次。這時可以將其設(shè)計成通用的子程序供隨時調(diào)用。子程序的結(jié)構(gòu)與一般的程序并無多大區(qū)別,它的主要特點是,在執(zhí)行過程中需要由其它程序來調(diào)用,執(zhí)行完后又需要把執(zhí)行流程返回到調(diào)用該子程序的主程序。子程序調(diào)用時要注意兩點:一是現(xiàn)場的保護(hù)和恢復(fù);二是主程序與子程序的參數(shù)傳遞。*二、現(xiàn)場保護(hù)與恢復(fù)在子程序執(zhí)行過程中常常要用到單片機(jī)的一些通用單元,如工作寄存器R0~R7、累加器A、數(shù)據(jù)指針DPTR,以及有關(guān)標(biāo)志和狀態(tài)等。而這些單元中的內(nèi)容在調(diào)用結(jié)束后的主程序中仍有用,所以需要進(jìn)行保護(hù),稱為現(xiàn)場保護(hù)。在執(zhí)行完子程序,返回繼續(xù)執(zhí)行主程序前恢復(fù)其原內(nèi)容,稱為現(xiàn)場恢復(fù)。保護(hù)與恢復(fù)的方法有以下兩種:在主程序中實現(xiàn);在子程序中實現(xiàn)。*
1、在主程序中實現(xiàn)示例如下:
PUSHPSW;保護(hù)現(xiàn)場
PUSHACC;
PUSHB;
MOVPSW,#10H;換當(dāng)前工作寄存器組
LCALLaddr16;子程序調(diào)用
POPB;恢復(fù)現(xiàn)場
POPACC;
POPPSW;
……
其特點是結(jié)構(gòu)靈活。*
2、在子程序中實現(xiàn)示例如下:SUB1:PUSHPSW;保護(hù)現(xiàn)場
PUSHACC;
PUSHB;
……MOVPSW,#10H;換當(dāng)前工作寄存器組
……POPB;恢復(fù)現(xiàn)場
POPACC;
POPPSW;
RET其特點是程序規(guī)范、清晰。注意,無論哪種方法保護(hù)與恢復(fù)的順序要對應(yīng)。*三、參數(shù)傳遞
由于子程序是主程序的一部分,所以,在程序的執(zhí)行時必然要發(fā)生數(shù)據(jù)上的聯(lián)系。在調(diào)用子程序時,主程序應(yīng)通過某種方式把有關(guān)參數(shù)(即子程序的入口參數(shù))傳給子程序,當(dāng)子程序執(zhí)行完畢后,又需要通過某種方式把有關(guān)參數(shù)(即子程序的出口參數(shù))傳給主程序。在80C51單片機(jī)中,傳遞參數(shù)的方法有三種:
1、利用累加器或寄存器在這種方式中,要把預(yù)傳遞的參數(shù)存放在累加器A或工作寄存器R0~R7中。即在主程序調(diào)用子程序時,應(yīng)事先把子程序需要的數(shù)據(jù)送入累加器A或指定的工作寄存器中,當(dāng)子程序執(zhí)行時,可以從指定的單元中取得數(shù)據(jù),執(zhí)行運(yùn)算。反之,子程序也可以用同樣的方法把結(jié)果傳送給主程序。*
例編寫程序,實現(xiàn)c=a2+b2。設(shè)a,b,c分別存于內(nèi)部RAM的30H,31H,32H三個單元中。程序段如下:START:MOVA,30H;取aACALLSQR;調(diào)用查平方表
MOVR1,A;a2暫存于R1中
MOVA,31H;取bACALLSQR;調(diào)用查平方表
ADDA,R1;a2+b2存于A中
MOV32H,A;存結(jié)果
SJMP$SQR:MOVDPTR,#TAB;子程序
MOVCA,@A+DPTR;
RETTAB:DB0,1,4,9,16,25,36,49,64,81
*
2、利用存儲器當(dāng)傳送的數(shù)據(jù)量比較大時,可以利用存儲器實現(xiàn)參數(shù)的傳遞。在這種方式中,事先要建立一個參數(shù)表,用指針指示參數(shù)表所在的位置。當(dāng)參數(shù)表建立在內(nèi)部RAM時,用R0或R1作參數(shù)表的指針。當(dāng)參數(shù)表建立在外部RAM時,用DPTR作參數(shù)表的指針。
例將R0和R1指向的內(nèi)部RAM中兩個3字節(jié)無符號整數(shù)相加,結(jié)果送到由R0指向的內(nèi)部RAM中。入口時,R0和R1分別指向加數(shù)和被加數(shù)的低位字節(jié);出口時,R0指向結(jié)果的高位字節(jié)。低字節(jié)在高地址,高字節(jié)在低地址。
*
實現(xiàn)程序:NADD:MOVR7,#3;三字節(jié)加法
CLRC;NADD1:MOVA,@R0;取加數(shù)低字節(jié)
ADDCA,@R1;被加數(shù)低字節(jié)加AMOV@R0,A;
DECR0DECR1DJNZR7,NADD1INCR0RET
*
3、利用堆棧利用堆棧傳遞參數(shù)是在子程序嵌套中常采用的一種方法。在調(diào)用子程序前,用PUSH指令將子程序中所需數(shù)據(jù)壓入堆棧,進(jìn)入執(zhí)行子程序時,再用POP指令從堆棧中彈出數(shù)據(jù)。
例把內(nèi)部RAM中20H單元中的1個字節(jié)十六進(jìn)制數(shù)轉(zhuǎn)換為2位ASCII碼,存放在R0指示的兩個單元中。
*
MAIN:MOVA,20H;
SWAPAPUSHACC;參數(shù)入棧
ACALLHEASCPOPACCMOV@R0,A;存高位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果
INCR0;修改指針
PUSH20H;參數(shù)入棧
ACALLHEASCPOPACCMOV@R0,A;存低位十六進(jìn)制數(shù)轉(zhuǎn)換結(jié)果
SJMP$HEASC:MOVR1,SP;借用R1為堆棧指針
DECR1DECR1;R1指向被轉(zhuǎn)換數(shù)據(jù)
XCHA,@R1;取被轉(zhuǎn)換數(shù)據(jù)
ANLA,#0FH;取一位十六進(jìn)制數(shù)
ADDA,#2;偏移量調(diào)整,所加值為MOVC與DB間字節(jié)數(shù)
MOVCA,@A+PC;查表
XCHA,@R1;1字節(jié)指令,存結(jié)果于堆棧
RET;1字節(jié)指令A(yù)SCTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H
*
一般說來:當(dāng)相互傳遞的數(shù)據(jù)較少時,采用寄存器傳遞方式可以獲得較快的傳遞速度;當(dāng)相互傳遞的數(shù)據(jù)較多時,宜采用存儲器或堆棧方式傳遞;如果是子程序嵌套時,最好是采用堆棧方式。*4.4常用程序舉例4.4.1算術(shù)運(yùn)算程序一、多字節(jié)數(shù)的加、減運(yùn)算
80C51單片機(jī)的指令系統(tǒng)提供的是字節(jié)運(yùn)算指令,所以在處理多字節(jié)數(shù)的加減運(yùn)算時,要合理地運(yùn)用進(jìn)位(借位)標(biāo)志。例多字節(jié)無符號數(shù)的加法。設(shè)兩個N字節(jié)的無符號數(shù)分別存放在內(nèi)部RAM中以DATA1和DATA2開始的單元中。相加后的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。*MOVR0,#DATA1;
MOVR1,#DATA2;
MOVR7,#N; 置字節(jié)數(shù)
CLRC;LOOP:MOVA,@R0;
ADDCA,@R1;求和
MOV@R1,A;存結(jié)果
INCR0;修改指針
INCR1;
DJNZR7,LOOP;*二、多字節(jié)數(shù)乘法運(yùn)算例雙字節(jié)無符號數(shù)的乘法。設(shè)雙字節(jié)的無符號被乘數(shù)存放在R3、R2中,乘數(shù)存放在R5、R4中,R0指向積的高位。
*例多字節(jié)無符號數(shù)的減法。
設(shè)兩個N字節(jié)的無符號數(shù)分別存放在內(nèi)部RAM中以DATA1和DATA2開始的單元中。相減后的結(jié)果要求存放在DATA2數(shù)據(jù)區(qū)。
MOVR0,#DATA1;
MOVR1,#DATA2;
MOVR7,#N;置字節(jié)數(shù)
CLRC;LOOP:MOVA,@R0;
SUBBA,@R1;求差
MOV@R1,A;存結(jié)果
INCR0;修改指針
INCR1;
DJNZR7,LOOP;*主程序段如下:MULTB:MOVR7,#04;結(jié)果單元清0LOOP:MOV@R0,#00H;
DJNZR7,LOOP;
DECR0ACALLBMUL;
SJMP$另有2段子程序:
BMULRADD(在BMUL中被調(diào)用)*先看子程序段:
RADD:ADDA,@R0;
MOV@R0,A;
MOVA,B;
INCR0;
ADDCA,@R0;
MOV@R0,A;
INCR0;
MOVA,@R0;
ADDCA,#00H;加進(jìn)位
MOV@R0,A;
RET*BMUL:MOVA,R2;
MOVB,R4;
MULAB;低位乘
ACALLRADD;
MOVA,R2;
MOVB,R5;
MULAB;交叉乘
DECR0;
ACALLRADD;
MOVA,R4;
MOVB,R3;
MULAB;交叉乘
DECR0;
DECR0;
ACALLRADD;
MOVA,R5;
MOVB,R3;
MULAB;高字節(jié)乘
DECR0;
ACALLRADD;
DECR0RET*一、十六進(jìn)制數(shù)與ASCII碼間的轉(zhuǎn)換
十六進(jìn)制數(shù)與ASCII碼的對應(yīng)關(guān)系如表所示。當(dāng)十六進(jìn)制數(shù)在0~9之間時,其對應(yīng)的ASCII碼值為該十六進(jìn)制數(shù)加30H;當(dāng)十六進(jìn)制數(shù)在A~F之間時,其對應(yīng)的ASCII碼值為該十六進(jìn)制數(shù)加37H。4.4.2碼型轉(zhuǎn)換
*例將1位十六進(jìn)制數(shù)轉(zhuǎn)換成相應(yīng)的ASCII碼。設(shè)十六進(jìn)制數(shù)存放在R0中,轉(zhuǎn)換后的ASCII碼存放于R2中。實現(xiàn)程序如下:HASC:MOVA,R0;取4位二進(jìn)制數(shù)
ANLA,#0FH;屏蔽掉高4位
PUSHACC;4位二進(jìn)制數(shù)入棧
CLRC;清進(jìn)(借)位位
SUBBA,#0AH;用借位位的狀態(tài)判斷該數(shù)在0~9還是A~F之間
POPACC;彈出原4位二進(jìn)制數(shù)
JCLOOP;借位位為1,跳轉(zhuǎn)至LOOPADDA,#07H;借位位為0,該數(shù)在A~F之間,加37HLOOP:ADDA,#30H;該數(shù)在0~9之間,加30HMOVR2,A;ASCII碼存于R2RET
*例將多位十六進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼。設(shè)地址指針R0指向十六進(jìn)制數(shù)低位,R2中存放字節(jié)數(shù),轉(zhuǎn)換后地址指針R0指向十六進(jìn)制數(shù)的高位。R1指向要存放的ASCII碼的高位地址。實現(xiàn)程序如下:*HTASC:MOVA,@R0;取低4位二進(jìn)制數(shù)
ANLA,#0FH;
ADDA,#15;偏移量修正
MOVCA,@A+PC;查表
MOV@R1,A;存ASCII碼
INCR1;
MOVA,@R0;取十六進(jìn)制高4位
SWAPAANLA,#0FH;
ADDA,#06H;偏移值修正
MOVCA,@A+PC;
MOV@R1,AINCR0;指向下一單元
INCR1;
DJNZR2,HTASC;字節(jié)數(shù)存于R2RETASCTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H*二、BCD碼與二進(jìn)制數(shù)之間的轉(zhuǎn)換在計算機(jī)中,十進(jìn)制數(shù)要用BCD碼來表示。通常,用四位二進(jìn)制數(shù)表示一位BCD碼,用1個字節(jié)表示2位BCD碼(稱為壓縮型BCD碼)。例雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼。設(shè)(R2R3)為雙字節(jié)二進(jìn)制數(shù),(R4R5R6)為轉(zhuǎn)換完的壓縮型BCD碼。十進(jìn)制數(shù)B與一個8位的二進(jìn)制數(shù)的關(guān)系可以表示為:
只要依十進(jìn)制運(yùn)算法則,將bi(i=7,6,……,1,0)按權(quán)相加,就可以得到對應(yīng)的十進(jìn)制數(shù)B。(逐次得到:b7×20;b7×21+b6×20;b7×22+b6×21+b5×20;…)。*DCDTH:CLRA;
MOVR4,A;R4清0MOVR5,A;R5清0MOVR6,A;R6清0MOVR7,#16;計數(shù)初值LOOP:CLRC;
MOVA,R3;
RLCA;
MOVR3,A;R3左移一位并送回
MOVA,R2;
RLCA;
MOVR2,A;R2左移一位并送回
MOVA,R6;
ADDCA,R6;
DAA;
MOVR6,A;(R6)乘2并調(diào)整后送回
MOVA,R5;
ADDCA,R5;
DAA;
MOVR5,A;(R5)乘2并調(diào)整后送回
MOVA,R4;
ADDCA,R4;
DAA;
MOVR4,A;(R4)乘2并調(diào)整后送回
DJNZR7,LOOP;
*思考題及習(xí)題1、80C51單片機(jī)匯編語言有何特點?2、利用80C51單片機(jī)匯編語言進(jìn)行程序設(shè)計的步驟如何?3、常用的程序結(jié)構(gòu)有哪幾種?特點如何?4、子程序調(diào)用時,參數(shù)的傳遞方法有哪幾種?5、什么是偽指令?常用的偽指令功能如何?6、設(shè)被加數(shù)存放在內(nèi)部RAM的20H、21H單元,加數(shù)存放在22H、23H單元,若要求和存放在24H、25H中,試編寫出16位數(shù)相加的程序。7、編寫一段程序,把外部RAM中1000H~1030H的內(nèi)容傳送到內(nèi)部RAM的30H~60H中。8、編寫程序,實現(xiàn)雙字節(jié)無符號數(shù)加法運(yùn)算,要求(R1R0)+(R7R6)→(61H60H)。*9、若80C51的晶振頻率為6MHz,試計算延時子程序的延時時間。。DELAY:MOVR7,#0F6HLP:MOVR6,#0FAHDJNZR6,$DJNZR7,LPRET10、在內(nèi)部RAM的21H單元開始存有一組單字節(jié)不帶符號數(shù),數(shù)據(jù)長度為30H,要求找出最大數(shù)存入BIG單元。11、編寫程序,把累加器A中的二進(jìn)制數(shù)變換成3位BCD碼,并將百、十、個位數(shù)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025技術(shù)咨詢合同涉外科技咨詢和設(shè)計合同
- 2025個人場地租賃合同范本
- 二零二五年度個人房產(chǎn)交易產(chǎn)權(quán)登記與變更法律文件3篇
- 2025擠塑板買賣合同范本
- 2025培訓(xùn)服務(wù)合同格式
- 2025年混煉膠項目申請報告模式
- 2025工作簽合同還沒到期可以辭職
- 2025年神經(jīng)外科手術(shù)器械項目規(guī)劃申請報告模板
- 2025年男士護(hù)理項目立項申請報告模范
- 2024版合作經(jīng)營項目合同書樣本一
- 影視作品價值評估-洞察分析
- 環(huán)境因素控制措施
- 2024年下學(xué)期學(xué)校德育工作總結(jié)
- 《電化學(xué)儲能系統(tǒng)艙大件運(yùn)輸特殊要求》
- 2025年采購部工作計劃
- 《防范于心反詐于行》中小學(xué)防范電信網(wǎng)絡(luò)詐騙知識宣傳課件
- 江蘇某小區(qū)園林施工組織設(shè)計方案
- 勘察工作質(zhì)量及保證措施
- 墊江縣中醫(yī)院2018年11月份臨床技能中心教學(xué)設(shè)備招標(biāo)項目招標(biāo)文件
- 排放源統(tǒng)計(環(huán)統(tǒng))年報填報指南
- 反射療法師理論考試復(fù)習(xí)題及答案
評論
0/150
提交評論