單片機原理與接口技術:第四章 匯編語言程序設計_第1頁
單片機原理與接口技術:第四章 匯編語言程序設計_第2頁
單片機原理與接口技術:第四章 匯編語言程序設計_第3頁
單片機原理與接口技術:第四章 匯編語言程序設計_第4頁
單片機原理與接口技術:第四章 匯編語言程序設計_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章匯編語言程序設計4.1程序設計概述

4.2匯編語言源程序常用的偽指令4.3匯編語言程序基本結構4.4主程序4.5子程序4.6匯編語言程序設計與調(diào)試4.1程序設計概述程序是完成某一特定任務的若干指令的有序集合。MCS-51系列單片機的程序設計語言按照語言的結構及其功能可分為三種:機器語言、匯編語言、高級語言。4.1.1程序設計語言1.機器語言機器語言是用二進制代碼0和1表示指令和數(shù)據(jù)的最原始的程序設計語言。機器語言也是唯一能被計算機的CPU、單片機的MCU直接識別和執(zhí)行的語言。我們把這種能夠被CPU、MCU直接識別的二進制表示的指令稱為機器碼。像匯編指令“MOVA,#60H”,翻譯成機器語言來表示就是01110100B和0110000B兩個字節(jié)。匯編語言就是用助記符來表示指令的一種語言,所謂助記符就是幫助記憶的字符。2.匯編語言在匯編語言中,指令用助記符表示,地址、操作數(shù)可用標號、符號地址及字符等形式來描述。匯編語言也叫符號化語言,它使用助記符來代替二進制的0和1。單片機的程序普遍采用匯編指令來編寫,用匯編語言寫成的程序稱為源程序或源代碼??墒菃纹瑱C不能直接識別和執(zhí)行用匯編語言寫成的程序,要通過翻譯把匯編程序譯成機器語言,這個過程就叫做匯編。

匯編語言仍然是面向CPU、MCU的,它仍然是一種低級語言。每一類CPU、MCU都有它自己的匯編語言。例如,MCS-51系列,PIC系列單片機和AVR系列單片機都有自己的匯編語言。目前,最適合單片機編程的是C語言。3.高級語言高級語言是接近于人的自然語言,是面向過程而獨立于機器的通用語言。

C語言是一種通用的計算機程序設計語言。它既可以用來編寫通用計算機的系統(tǒng)程序,也可以用來編寫一般的應用程序。由于它具有直接操作計算機硬件的功能,所以非常適合用來編寫單片機程序。與其他的計算機高級程序設計語言相比,C語言具有以下特點:

(1)語言規(guī)模小,使用簡單。

(2)可以直接操作計算機硬件。

(3)表達能力強,方式靈活。

(4)可進行結構化設計。

(5)可移植性強。4.1.2匯編語言指令類型

MCS-51單片機匯編語言包含兩類不同性質(zhì)的指令:基本指令、偽指令和宏指令。

基本指令即前面章節(jié)所講的指令系統(tǒng)中的指令,它們都是單片機能夠執(zhí)行的指令,每一條指令都有對應的機器碼。

偽指令是一種說明語句,主要是為匯編程序服務的,在匯編時沒有目標代碼與之對應,它們都是單片機不能執(zhí)行的指令,無對應的機器碼。

基本指令是開發(fā)人員“講給”單片機聽的指令,是單片機能夠執(zhí)行的指令,是真指令;偽指令是開發(fā)人員“講給”計算機聽的指令,這里的計算機是指僅僅起將匯編語言翻譯成機器碼作用的開發(fā)工具(匯編程序),不是用來完成應用系統(tǒng)控制的單片機。所以,對于完成應用系統(tǒng)的控制的單片機來說,偽指令不是可執(zhí)行指令,是假指令。

宏指令語句:將需要反復多次執(zhí)行的程序段定義成一個宏指令名(宏定義)。編程時,可在程序中使用宏指令名來替代被定義的程序段(宏調(diào)用)。4.1.3

匯編語言格式

匯編語言程序是由匯編語句(即指令)組成的,匯編語句在書寫時一般由四部分組成。典型的匯編語句格式(結構)如下:

[標號:]操作碼[操作數(shù)][;注釋]

例如:

START:MOVSP,#60H ;A←#60H說明:(1)匯編語言語句由標號、操作碼、操作數(shù)、注釋四部分組成。其中的標號、操作數(shù)和注釋部分可以有,也可以沒有。如NOP、RET語句只有操作碼,沒有其他三個部分。(2)標號位于語句的開始,由以字母開頭的字母和數(shù)字組成,它代表該語句的地址。標號與指令之間要用冒號(?:?)分開,標號與冒號之間不能有空格,冒號與操作碼之間可以有

空格。(3)操作碼是指令的助記符,是匯編語句的核心。(4)操作數(shù)在操作碼之后,二者用空格分開。操作數(shù)可以是數(shù)據(jù),也可以是地址。當有兩個操作數(shù)時,操作數(shù)之間用逗號(?,?)分開。逗號前稱為第一操作數(shù),逗號后稱為第二操作數(shù)。

指令中的操作數(shù)可以是十進制、十六進制、二進制、字符串。具體格式如下:

十進制數(shù)以D結尾(可以省略),如35D或35。

十六進制數(shù)以H結尾,如56H。如果數(shù)據(jù)以A~F開頭,其前必須加數(shù)字0,如

#0A1H。

二進制數(shù)以B結尾,如10010110B。

字符串要加單引號或雙引號,即

′′?或

″″,如

′A′?表示字符A的ASCII碼。(5)注釋在語句的最后,以分號(?;?)開始,是說明性的文字,與語句的具體功能無關。分號右邊的字符不參與匯編。

例如:

ABC:MOVA,#68H;A←#68H

在這條指令中,ABC為標號,表示該指令的地址;MOV為操作碼,表示指令的功能為數(shù)據(jù)傳送;A為第一操作數(shù),#68H為第二操作數(shù);A←#68H為注釋,用于說明這條語句的功能,注釋內(nèi)容不參與程序的匯編。4.2匯編語言源程序常用的偽指令

偽指令不產(chǎn)生相對應的機器碼,運行于計算機中的匯編軟件將匯編語言源程序匯編成機器碼時,偽指令起著協(xié)助匯編的作用。偽指令用于規(guī)定程序地址,建立數(shù)據(jù)表格等操作。常用的偽指令有ORG、END、EQU、DATA、DB、DW、BIT和

$。1.ORG

ORG為匯編起始偽指令,又稱定位偽指令,其格式如下:

ORGn其中,ORG是偽指令助記符;n為操作數(shù)。n可以是十進制常數(shù),也可以是十六進制常數(shù),其范圍是0000H~0FFFFH

該偽指令用于定位其后面的指令在程序存儲器中存放的地址,地址范圍是0000H~0FFFFH。例如:

ORG0200H

MOVA,#60H

其作用是將指令“MOVA,#60H”存放在0200H開始的程序地址單元。

2.END

END為匯編結束偽指令,格式如下:

END

該偽指令用于指示運行于計算機中的匯編軟件匯編到END時結束,其后的指令不參與匯編,即END指令后的匯編指令不再翻譯成機器碼。END偽指令常用于大型匯編程序的分段調(diào)試,避免一次出現(xiàn)過多的語法錯誤提示。3.EQU

EQU為等值替代偽指令,又稱常量定義偽指令,其格式如下:

xxEQUyy

EQU偽指令又稱賦值偽指令,作用是給常量、變量xx賦予一個確定的數(shù)值yy。

EQU偽指令常用于定義常量。例如,如果程序的開始使用偽指令“MAXEQU137”,則在程序中,#MAX將代表立即數(shù)

#137;指令“MOVA,#137”就可以寫成“MOVA,#MAX”。

EQU偽指令也可用于定義變量。例如,如果程序的開始使用偽指令“OUTLEDEQUP1”,則在程序中,OUTLED將代表P1口。

EQU偽指令中的字符名必須先賦值后使用,故該語句通常放在源程序的開頭。4.DATA

DATA為片內(nèi)RAM字節(jié)起名偽指令,又稱片內(nèi)RAM地址賦值偽指令,其格式如下:

xxDATAyy

其中,xx表示變量名;yy表示片內(nèi)RAM字節(jié)地址。

DATA偽指令的作用是給變量xx賦一個確定的片內(nèi)RAM字節(jié)地址yy。該偽指令用于在片內(nèi)RAM空間定義變量。例如,如果程序的開始使用偽指令“OUTLEDDATA50H”,即給片內(nèi)RAM地址50H字節(jié)起了一個名OUTLED,則在程序中,OUTLED將代表地址為50H的片內(nèi)RAM。5.DB

DB為字節(jié)定義偽指令,其格式如下:

[標號:]DBX1,X2,…,Xn

其中,X1,X2,…,Xn為8?bit數(shù)據(jù)或ASCII碼,也可以是一個表達式。

DB偽指令的作用是在程序存儲器空間定義數(shù)據(jù)字節(jié)偽指令。該偽指令通常用于定義常數(shù)表,在程序存儲器空間,從標號(即本條指令)開始的地址單元依次存入單字節(jié)數(shù)據(jù)X1,X2,…,Xn。例如:ORG0100HTABLE:DB03FH,04DH

其作用是把數(shù)據(jù)03FH以字節(jié)的形式存放在程序存儲器單元0100H中;把數(shù)據(jù)04DH以字節(jié)的形式存放在程序存儲器單元0101H中。6.DWDW為字定義偽指令,格式如下:

[標號:]DWY1,Y2,…,Yn

其中,Y1,Y2,…,Yn為16?bit數(shù)據(jù),也可以是一個表達式。

DW偽指令的作用是按字的形式定義數(shù)據(jù),把數(shù)據(jù)存放在程序存儲器空間中。該偽指令通常用于定義16?bit地址表或16?bit常數(shù)表,在程序存儲器空間,從標號(即本條指令)開始的地址單元中,依次存入雙字節(jié)數(shù)據(jù)Y1,Y2,…,Yn。

需要注意的是,MCS-51匯編語言中DW偽指令定義雙字節(jié)數(shù)據(jù)時,其高8?bit存放在程序存儲器中地址較低的單元,低8?bit存放在程序存儲器中地址較高的單元。例如:

ORG0100H

TABLE:

DW3F4DH,1234H

其作用是把數(shù)據(jù)3F4DH以字的形式存放在存儲器單元0100H和0101H中;把數(shù)據(jù)1234H以字的形式存放在存儲器單元0102H和0103H中。7.$

$為跳轉(zhuǎn)到本句偽指令,其格式如下:

操作碼[操作數(shù),]$

$的作用是跳轉(zhuǎn)到本指令的首地址。該偽指令多用于程序的控制轉(zhuǎn)移中,可以避免在指令前再寫標號,減少錄入字符數(shù)。例如:

SJMP$

其作用為原地踏步。相當于:

ABC:SJMPABC

8.BIT

BIT為位地址起名偽指令,又稱為位定義偽指令,其格式如下:

xxBITyy

其中,yy是片內(nèi)RAM空間可位尋址的位地址,范圍是00H~7FH;xx是給該位地址起的名字,是標識符,應符合變量命名規(guī)則。9.定義存儲區(qū)格式:

[標號:]DSX

功能:用于定義從標號開始的內(nèi)存單元預留一定數(shù)量的內(nèi)存單元,以備源程序執(zhí)行過程中使用。預留單元的數(shù)量由X決定。4.3匯編語言程序基本結構

由于所處理的問題不同,不同程序的結構也就不盡相同。不論系統(tǒng)應用程序如何復雜,匯編語言程序都可以用三種結構來構成,即順序結構、分支結構和循環(huán)結構。這三種基本結構的流程圖如圖4-1、圖4-2、圖4-3所示。圖4-1順序結構流程圖

圖4-2分支結構流程圖

圖4-3循環(huán)結構流程圖4.3.1順序結構

順序結構程序是一種最簡單、最基本的程序。

順序結構程序的特點是:程序中的語句按編寫的順序由前向后依次執(zhí)行每一條指令,直到最后一條。最后一條指令執(zhí)行完畢,整個程序結構也就結束了。

順序結構的程序多用來處理比較簡單的問題,不需要條件判斷。如簡單的算術運算類問題、邏輯運算類問題。

【例1】兩個小于10的二進制數(shù)分別存于片內(nèi)RAM地址40H、41H單元,試求兩數(shù)的平方和,將結果存于42H單元。

設這兩個小于10的二進制數(shù)為X、Y。由于兩數(shù)均小于10,故每個數(shù)的平方小于100,可利用乘法指令求平方,兩數(shù)的平方和小于200,因此也小于255,故可以存放于一個字節(jié)的42H單元。

圖4-4例1流程圖4.3.2分支結構

根據(jù)條件是否滿足而轉(zhuǎn)向不同的處理程序,這種程序結構叫做分支結構。對于MCS-51系列單片機,往往使用指令系統(tǒng)中的控制轉(zhuǎn)移類指令。在MCS-51系列單片機中,可以直接用于分支結構程序設計的指令有JB、JNB、JC、JNC、JZ、JNZ、CJNE、JBC等。這些指令可以完成正負判斷、大小判斷、溢出判斷等任務。分支程序的設計要點如下:

(1)定義標志位或標志字節(jié),建立條件轉(zhuǎn)移指令可以測試的條件。

(2)在指令系統(tǒng)中選用合適的條件轉(zhuǎn)移指令。

(3)在轉(zhuǎn)移的目標地址處設定標號。

分支程序從形式上分為兩分支結構、三分支結構和多分支結構三種基本形式,分別如圖4-5、圖4-6和圖4-7所示。

圖4-5兩分支結構

圖4-6三分支結構圖4-7多分支結構1.兩分支結構

【例2】設X?<?245,X存放在片內(nèi)RAM地址為40H的字節(jié)單元中,根據(jù)下式求Y值,將Y值存放在片內(nèi)RAM41H地址單元中。

判斷數(shù)據(jù)X是否為0,X就是標志字節(jié)。若標志字節(jié)X為0,轉(zhuǎn)向一個分支;若標志字節(jié)X不為0,轉(zhuǎn)向另一個分支。判別標志字節(jié)X是否為0用JZ指令。在xxx處設定標號xxx。程序流程圖如圖4-8所示。

圖4-8例2流程圖2.三分支結構

【例3】假設累加器A中存放一有符號數(shù)X,求解函數(shù),并將結果存入寄存器R1中。

此程序應為三分支結構,程序流程圖如圖4-9所示。圖4-9例3三分支結構流程圖本程序中使用“CJNEA,#xxH,標號”指令和JB指令實現(xiàn)三路分支,同時還3次使用了SJMPQUIT指令。4.3.3循環(huán)結構

在許多實際問題中,一段程序需要被重復執(zhí)行多次,只是每次參加運算的操作數(shù)不同,這時,就要用到循環(huán)結構程序來完成。

循環(huán)結構的程序可以縮短源代碼,減小程序所占的存儲空間。通常情況下,循環(huán)結構程序包括以下四部分:

(1)循環(huán)初始化。初始化即循環(huán)準備部分。初始化部分主要用來設置循環(huán)的初始值,包括預值數(shù)計數(shù)器和數(shù)據(jù)指針的初值,是為循環(huán)做好必要的準備工作。這部分程序雖然只執(zhí)行一次,但對于程序的運行十分重要,是完成循環(huán)結構程序設計的第一步。(2)循環(huán)體。這部分是循環(huán)結構程序的主體部分,是需要多次執(zhí)行的程序。(3)循環(huán)控制。這部分的功能有兩個:一是通過修改計數(shù)器和指針的值,為下一輪工作做好必要的準備;二是通過檢查、判斷該循環(huán)是否執(zhí)行了足夠的次數(shù)。如果不到足夠的次數(shù),循環(huán)繼續(xù)進行;如果到了足夠的次數(shù),就采用條件轉(zhuǎn)移指令或判斷指令來控制循環(huán)的結束??傊?,循環(huán)控制的作用是控制循環(huán)的繼續(xù)或終止。(4)循環(huán)的結果處理。結束循環(huán)后,對所得的結果進行處理。

以上四個部分中,(1)和(4)部分只執(zhí)行一次,而(2)和(3)部分可以執(zhí)行多次。

構成循環(huán)結構程序的形式和方法是多種多樣的。根據(jù)循環(huán)結構層次的不同,可以把循環(huán)結構程序分為單重循環(huán)結構和多重循環(huán)結構。一個循環(huán)結構中不再包含其他的循環(huán)結構程序,則稱該循環(huán)結構程序為單循環(huán)結構程序。如果一個循環(huán)程序中包含有其他的循環(huán)程序,則稱該循環(huán)程序為多重循環(huán)程序。

循環(huán)程序結構有兩種,如圖4-10所示。圖4-10循環(huán)程序結構圖(a)是“先執(zhí)行后判斷”結構,適用于循環(huán)次數(shù)已知的情況。圖(b)是“先判斷后執(zhí)行”結構,適用于循環(huán)次數(shù)未知的情況?!纠?】工作單元清零。在應用系統(tǒng)程序設計時,有時經(jīng)常需要將存儲器中各部分地址單元作為工作單元,存放程序執(zhí)行的中間值或執(zhí)行結果,工作單元清零工作常常放在程序的初始化部分中。設有50個工作單元,其首址為外部存儲器8000H單元,則其工作單元清零程序如下:CLEAR:CLRA

MOVDPTR,#8000H;工作單元首址送指針MOVR2,#50;置循環(huán)次數(shù)CLEAR1:MOVX@DPTR,A

INCDPTR;修改指針

DJNZR2,CLEAR1;控制循環(huán)

RET[例5]從單片機的片內(nèi)RAM地址40H起存放有一個字符串,該字符串以字符內(nèi)容

#00?為結尾標志,編程將該字符串傳送到片外RAM地址2000H開始的連續(xù)單元中。

因為字符串的長度不能夠確定,所以,不能用計數(shù)器控制法來判斷循環(huán)何時結束,應該以片內(nèi)RAM中的內(nèi)容是否為#00來判斷循環(huán)是否結束。流程圖如下:對于MCS-51系列單片機,內(nèi)部RAM只有128個字節(jié),地址為00H~7FH。如果從40H單元到7FH單元一直沒有數(shù)據(jù)

#00,就不再繼續(xù)傳送。如果考慮程序的容錯性,必須在循環(huán)的結束部分再增加判斷片內(nèi)RAM指針是否越界的指令?!纠?】在例5的基礎上,增加要求:考慮片內(nèi)RAM的越界問題;統(tǒng)計字符串的字符個數(shù)。

此程序中,指令“CJNEA,#00H,MOV1”的功能是判斷數(shù)據(jù)是否為0,如果為0則傳送結束。判斷片內(nèi)RAM指針是否越界用“CJNER1,#80H,MOV3”指令。

例5和例6循環(huán)程序是根據(jù)某些條件來判斷循環(huán)是否結束,稱為條件控制法循環(huán)結構程序?!纠?】50?ms軟件延時程序(采用計數(shù)器控制法)。延時程序與MCS-51系列單片機指令執(zhí)行時間密切相關。如果使用12?MHz晶振,一個機器周期為1?μs,用循環(huán)方式延時50ms需要50000個機器周期。執(zhí)行一條DJNZ指令的時間為2?μs。這時,用雙重循環(huán)結構寫出的延時程序。

50?ms的程序如下所示:

ORG0000HMOVR7,#x;執(zhí)行1次LOOP1:MOVR6,#y;執(zhí)行x次

NOP;執(zhí)行x次LOOP2:DJNZR6,LOOP2;執(zhí)行x*y次

DJNZR7,LOOP1;執(zhí)行x次

JMP$;踏步,程序結束

END

這段雙重循環(huán)程序執(zhí)行時總共需要的機器周期數(shù)T=1+x+x+2xy+2x個,即4x+2xy+1個。對于50000個機器周期,第一條指令占得一個機器周期可以忽略不計,可得4x+2xy=50000,若取x=250,則y=98.

需要注意的是,用軟件實現(xiàn)延時,在執(zhí)行循環(huán)體的過程中不允許響應中斷,否則將影響延時的精度,如果需要延時更長時間,可采用多重循環(huán),如三重、四重循環(huán)。

上例程序中采用了多重循環(huán)程序,即在一個循環(huán)體中又包含了其它的循環(huán)程序,這種方式是實現(xiàn)延時程序的常用方法。使用多重循環(huán)時,必須注意:

(1)循環(huán)嵌套,必須層次分明,不允許產(chǎn)生內(nèi)外層循環(huán)交叉。

(2)外循環(huán)可以一層層向內(nèi)循環(huán)進入,結束時由里往外一層層退出。

(3)內(nèi)循環(huán)可以直接轉(zhuǎn)入外循環(huán),實現(xiàn)一個循環(huán)由多個條件控制的循環(huán)結構方式。

4.3主程序主程序設計單片機的主程序通常是一個“有始無終”的“無限循環(huán)”結構,如圖4-11所示。圖4-11主程序流程圖2.功能模塊程序段設計

單片機應用系統(tǒng)開發(fā)主要包括以下四大模塊:

(1)人機接口模塊。該模塊包含鍵盤、發(fā)光二極管顯示、數(shù)碼管顯示、LCD顯示、聲光報警等子模塊。

(2)輸入模塊。該模塊包含A/D轉(zhuǎn)換、開關量輸入、頻率輸入、計數(shù)脈沖輸入等子模塊。

(3)運算模塊。該模塊包含門限判斷、運算、PID算法、模糊控制算法等子模塊。

(4)輸出模塊。該模塊包含D/A轉(zhuǎn)換、開關量輸出、頻率輸出等子模塊。

由于這些模塊僅出現(xiàn)一次,所以不要采用子程序方式設計,模塊之間用SJMP、AJMP、LJMP指令連接。3.系統(tǒng)上電與復位初始化

系統(tǒng)復位后,首先判斷是上電引起的復位還是看門狗引起的復位,然后分別進入“上電初始化模塊”或“看門狗復位初始化模塊”。

初始化模塊的任務是對單片機的片內(nèi)RAM設置必要的參數(shù),對片外接口芯片初始化參數(shù)。片外接口芯片可能有8155、8255、RAM、EEPROM等。4.5子程序4.5.1使用子程序的優(yōu)點

在一個應用程序設計中,在程序的不同地方往往需要執(zhí)行同樣的一段程序。這時可以把這段程序單獨編制成一個子程序,在原來程序(主程序或子程序)中需要執(zhí)行這段程序的地方執(zhí)行一條調(diào)用指令,轉(zhuǎn)到子程序完成規(guī)定的操作以后,又返回到原來的程序(主程序或子程序)繼續(xù)執(zhí)行下去。這樣處理的好處是:

(1)避免在幾個不同的地方對同樣一段程序進行重復編程;

(2)簡化了程序的邏輯結構;

(3)縮短了程序長度,從而節(jié)省了程序存儲單元;

(4)便于調(diào)試。

通常把具有一定功能的公用程序段作為子程序,在子程序的末尾安排一條返回主程序的指令RET。主程序調(diào)用子程序以及從子程序返回主程序的過程如圖4-12所示。圖4-12主程序調(diào)用子程序示意圖當主程序執(zhí)行到A處,執(zhí)行調(diào)用子程序SUB時,把下一條指令地址(PC值)保存到堆棧中,棧指針SP加2,子程序SUB的起始地址送PC;MCU轉(zhuǎn)向執(zhí)行子程序SUB,碰到SUB中的返回指令RET,把A處下一條指令地址從堆棧中取出并送回到PC;于是MCU又回到主程序繼續(xù)執(zhí)行下去。當主程序執(zhí)行到B處又碰到調(diào)用子程序SUB的指令時,再一次重復上述過程。子程序SUB能被主程序調(diào)用多次。

在一個程序中,往往在子程序中還會調(diào)用別的子程序,這稱為子程序嵌套。二級子程序嵌套過程如圖4-13所示。圖4-12主程序與二級子程序嵌套示意圖

為了保證正確地從子程序SUB02返回子程序SUB01,再從SUB01返回主程序,每次調(diào)用子程序時必須將下一條指令地址保存起來,返回時按后進先出原則依次取出舊PC值。如第3章所述,堆棧是按照“先進后出”、“后進先出”的原則存取數(shù)據(jù)的,調(diào)用指令(ACALL、LCALL)和返回指令(RET)具有自動保存PC內(nèi)容到堆棧和自動從堆?;謴蚉C內(nèi)容的功能,我們不必使用PUSH和POP指令對PC進行操作。只要正確使用調(diào)用指令(ACALL、LCALL)和返回指令(RET)即可。4.5.2子程序的調(diào)用與返回

MCS-51單片機指令系統(tǒng)提供了兩條子程序調(diào)用指令:

ACALLAddr11

和LCALLAddr16

其中的Addr11和Addr16為子程序的入口地址。在程序中通常用標號來代表直接地址。

1.子程序的調(diào)用

當主程序需要執(zhí)行某子程序的功能時,只需執(zhí)行一條調(diào)用指令。單片機先將當前的PC值(斷點地址)壓入堆棧,然后將PC修改為調(diào)用指令中標號所代表的地址,從而實現(xiàn)了從主程序跳轉(zhuǎn)到子程序,即實現(xiàn)了子程序的調(diào)用。2.子程序的返回

子程序的最后一條指令應該是返回指令RET或RETI,以確保子程序能夠正確返回主程序。執(zhí)行RET指令時單片機將原來存在堆棧中的斷點地址彈出給PC,保證子程序返回主程序中調(diào)用子程序的地方繼續(xù)執(zhí)行主程序。

子程序的運行從子程序的標號處開始,到RET或RETI指令結束。RET指令是一般子程序的返回指令。RETI指令是中斷服務子程序的返回指令。4.5.3子程序的入口參數(shù)與出口參數(shù)

1.子程序入口參數(shù)

在調(diào)用子程序時,主程序應先把該子程序要用到的數(shù)據(jù)(入口參數(shù))放到約定的片內(nèi)RAM或片外RAM。子程序在運行時,可以從這些約定的RAM單元讀取要用到的數(shù)據(jù)。

調(diào)用子程序時,主程序應把子程序?qū)⒁褂玫挠嘘P參數(shù)送入約定的位置,子程序運行時,可以從約定的位置得到有關的參數(shù),這類由主程序提供給子程序的參數(shù)叫做子程序的入口參數(shù)。

2.子程序的出口參數(shù)

子程序經(jīng)過運算處理后,應該把結果(出口參數(shù))放到約定的片內(nèi)RAM或片外RAM。在返回主程序后,主程序可以從這些存放出口參數(shù)的地方得到需要的結果。這就是參數(shù)傳遞。

同樣,在子程序結束前也應把運算結果送到指定的位置,返回主程序后,主程序可以從指定的位置得到需要的結果,這類由子程序提供給主程序的參數(shù)叫做子程序的出口參數(shù)。4.5.4主程序與子程序之間的參數(shù)傳遞

實現(xiàn)參數(shù)傳遞可以用工作寄存器R0~R7、累加器A、數(shù)據(jù)指針R0、R1、DPTR或堆棧,也可以使用片內(nèi)RAM和片外RAM。

實現(xiàn)參數(shù)傳遞時,可以采用多種方法,常用的方法有以下三種:

(1)用工作寄存器R0~R7或累加器A傳遞參數(shù)。這種方法是把入口參數(shù)或出口參數(shù)放入工作寄存器或累加器中。其優(yōu)點是程序簡單、運算速度快。缺點是寄存器數(shù)量有限,傳遞參數(shù)的數(shù)量較少。(2)用指針寄存器R0、R1、DPTR傳遞參數(shù)。因為數(shù)據(jù)通常存放在片內(nèi)RAM、片外RAM中,所以可以通過使用指針寄存器指示數(shù)據(jù)的位置(地址)來實現(xiàn)參數(shù)傳遞,這樣做的優(yōu)點是可以傳送較多的數(shù)據(jù)。如果參數(shù)在片內(nèi)RAM存儲器中,可以使用R0或R1作為指針寄存器;如果參數(shù)在片外RAM中,可以使用DPTR作為指針寄存器。(3)用堆棧傳遞參數(shù)。主程序調(diào)用子程序時,主程序用PUSH指令把入口參數(shù)依次壓入堆棧。進入子程序后,可根據(jù)棧指針SP來間接訪問堆棧中的入口參數(shù),子程序運算處理結束前,把結果(出口參數(shù))放入堆棧中。返回主程序后,可用POP指令得到這些結果(出口參數(shù))。這種方法的優(yōu)點是簡單,能傳遞一定數(shù)量的參數(shù),不必為特定的參數(shù)分配RAM單元;缺點是占用堆棧字節(jié),要分配足夠的堆棧區(qū)。4.5.5子程序的規(guī)范化設計

在編制子程序時,為了便于閱讀、交流和使用,對子程序的各個要素要有清楚的說明,這就是子程序的規(guī)范化設計。規(guī)范的子程序設計內(nèi)容包括:

(1)子程序名稱。給子程序起名字的原則是子程序名能夠反映子程序功能,該名字就是子程序的入口地址標識符。

(2)子程序功能。程序中要對子程序的功能給予簡要的描述。

(3)入口參數(shù)。該參數(shù)是子程序所要運算或處理的數(shù)據(jù)(加工前的原料)。在調(diào)用子程序之前,主程序

溫馨提示

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

最新文檔

評論

0/150

提交評論