單片機原理及接口技術 第四章 匯編語言程序設計-4學習資料_第1頁
單片機原理及接口技術 第四章 匯編語言程序設計-4學習資料_第2頁
單片機原理及接口技術 第四章 匯編語言程序設計-4學習資料_第3頁
單片機原理及接口技術 第四章 匯編語言程序設計-4學習資料_第4頁
單片機原理及接口技術 第四章 匯編語言程序設計-4學習資料_第5頁
已閱讀5頁,還剩54頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第四章匯編語言程序設計程序編制的方法4.1源程序的編輯和匯編4.2程序基本結構4.3常用程序舉例4.41程序設計:

為完成特定的工作任務而組織起來的指令序列稱為程序,編排這一指令序列的過程稱為程序設計。第四章匯編語言程序設計*34.1

程序編制的方法4.1.1程序編制的步驟一、任務分析二、確定算法及優化三、程序總體設計及流程圖繪制4.1

程序編制的方法4.1程序編制的方法四、合理分配寄存器和存儲空間

寄存器定義具體用途,堆棧的設置,程序及數據存放的區域。五、編制匯編源程序

正確使用各種指令,層次分明的編寫匯編源程序*64.1.2匯編語言的語句格式語句行由四個字段組成:

[標號:]操作碼操作數

[;注釋]

LOOP1:MOVA,20H;A←(20H)

括號內的部分可以根據實際情況取舍;每個字段之間要用分隔符分隔;分隔符可以有冒號、空格、逗號、分號等。4.1

程序編制的方法*7一、標號

標號是語句地址的標志符號,用于引導對該語句的非順序訪問。有關標號的規定為:二、操作碼、操作數由指令助記符表示形式決定。

由1~8個ASCII字符組成。第一個字符必須是字母,其余字符可以是字母、數字或其他特定字符;不能使用已經定義了的符號作為標號。如指令助記符、寄存器符號名稱等;4.1

程序編制的方法*8三、數據的表示形式數據可以有以下幾種表示形式二進制數,末尾以字母B標識。如:10001111B;

十進制數,末尾以字母D標識或省略。如:88D,66;

十六進制數,末尾以字母H標識。如:78H,0A8H;注意:十六進制數以字母開頭時應在其前面加上數字“0”;

ASCII碼以單引號括起來標識。如:‘AB’,‘1245’

四、注釋

注釋只是對語句的說明。注釋可增加程序的可讀性。注釋必須以分號開頭,長度不限;換行書寫,新行開頭也要使用分號“;”。4.1

程序編制的方法*94.2源程序的編輯和匯編

一、源程序的編輯

源程序的編寫要依據80C51匯編語言的基本規則,特別要用好常用的匯編命令(即偽指令)。例如:

ORG0040HMOVA,#7FHMOVR1,#44HEND

這里的ORG和END是兩條偽指令,其作用是告訴匯編程序此匯編源程序的起止位置。編輯好的源程序應以“.ASM”擴展名存盤,以備匯編程序調用。

4.2.1源程序的編輯與匯編*10二、源程序的匯編

將匯編語言源程序轉換為單片機能執行的機器碼形式的目標程序的過程叫匯編。常用的方法有兩種:手工匯編:通過手工方式查指令編碼表,逐個把助記符指令翻譯成機器碼。機器匯編:使用交叉匯編程序將匯編語言源程序轉換為機器碼形式的目標程序。4.2源程序的編輯和匯編*11

偽指令是匯編程序能夠識別并對匯編過程進行某種控制的匯編命令。它不是單片機執行的指令,所以沒有對應的可執行目標碼,匯編后產生的目標程序中不會再出現偽指令。4.2.2偽指令一、起始地址設定ORG格式為:ORG

表達式

功能:向匯編程序說明下面緊接的程序段或數據段存放的起始地址。表達式通常為16進制地址,也可以是已定義的標號地址。

4.2源程序的編輯和匯編*12二、匯編結束END格式為:

END

功能是結束匯編。匯編程序遇到END偽指令后即結束匯編。處于END之后的程序,匯編程序將不處理。4.2源程序的編輯和匯編*13

源程序經過機器匯編后,形成的若干文件中含有兩個主要文件,一是列表文件,另一個是目標碼文件。但主要信息如下:列表文件:地址目標碼匯編程序

ORG0040H0040H747FMOVA,#7FH0042H7944MOVR1,#44HEND目標碼文件:首地址末地址目標碼0040H0044H747F79444.2源程序的編輯和匯編*14三、定義字節DB[標號:]DB

字節數據表

功能是從標號指定的地址開始,在ROM中定義字節數據。該偽指令將字節數據表中的數據根據從左到右的順序依次存放在指定的單元中。例如:

5000H:DB-2,-4,-6,8,10,18把6個數轉換為十六進制表示(FEH,FCH,FAH,08H,0AH,12H),并連續地存放在以5000H為起始地址的6個單元中。

4.2源程序的編輯和匯編*15四、定義字DW[標號:]DW

字數據表

功能是從標號指定的地址單元開始,在ROM中定義字。該偽指令將字或字表中的數據按從左到右的順序依次存放在指定的存儲單元中。注意:高8位存放在低地址單元,低8位存放在高地址單元。例如:

ORG1400HDATA:DW324AH,3CH……

匯編后,(1400H)=32H,(1401H)=4AH,(1402H)=00H,(1403H)=3CH。4.2源程序的編輯和匯編*16五、空間定義DS[標號:]DS

表達式

功能是從標號指定的地址單元開始,在程序存儲器中保留由表達式所指定個數的存儲單元作為備用的空間,并都填以零值。例如:

ORG3000HBUF:DS50……

匯編后,從地址3000H開始保留50個存儲單元作為備用單元。

4.2源程序的編輯和匯編*17六、賦值EQU符號名EQU

表達式功能是將表達式的值或特定的某個匯編符號定義為一個指定的符號名。例如:

4.2源程序的編輯和匯編

LENEQU

10SUMEQU

21HBLOCKEQU

22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,AEND

該程序的功能是,把BLOCK單元開始存放的10個無符號數進行求和,并將結果存入SUM單元中。*18七、位地址符號定義偽指令BIT格式為:符號名

BIT

位地址表達式

功能是將位地址賦給指定的符號名。其中,位地址表達式可以是絕對地址,也可以是符號地址。例如:

STBITP1.0將P1.0的位地址賦給符號名ST,在其后的編程中就可以用ST來代替P1.0。4.2源程序的編輯和匯編1.順序程序2.分支程序3.循環程序4.子程序及其調用5.運算程序4.3基本程序結構*204.3基本程序結構

4.3.1

順序程序

順序程序也稱為簡單程序,其特點是按照程序中指令的排列順序逐條從頭至尾地執行,程序流向不變。順序程序是最基本的程序形式,其雖然簡單,但它是構成復雜大型程序的基礎。

例:內部RAM的2AH~2EH單元中存儲的數據如圖所示。試編寫程序實現圖示的數據傳送結果。

*21方法一:MOVA,2EH;2字節,1個機器周期MOV2EH,2DH;3字節,2個機器周期MOV2DH,2CH;3字節,2個機器周期MOV2CH,2BH;3字節,2個機器周期MOV2BH,#00H;3字節,2個機器周期4.3基本程序結構*22方法二:CLRA;1字節,1個機器周期XCHA,2BH;2字節,1個機器周期XCHA,2CH;2字節,1個機器周期XCHA,2DH;2字節,1個機器周期XCHA,2EH;2字節,1個機器周期以上兩種方法均可以實現所要求的傳送任務。方法一使用14個字節的指令代碼,執行時間為9個機器周期;方法二僅用了9個字節的代碼,執行時間也減少到了5個機器周期。實際應用中應盡量采用指令代碼字節數少、執行時間短的高效率程序,即注意程序的優化。4.3基本程序結構*23例有一變量存放在片內RAM的20H單元,其取值范圍為:00H~05H。要求編制一段程序,根據變量值求其平方值,并存入片內RAM的21H單元。4.3基本程序結構程序如下:

ORG1000HSTART:MOVDPTR,#2000HMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$ORG2000HTABLE:DB00,01,04,09,16,25END。

23*24例雙字節無符號數加法。

設被加數存放在內部RAM的51H、50H單元,加數存放在內部RAM的61H、60H單元,相加的結果存放在內部RAM的51H、50H單元,進位存放在位尋址區的00H位中。4.3基本程序結構24*程序段如下:MOVR0,#50H;被加數的低字節地址 MOVR1,#60H;加數的低字節地址 MOVA,@R0;取被加數低字節ADDA,@R1;加上加數低字節MOV@R0,A;保存低字節相加結果INCR0;指向被加數高字節INCR1;指向加數高字節MOVA,@R0;取被加數高字節ADDCA,@R1;加上加數高字節(帶進位加)MOV@R0,A;存高字節相加結果MOV00H,C;保存進位。

4.3基本程序結構25分支程序是具有兩個或兩個以上流向的程序。特點是程序中含有轉移指令。轉移指令包含無條件轉移和條件轉移。無條件分支程序十分簡單,這里重點介紹應用十分普遍的條件分支程序。

4.3基本程序結構4.3.2分支程序*27

分支結構可以分成單分支、雙分支和多分支幾種情況:4.3基本程序結構*28一、單分支程序例求雙字節補碼。設在內部RAM的addr1和addr1+1單元存有一個雙字節數(高位字節存于高地址單元)。編寫程序將其讀出取補后再存入addr2和addr2+1單元。4.3基本程序結構方法:首先對低字節取補,然后判其結果是否為全“0”。若是,則高字節取補,否則高字節取反。

*29ORG2000HSTART:MOVR0,#addr1;原碼低字節地址送R0 MOVR1,#addr2;補碼低字節地址送R1 MOVA,@R0;原碼低字節送A CPLA;A內容取補

INCAMOV@R1,A;存補碼低字節

INCR0;調整地址,指向下一單元

INCR1JZZERO;(A)=0時轉ZEROMOVA,@R0;原碼高字節送A CPLASJMPLOOP1ZERO:MOVA,@R0;高字節取補存入addr2+1單元

CPLAINCALOOP1:MOV@R1,A;高字節反碼存入addr2+1單元

SJMP$END4.3基本程序結構*30二、雙分支程序例設變量x以補碼的形式存放在片內RAM的30H單元,變量y與x的關系是:當x大于0時,y=x;當x=0時,y=20H;當x小于0時,y=x+5。編制程序,根據x的大小求y并送回原單元。程序如下:ORG2000HSTART:MOVA,30HJZNEXTANLA,#80H;判斷符號位

JZLPMOVA,#05HADDA,30HMOV30H,ASJMPLPNEXT:MOV30H,#20HLP:SJMP$

END4.3基本程序結構*314.3.3循環程序按某種控制規律重復執行的程序稱為循環程序。循環程序有先執行后判斷和先判斷后執行兩種基本結構:4.3基本程序結構*32一、先執行后判斷例50ms延時程序。

若晶振頻率為12MHz,則一個機器周期為1μs。執行一條DJNZ指令需要2個機器周期,即2μs。采用循環計數法實現延時,循環次數可以通過計算獲得,并選擇先執行后判斷的循環結構。子程序如下:4.3基本程序結構ORG2100HDEL: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*33

例無符號數排序程序。在片內RAM中,起始地址為30H的8個單元中存放有8個無符號數。試對這些無符號數進行升序排序。數據排序常用的方法是冒泡排序法。(方法?。ǔ绦蚩驁D!)設R7為比較次數計數器,初始值為07H,位地址00H為數據互換標志位。

(分配寄存器?。┏绦蛉缦拢海ň庉嫞。㎡RG2300H4.3基本程序結構*34

START:CLR00H;互換標志清0 MOVR7,#07H;各次冒泡比較次數

MOVR0,#30H;數據區首址

LOOP:MOVA,@R0;取前數

MOV2BH,A;暫存

INCR0MOV2AH,@R0;取后數

CLRCSUBBA,@R0;前數減后數

JCNEXT;前數小于后數,不互換

MOV@R0,2BHDECR0MOV@R0,2AH;兩數交換

INCR0;準備下一次比較

SETB00H;置互換標志

NEXT:DJNZR7,LOOP;進行下一次比較

JB00H,START;進行下一輪冒泡

SJMP$END4.3基本程序結構*35二、先判斷后執行

例將內部RAM中起始地址為data的數據串傳送到外部RAM中起始地址為buffer的存儲區域內,直到發現‘$’字符停止傳送。由于循環次數事先不知道,但循環條件可以測試到。所以,采用先判斷后執行的結構比較適宜。程序段如下

MOVR0,#dataMOVDPTR,#bufferLOOP0:MOVA,@R0CJNEA,#24H,LOOP1;判斷是否為‘$’字符

SJMPLOOP2;是‘$’字符,轉結束LOOP1:MOVX@DPTR,A;不是‘$’字符,執行傳送

INCR0INCDPTRSJMPLOOP0;傳送下一數據

LOOP2:……4.3基本程序結構*364.3.4子程序及其調用一、子程序的調用

實際中經常會遇到帶有通用性的問題,例碼制轉換、數值計算等,在一個程序中可能要使用多次。這時可以將其設計成通用的子程序供隨時調用。

子程序特點,在執行過程中需要由其它程序來調用,執行完后又需要把執行流程返回到調用該子程序的主程序。子程序調用注意:一是現場的保護和恢復;二是主程序與子程序的參數傳遞。4.3基本程序結構*37二、現場保護與恢復

在子程序執行過程中常常要用到單片機的一些通用單元,如工作寄存器R0~R7、累加器A、數據指針DPTR,以及有關標志和狀態等。而這些單元中的內容在調用結束后的主程序中仍有用,所以需要進行保護,稱為現場保護。

在執行完子程序,返回繼續執行主程序前恢復其原內容,稱為現場恢復。保護與恢復的方法有以下兩種:在主程序中實現;在子程序中實現。4.3基本程序結構*38

1、在主程序中實現示例如下:

PUSHPSW;保護現場

PUSHACC;

PUSHB;

MOVPSW,#10H;換當前工作寄存器組

LCALLaddr16;子程序調用

POPB;恢復現場

POPACC;

POPPSW;

……

其特點是結構靈活。4.3基本程序結構*39

2、在子程序中實現示例如下:SUB1:PUSHPSW;保護現場

PUSHACC;

PUSHB;MOVPSW,#10H;換當前工作寄存器組

……POPB;恢復現場

POPACC;

POPPSW;

RET其特點是程序規范、清晰。注意,無論哪種方法保護與恢復的順序要對應。4.3基本程序結構*40三、參數傳遞

由于子程序是主程序的一部分,所以,在程序的執行時必然要發生數據上的聯系。在調用子程序時,主程序應通過某種方式把有關參數(即子程序的入口參數)傳給子程序,當子程序執行完畢后,又需要通過某種方式把有關參數(即子程序的出口參數)傳給主程序。在8051單片機中,傳遞參數的方法有三種:

1、利用累加器或寄存器

2、利用存儲器3、利用堆棧4.3基本程序結構*41

例編寫程序,實現c=a2+b2

。設a,b,c分別存于內部RAM的30H,31H,32H三個單元中。程序如下:ORG1000HSTART:MOVA,30H;取aLCALLSQR;調用查平方表

MOVR1,A;a2暫存于R1中

MOVA,31H;取bLCALLSQR;調用查平方表

ADDA,R1;a2+b2存于A中

MOV32H,A;存結果

SJMP$SQR:MOVDPTR,#TAB;子程序

MOVCA,@A+DPTR;

RETTAB:DB0,1,4,9,16,25,36,49,64,81END

4.3基本程序結構*

42

例將R0和R1指向的內部RAM中兩個3字節無符號整數相加,結果送到由R0指向的內部RAM中。低字節在低地址,高字節在高地址。(入口,R0和R1分別指向加數和被加數的低位字節;出口,R0指向結果的高位字節。)

4.3基本程序結構實現程序:ORG2200HNADD:MOVR7,#3;三字節加法

CLRC;NADD1:MOVA,@R0;取加數低字節

ADDCA,@R1;被加數低字節加AMOV@R0,A;存結果

INCR0;指向高字節

INCR1DJNZR7,NADD1

MOV@R0,#00H

ADDCA,@R0

MOV@R0,ARET

*43例把內部RAM中20H單元中的1個字節十六進制數轉換為2位ASCII碼,存放在R0指示的兩個單元。

4.3基本程序結構

ORG2300H

MAIN:MOVA,20H;

SWAPAPUSHACC;參數入棧

ACALLHEASCPOPACCMOV@R0,A;存高位十六進制數轉換結果

INCR0;修改指針

PUSH20H;參數入棧

ACALLHEASCPOPACCMOV@R0,A;存低位十六進制數轉換結果

SJMP$

*44

;轉換子程序

ORG2310HHEASC:MOVR1,SP;借用R1為堆棧指針

DECR1DECR1;R1指向被轉換數據

XCHA,@R1;取被轉換數據

ANLA,#0FH;取一位十六進制數

ADDA,#2;所加值為MOVC與DB間字節數

MOVCA,@A+PC;查表

XCHA,@R1;1字節指令,存結果于堆棧

RET;1字節指令ASCTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H

4.3基本程序結構*45

一般說來:當相互傳遞的數據較少時,采用寄存器傳遞方式可以獲得較快的傳遞速度;當相互傳遞的數據較多時,宜采用存儲器或堆棧方式傳遞;如果是子程序嵌套時,最好是采用堆棧方式。4.3基本程序結構*464.4常用程序舉例4.4.1算術運算程序一、多字節數的加、減運算

8051單片機的指令系統提供的是字節運算指令,所以在處理多字節數的加減運算時,要合理地運用進位(借位)標志。

例多字節無符號數的加法。

設兩個N字節的無符號數分別存放在內部RAM中以DATA1和DATA2開始的單元中。相加后的結果要求存放在DATA2數據區。*47MOVR0,#DATA1;

MOVR1,#DATA2;

MOVR7,#N; 置字節數

CLRC;LOOP:MOVA,@R0;

ADDCA,@R1

;求和

MOV@R1,A;存結果

INCR0;修改指針

INCR1;

DJNZR7,LOOP;SJMP$4.4常用程序舉例*48例多字節無符號數的減法。

設兩個N字節的無符號數分別存放在內部RAM中以DATA1和DATA2開始的單元中。相減后的結果要求存放在DATA2數據區。

MOVR0,#DATA1;

MOVR1,#DATA2;

MOVR7,#N;置字節數

CLRC;LOOP:MOVA,@R0;

SUBBA,@R1

;求差

MOV@R1,A;存結果

INCR0;修改指針

INCR1;

DJNZR7,LOOP;SJMP$4.4常用程序舉例*49二、多字節數乘法運算例雙字節無符號數的乘法。設雙字節的無符號被乘數存放在R3、R2中,乘數存放在R5、R4中,R0指向積的高位。

4.4常用程序舉例*50主程序段如下:ORG1000HMULTB:MOVR7,#04

MOVR0,#33HLOOP:MOV@R0,#00H;結果單元清0

DECR0

DJNZR7,LOOP;

ACALLBMUL;

SJMP$另有2段子程序:

BMULRADD(在BMUL中被調用)4.4常用程序舉例*51ORG1100HBMUL: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;高字節乘

DECR0

;

ACALLRADD;

DECR0(?)RET4.4常用程序舉例*52子程序:ORG1200H

RADD:ADDA,@R0;

MOV@R0,A;

MOVA,B;

INCR0

ADDCA,@R0;

MOV@R0,A;

INCR0

;

MOVA,@R0;

ADDCA,#00H;加進位

MOV@R0,A;

RET4.4常用程序舉例*53一、十六進制數與ASCII碼間的轉換

十六進制數與ASCII碼的對應關系如表所示。當十六進制數在0~9之間時,其對應的ASCII碼值為該十六進制數加30H;當十六進制數在A~F之間時,其對應的ASCII碼值為該十六進制數加37H。4.4.2碼型轉換

4.4常用程序舉例*54例將1位十六進制數轉換成相應的ASCII碼。設十六進制數存放在R0中,轉換后的ASCII碼存放于R2中。實現程序如下:ORG2400HHASC:MOVA,R0;取4位二進制數

ANLA,#0FH;屏蔽掉高4位

PUSHACC;4位二進制數入棧

CLRC;清進(借)位位

SUBBA,#0AH;用借位位的狀態判斷該數在0~9還是A~F之間

POPACC;彈出原4位二進制數

JCLOOP;借位位為1,跳轉至LOOPADDA,#07H;借位位為0,該數在A~F之間,加37HLOOP:ADDA,#30H;該數在0~9之間,加30HMOVR2,A;ASCII碼存于R2RET

4.4常用程序舉例*55例將多位十六進制數轉換成ASCII碼。

設地址指針R0指向十六進制數低位,R2中存放字節數,轉換后地址指針R0指向十六進制數的高位。R1指向要存放的ASCII碼的高位地址。實現程序如下:4.4常用程序舉例*56HTASC:MOVA,@R0;取低4位二進制數

溫馨提示

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