C的匯編語言程序設(shè)計課件_第1頁
C的匯編語言程序設(shè)計課件_第2頁
C的匯編語言程序設(shè)計課件_第3頁
C的匯編語言程序設(shè)計課件_第4頁
C的匯編語言程序設(shè)計課件_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章80C51的匯編語言程序設(shè)計程序編制的方法和技巧4.1源程序的編輯和匯編4.2基本程序結(jié)構(gòu)4.3子程序及其調(diào)用4.4簡單I/O設(shè)備的并口直接驅(qū)動示例4.52023/9/201第4章80C51的匯編語言程序設(shè)計程序編制的方法和技巧4.

單片機應(yīng)用系統(tǒng)由硬件系統(tǒng)和應(yīng)用程序構(gòu)成匯編語言高級語言

應(yīng)用程序設(shè)計方法

匯編語言,生成的目標程序占內(nèi)存空間少、運行速度快,具有效率高、實時性強。

高級語言,對系統(tǒng)的功能描述與實現(xiàn)簡單,程序閱讀、修改和移植方便,適合于編寫復(fù)雜的程序。2023/9/202單片機應(yīng)用系統(tǒng)由硬件系統(tǒng)和應(yīng)用程序構(gòu)成匯編語言應(yīng)用程序4.1程序編制的方法和技巧4.1.1程序編制的步驟明確任務(wù):功能要求、技術(shù)指標運行環(huán)境調(diào)研

任務(wù)分析將實際問題轉(zhuǎn)化為計算機處理的程序算法算法比較與優(yōu)化(內(nèi)存需求與運行速度)

算法設(shè)計2023/9/2034.1程序編制的方法和技巧4.1.1程序編制的步驟明

流程描述

流程圖符號“超級循環(huán)”框架2023/9/204流程描述流程圖符號“超級循環(huán)”框架2023/8/64強化模塊觀念使程序占用空間減少、結(jié)構(gòu)清晰循環(huán)初值和結(jié)束條件,避免“死機”現(xiàn)象子程序的現(xiàn)場保護(注意棧平衡、寄存器內(nèi)容)程序模塊(主程序模塊、各種子程序模塊)模塊化優(yōu)點:分塊設(shè)計、便于閱讀、調(diào)試方便4.1.2程序編制的方法和技巧采用循環(huán)和子程序?qū)χ袛嘧映绦蜻€有注意保護PSW的內(nèi)容2023/9/205強化模塊觀念使程序占用空間減少、結(jié)構(gòu)清晰程序模塊(主程序模4.1.3匯編語言的語句格式非數(shù)字字符開頭,后跟字母、數(shù)字、“-”、“?”等不能用已定義的保留字(指令助記符、偽指令等)后跟英文冒號“:”Keil的匯編器A51可以識別的語句形式為:標號(即符號地址)[標號:]指令助記符

[操作數(shù)1,][操作數(shù)2,][操作數(shù)3,][;注釋]指令助記符是指令功能的英文縮寫。2023/9/2064.1.3匯編語言的語句格式非數(shù)字字符開頭,后跟字母、數(shù)字數(shù)據(jù):二進制(B)十進制(D或省略D)十六進制(H),注意A~F開頭時要加“0”ASCII碼,如‘A’,‘1245’符號:符號名、標號或“$”(PC的當前值)表達式:由運算符和數(shù)據(jù)構(gòu)成(見表4.1)操作數(shù)注釋英文分號“;”開頭2023/9/207數(shù)據(jù):二進制(B)操作數(shù)注釋英文分號“;”開頭2023/優(yōu)先級運算符功能表達式及其結(jié)果示例高↓↓↓↓↓↓↓低·()括號4*(5+6)即44NOT、HIGH、LOW取反、取高字節(jié)、取低字節(jié)NOT55H即AAH;HIGH1234H即12H+、-正號、負號+5、-6*、/、MOD乘、除(取商)、取余數(shù)17/5即3;17MOD5即2+、-加、減5+4即9;5-4=即1SHL、SHR左移、右移2SHL2即8;8SHR2即2AND、OR、XOR與、或、異或45HAND0FH即05H<、>、=、<>、<=、>=比較運算符MOVA,X>8;若X>8為真,則為MOVA,01H若X>8為假,則為MOVA,00H表4.12023/9/208優(yōu)先級運算符功能表達式及其結(jié)果示例高()4.2源程序的編輯和匯編目標程序的產(chǎn)生過程如下圖:2023/9/2094.2源程序的編輯和匯編目標程序的產(chǎn)生過程如下圖:2024.2.1源程序的編輯和匯編源程序的編輯

ORG0000HLJMPMAIN

ORG0040HMAIN:MOVR7,#16MOVR0,#60HMOVA,#55HLOOP:MOV@R0,AINCR0DJNZR7,LOOPSJMP$

END依據(jù)匯編語言規(guī)則用好偽指令符號不用中文SJMP$

用于調(diào)試以.ASM存盤2023/9/20104.2.1源程序的編輯和匯編源程序的編輯ORG源程序的匯編匯編源程序轉(zhuǎn)為目標程序的過程叫匯編匯編通常在Windows下的集成開發(fā)環(huán)境完成用A51.EXE匯編生成.OBJ、.LIB及.LST目標程序的連接.OBJ、.LIB經(jīng)BL51.EXE生成無擴展名的絕對地址目標文件絕對地址目標文件可以用于仿真器調(diào)試調(diào)試無誤的目標文件用OH51.EXE轉(zhuǎn)換為.HEX文件.HEX文件經(jīng)編程器寫入單片機存儲器2023/9/2011源程序的匯編匯編源程序轉(zhuǎn)為目標程序的過程叫匯編目標程序的4.2.2偽指令偽指令,也叫匯編命令。僅對匯編過程進行指示偽指令無對應(yīng)的單片機可執(zhí)行代碼起始地址設(shè)定偽指令ORGORG表達式表達式通常為十六進制地址,例:

ORG8000HSTART:MOVA,#30H……ORG可多次使用,但地址值的順序要由小到大結(jié)束匯編偽指令ENDEND該偽指令位于源程序的最后一行。2023/9/20124.2.2偽指令偽指令,也叫匯編命令。僅對匯編過程進行指示定義字節(jié)數(shù)據(jù)表偽指令DB定義字數(shù)據(jù)表偽指令DW1000H[標號:]DB字節(jié)數(shù)據(jù)表如:ORG1000HDB-2,-4,-6,8,10,18FEHFCHFAH08H0AH12H1001H[標號:]DW字數(shù)據(jù)表ORG1400HDATA1:DW324AH,3CH……1400H32H4AH00H3CH1401H1402H1403H大端模式2023/9/2013定義字節(jié)數(shù)據(jù)表偽指令DB定義字數(shù)據(jù)表偽指令DW1000H[定義常值為符號名偽指令EQU符號名EQU常值表達式

LEN

EQU10

SUM

EQU21HBLOCK

EQU22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,A符號名為:地址常數(shù)段名字符串寄存器名位名比較:標號只能是地址2023/9/2014定義常值為符號名偽指令EQU符號名EQU常值表達式定義位地址為符號名偽指令BIT符號名BIT位地址表達式如:STBITP1.0;將P1.0的位地址賦給符號名STCFBIT0D7H;將位地址為D7H的位定義為符號名用BIT定義的“符號名”一經(jīng)定義便不能重新定義和改變其它一些偽指令參見教材表4.22023/9/2015定義位地址為符號名偽指令BIT符號名BIT位地址表4.3基本程序結(jié)構(gòu)一般不影響標志寄存器PSW的狀態(tài)。傳送類指令有兩大類

一般傳送(MOV)特殊傳送,如:MOVCMOVXPUSH、POPXCH、XCHDSWAP

2023/9/20164.3基本程序結(jié)構(gòu)一般不影響標志寄存器PSW的狀態(tài)。傳4.3.1順序程序(無分支、無循環(huán))4.3基本程序結(jié)構(gòu)【例4-1】片內(nèi)RAM的21H單元存放一個十進制數(shù)據(jù)十位的ASCII碼,22H單元存放該數(shù)據(jù)個位的ASCII碼。編寫程序?qū)⒃摂?shù)據(jù)轉(zhuǎn)換成壓縮BCD碼存放在20H單元。2023/9/20174.3.1順序程序(無分支、無循環(huán))4.3基本程序結(jié)構(gòu)ORG0040HSTART:MOVA,21H;取十位ASCII碼ANLA,#0FH;保留低半字節(jié)SWAPA;移至高半字節(jié)MOV20H,A;存于20H單元MOVA,22H;取個位ASCII碼ANLA,#0FH;保留低半字節(jié)ORL20H,A;合并到結(jié)果單元SJMP$END2023/9/2018ORG0040H2023/8/6184.3.2分支程序(單分支、雙分支、多分支)【例4-2】設(shè)變量x以補碼的形式存放在片內(nèi)RAM的30H單元,變量y與x的關(guān)系是:當x大于0時,y=x;當x=0時,y=20H;當x小于0時,y=x+5。編制程序,根據(jù)x的大小求y并送回原單元。2023/9/20194.3.2分支程序(單分支、雙分支、多分支)【例4-2】設(shè)

ORG0040HSTART:MOVA,30H;取x至累加器

JZNEXT;x=0,轉(zhuǎn)NEXTANLA,#80H;否,保留符號位

JZDONE;x>0,轉(zhuǎn)結(jié)束

MOVA,#05H;x<0處理

ADDA,30HMOV30H,A;X+05H送YSJMPDONENEXT:MOV30H,#20H;x=0,20H送YDONE:SJMPDONEEND2023/9/2020ORG0040H2023/8/620【例4-3】根據(jù)R7的內(nèi)容x(轉(zhuǎn)移序號)轉(zhuǎn)向相應(yīng)的處理程序。設(shè)R7內(nèi)容為0~4,對應(yīng)的處理程序入口地址分別為PP0~PP4。

2023/9/2021【例4-3】根據(jù)R7的內(nèi)容x(轉(zhuǎn)移序號)轉(zhuǎn)向相應(yīng)的處理程序。START:MOVR7,#3;以轉(zhuǎn)移序號3為例

ACALLJPNUMAJMPSTARTJPNUM:MOVDPTR,#TAB;置分支入口地址表首址

MOVA,R7

ADDA,R7;乘2,調(diào)整偏移量

MOVR3,AMOVCA,@A+DPTR;取地址高字節(jié),暫存于R3XCHA,R3INCAMOVCA,@A+DPTR;取地址低字節(jié)

MOVDPL,A;處理程序入口地址低8位送DPLMOVDPH,R3;處理程序入口地址高8位送DPHCLRA

JMP@A+DPTR

2023/9/2022START:MOVR7,#3;以轉(zhuǎn)移序TAB:DWPP0DWPP1DWPP2

DWPP3DWPP4PP0:MOV30H,#0;轉(zhuǎn)移序號為0時,置功能號“0”于30H單元

RETPP1:MOV30H,#1;轉(zhuǎn)移序號為1時,置功能號“1”于30H單元

RETPP2:MOV30H,#2;轉(zhuǎn)移序號為2時,置功能號“2”于30H單元

RET

PP3:MOV30H,#3;轉(zhuǎn)移序號為3時,置功能號“3”于30H單元

RETPP4:MOV30H,#4;轉(zhuǎn)移序號為4時,置功能號“4”于30H單元

RET 2023/9/2023TAB:DWPP02023/8/6234.3.3循環(huán)程序(2種:先執(zhí)行,后判斷;先判斷,后執(zhí)行)【例4-4】將內(nèi)部RAM的30H至3FH單元初始化為00H。MAIN:MOVR0,#30H;置初值

MOVA,#00H;MOVR7,#16;LOOP:MOV@R0,A;循環(huán)處理

INCR0;DJNZR7,LOOP;循環(huán)修改,判結(jié)束

SJMP$;結(jié)束處理2023/9/20244.3.3循環(huán)程序(2種:先執(zhí)行,后判斷;先判斷,后執(zhí)行)【例4-5】將內(nèi)部RAM起始地址為60H的數(shù)據(jù)串傳送到外部RAM中起始地址為1000H的存儲區(qū)域,直到發(fā)現(xiàn)‘$’字符停止傳送。MAIN:MOVR0,#60H;置初值

MOVDPTR,#1000HLOOP0:MOVA,@R0;取數(shù)據(jù)CJNEA,#24H,LOOP1;循環(huán)結(jié)束?SJMPDONE;是LOOP1:MOVX@DPTR,A;循環(huán)處理

INCR0;循環(huán)修改

INCDPTRSJMPLOOP0;繼續(xù)循環(huán)DONE:SJMPDONE;結(jié)束處理2023/9/2025【例4-5】將內(nèi)部RAM起始地址為60H的數(shù)據(jù)串傳送到外部R4.4子程序及其調(diào)用完成通用功能、反復(fù)使用的程序設(shè)計成子程序。使應(yīng)用程序結(jié)構(gòu)清晰緊湊,便于閱讀和調(diào)試

執(zhí)行要由其它程序來調(diào)用,執(zhí)行完后要返回到調(diào)用程序

結(jié)構(gòu)上仍然采用一般程序的3種結(jié)構(gòu)調(diào)用時注意:一是現(xiàn)場的保護和恢復(fù);二是主程序與子程序間的參數(shù)傳遞。2023/9/20264.4子程序及其調(diào)用完成通用功能、反復(fù)使用的程序4.4.1現(xiàn)場保護與恢復(fù)在主程序中實現(xiàn)(結(jié)構(gòu)靈活)PUSHPSW;保護現(xiàn)場(含當前工作寄存器組號)PUSHACC;PUSHB;MOVPSW,#10H;切換當前工作寄存器組LCALLaddr16;子程序調(diào)用,POPB;恢復(fù)現(xiàn)場POPACC;POPPSW;含當前工作寄存器組切換2023/9/20274.4.1現(xiàn)場保護與恢復(fù)在主程序中實現(xiàn)(結(jié)構(gòu)靈活)PUS在子程序中實現(xiàn)(程序規(guī)范、清晰)SUB1:PUSHPSW;保護現(xiàn)場(含當前工作寄存器組號)

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

……POPB;恢復(fù)現(xiàn)場

POPACC;POPPSW;內(nèi)含當前工作寄存器組切換

RET2023/9/2028在子程序中實現(xiàn)(程序規(guī)范、清晰)SUB1:PUSHPSW4.4.2參數(shù)傳遞利用累加器或寄存器(簡單、快速,但參數(shù)個數(shù)不多)【例4-6】實現(xiàn)兩個8位的十六進制無符號數(shù)求和的子程序。SADD:MOVA,R3;取加數(shù)(在R3中)

CLRCADDA,R4;被加數(shù)(在R4中)加AJCPP1MOVR3,#00H;結(jié)果小于255時,高字節(jié)R3內(nèi)容為00HSJMPPP2PP1:MOVR3,#01H;結(jié)果大于255時,高字節(jié)R3內(nèi)容為01HPP2:MOVR4,A;結(jié)果的低字節(jié)在R4中

RET入口:(R3)=加數(shù);(R4)=被加數(shù)。出口:(R3)=和的高字節(jié);(R4)=和的低字節(jié)。2023/9/20294.4.2參數(shù)傳遞利用累加器或寄存器(簡單、快速,但參數(shù)個利用存儲器(個數(shù)多,用R0或R1及DPTR為參數(shù)表指針)【例4-7】將內(nèi)部RAM中兩個4字節(jié)無符號整數(shù)相加,和的高字節(jié)由R0指向。數(shù)據(jù)采用大端模式存儲。入口:(R0)=加數(shù)低字節(jié)地址;(R1)=被加數(shù)低字節(jié)地址。出口:(R0)=和的高字節(jié)起始地址。NADD:MOVR7,#4;字節(jié)數(shù)4送計數(shù)器

CLRC;NADD1:MOVA,@R0;利用指針,取加數(shù)低字節(jié)

ADDCA,@R1;利用指針,被加數(shù)低字節(jié)加AMOV@R0,A;DECR0DECR1DJNZR7,NADD1INCR0;調(diào)整指針,指向出口

RET2023/9/2030利用存儲器(個數(shù)多,用R0或R1及DPTR為參數(shù)表指針)【例利用堆棧

【例4-8】將內(nèi)部RAM中20H單元中的1個字節(jié)十六進制數(shù)轉(zhuǎn)換為2位ASCII碼,存放在R0指示的兩個單元中。入口:預(yù)轉(zhuǎn)換數(shù)據(jù)(低半字節(jié))在棧頂出口:轉(zhuǎn)換結(jié)果(ASCII碼)在棧頂HEASC:MOVR1,SP;借用R1為堆棧指針

DECR1DECR1;R1指向被轉(zhuǎn)換數(shù)據(jù)

XCHA,@R1;取被轉(zhuǎn)換數(shù)據(jù)

ANLA,#0FH;取一位十六進制數(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,46H2023/9/2031利用堆棧【例4-8】將內(nèi)部RAM中20H單元中的1個字節(jié)驗證程序段MAIN:MOVA,20H;SWAPAPUSHACC;預(yù)轉(zhuǎn)換的數(shù)據(jù)(在低半字節(jié))入棧

ACALLHEASCPOPACC;彈出棧頂結(jié)果于ACC中

MOV@R0,A;存轉(zhuǎn)換結(jié)果高字節(jié)

INCR0;修改指針

PUSH20H;預(yù)轉(zhuǎn)換的數(shù)據(jù)(在低半字節(jié))入棧

ACALLHEASCPOPACC;彈出棧頂結(jié)果于ACC中

MOV@R0,A;存轉(zhuǎn)換結(jié)果低字節(jié)

SJMP$2023/9/2032驗證程序段MAIN:MOVA,20H;24.4.3常用子程序示例(略)2023/9/20334.4.3常用子程序示例(略)2023/8/6334.5簡單I/O設(shè)備的并口直接驅(qū)動示例4.5.1獨立式鍵盤與LED顯示示例【例4-17】數(shù)據(jù)端與P0口正序連接。編寫程序,分別實現(xiàn)功能:上電后數(shù)碼管顯示“P”,按下任何鍵后,顯示從“0”開始每隔1秒加1,加至“F”后,數(shù)碼管顯示“P”,進入等待按鍵狀態(tài)。2023/9/20344.5簡單I/O設(shè)備的并口直接驅(qū)動示例4.5.1獨立式鍵TEMPEQU30H ORG0000H JMPSTARTORG0100HSTART:MOVSP,#5FHMOVP0,#8CH;顯示"P" MOVP3,#0FFHNOKEY:MOVA,P3 CPLA JZNOKEY;無鍵按下

MOVTEMP,P3;有鍵按下

CALLD10ms MOVA,P3 CJNEA,TEMP,NOKEY;去抖

MOVR7,#16 MOVR2,#0LOOP:MOVA,R2MOVDPTR,#CODE_P0MOVCA,@A+DPTRMOVP0,AINCR2SETBRS0;切換組CALLD_1SCLRRS0DJNZR7,LOOP JMPSTARTD_1S:(子程序)D10ms:(子程序)

CODE_P0:DB0C0H,0F9H,0A4H,0B0HDB

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論