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

下載本文檔

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

文檔簡介

第4章80C51的匯編語言程序設計程序編制的方法和技巧4.1源程序的編輯和匯編4.2基本程序結構4.3子程序及其調用4.4簡單I/O設備的并口直接驅動示例4.52023/9/201第4章80C51的匯編語言程序設計程序編制的方法和技巧4.

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

應用程序設計方法

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

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

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

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

流程描述

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

[操作數1,][操作數2,][操作數3,][;注釋]指令助記符是指令功能的英文縮寫。2023/9/2064.1.3匯編語言的語句格式非數字字符開頭,后跟字母、數字數據:二進制(B)十進制(D或省略D)十六進制(H),注意A~F開頭時要加“0”ASCII碼,如‘A’,‘1245’符號:符號名、標號或“$”(PC的當前值)表達式:由運算符和數據構成(見表4.1)操作數注釋英文分號“;”開頭2023/9/207數據:二進制(B)操作數注釋英文分號“;”開頭2023/優(yōu)先級運算符功能表達式及其結果示例高↓↓↓↓↓↓↓低·()括號4*(5+6)即44NOT、HIGH、LOW取反、取高字節(jié)、取低字節(jié)NOT55H即AAH;HIGH1234H即12H+、-正號、負號+5、-6*、/、MOD乘、除(取商)、取余數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)先級運算符功能表達式及其結果示例高()4.2源程序的編輯和匯編目標程序的產生過程如下圖:2023/9/2094.2源程序的編輯和匯編目標程序的產生過程如下圖:2024.2.1源程序的編輯和匯編源程序的編輯

ORG0000HLJMPMAIN

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

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

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

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

LEN

EQU10

SUM

EQU21HBLOCK

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

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

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

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

JZNEXT;x=0,轉NEXTANLA,#80H;否,保留符號位

JZDONE;x>0,轉結束

MOVA,#05H;x<0處理

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

2023/9/2021【例4-3】根據R7的內容x(轉移序號)轉向相應的處理程序。START:MOVR7,#3;以轉移序號3為例

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

MOVA,R7

ADDA,R7;乘2,調整偏移量

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;以轉移序TAB:DWPP0DWPP1DWPP2

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

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

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

RET

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

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

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

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

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

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

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

INCR0;循環(huán)修改

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

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

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

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

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

POPACC;POPPSW;內含當前工作寄存器組切換

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

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

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

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

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

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

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

DECR1DECR1;R1指向被轉換數據

XCHA,@R1;取被轉換數據

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

ADDA,#2;偏移調整,所加值為MOVC與DB間總字節(jié)數

MOVCA,@A+PC;查表

XCHA,@R1;1字節(jié)指令,存結果于堆棧中

RET;1字節(jié)指令ASCTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H2023/9/2031利用堆?!纠?-8】將內部RAM中20H單元中的1個字節(jié)驗證程序段MAIN:MOVA,20H;SWAPAPUSHACC;預轉換的數據(在低半字節(jié))入棧

ACALLHEASCPOPACC;彈出棧頂結果于ACC中

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

INCR0;修改指針

PUSH20H;預轉換的數據(在低半字節(jié))入棧

ACALLHEASCPOPACC;彈出棧頂結果于ACC中

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

SJMP$2023/9/2032驗證程序段MAIN:MOVA,20H;24.4.3常用子程序示例(略)2023/9/20334.4.3常用子程序示例(略)2023/8/6334.5簡單I/O設備的并口直接驅動示例4.5.1獨立式鍵盤與LED顯示示例【例4-17】數據端與P0口正序連接。編寫程序,分別實現(xiàn)功能:上電后數碼管顯示“P”,按下任何鍵后,顯示從“0”開始每隔1秒加1,加至“F”后,數碼管顯示“P”,進入等待按鍵狀態(tài)。2023/9/20344.5簡單I/O設備的并口直接驅動示例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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論