微機原理與應用-04匯編語言_第1頁
微機原理與應用-04匯編語言_第2頁
微機原理與應用-04匯編語言_第3頁
微機原理與應用-04匯編語言_第4頁
微機原理與應用-04匯編語言_第5頁
已閱讀5頁,還剩68頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第4章89C51匯編語言設計主要內容匯編語言程序設計概述匯編語言源程序的匯編實用程序設計簡單程序設計分支程序設計循環程序設計散轉程序設計子程序設計查表程序§4-1匯編語言的基本概念

一.程序設計語言機器語言匯編語言高級語言1.機器語言用二進制代碼表示指令、數字和符號。能被計算機直接識別執行,響應速度最快。難認、難記、易錯、可讀性差。

2.匯編語言面向機器的符號語言,指令用助記符表示;指令直接訪問CPU的寄存器、存儲單元和I/O端口,響應速度快,程序的存儲空間利用較高;匯編語言是面向機器的語言,因此使用者必須對機器的硬件結構和指令系統比較熟悉。匯編語言的匯編匯編:匯編語言程序到機器語言程序的轉換過程。(1)人工編譯

匯編機器語言目標程序匯編語言源程序人工查指令機器代碼表十分繁鎖,且容易出錯,程序的修改比較困難(2)機器匯編用機器匯編,方便快捷,并能在匯編過程中發現語法錯誤。匯編機器語言目標程序匯編語言源程序匯編程序Medwin匯編環境示例源程序的匯編結果實例3.高級語言是以接近人的常用語言形式編寫程序的語言總稱,是一種獨立于機器的通用語言。用高級語言編寫程序與人們通常的解題步驟接近。程序的可讀性好,必須經編譯程序或解釋程序進行翻譯生成目標程序,才能執行。處理接口技術和中斷技術比較困難,不適合實時控制。二.匯編語言的格式

1.匯編語言的指令類型可執行指令:由機器能夠執行的指令,生成二進制目標代碼如MOVA,#30H<=>偽指令:提供程序匯編過程中必要控制信息的指令,不生成目標代碼

如:ORG0100H宏指令語句:用以代替匯編語言源程序中重復使用的程序段的一種語句,由匯編程序在匯編時產生相應的目標代碼74H30H2.匯編語言的指令格式(4分段)[標號:]操作碼[操作數][;注釋]例:把片外RAM2200H單元中的數送入片內70H單元中。標號域操作碼域操作數域注釋域BEGIN:MOVDPTR,#2200H;(DPTR)=2200HMOVR0,#70H;(R0)=70HMOVXA,@DPTR;(A)=((DPTR))MOV@R0,A;((R0))=(A)1、標號字段后必跟“:”號;首字符必是字母,由1~8個ASCII碼字符組成;同一標號在一個程序中只能定義一次;不能使用指令助記符、偽指令、寄存器的符號名稱;一條語句的標號可有可無,取決于本程序的其他語句是否訪問該條語句。2、操作碼字段:不能空缺3、操作數字段:單、雙、無操作數雙操作數用逗號隔開十進制數、十六進制數、

二進制數的表示工作寄存器和SFR的表示$符號的使用:

JNBF0,$<=>HERE:JNBF0HERESJMP$<=>HERE:SJMPHERE4、注釋字段:可有可無;使用時或換行時以“;”開頭§4-2匯編語言源程序的匯編

1.偽指令偽指令是非執行指令,在匯編過程中起控制作用設置目標程序設置數據塊的起始地址分配存儲單元定義符號(1)ORG定義起始地址程序中可有多條ORG語句,但定義的起始地址既不要交叉,也不要重疊。必須從小地址向大地址分配程序所占空間。(2)END定義匯編結束格式:END功能:表示匯編到此結束注意:在END命令后面的源程序不被匯編處理示例:ORG0000LJMP0100ORG0100HStart:MOVA,#5AHSJMP$END(3)EQU標號賦值格式:標號/字符串名

EQU<表達式>功能:經賦值后的標號或字符串名,可作為地址或數據在其它指令中使用,可是8位或16位。(4)DB定義字節ORG1000HDat:DB11H,-1,’A’,’BCD’END1000H11HFFH41H42H43H44H程序存儲器補碼ASCII碼‘’該指令只能為ROM賦初值,不能為其他存儲器賦初值,尤其不能為內部RAM賦初值。格式:[標號:]DB字節常數表功能:把項或項表的數值存入從標號開始的連續單元,其中項或項表可以是一個字節(8位)、數或以引號括起來的字符串。(5)DW定義字格式:[標號:]DW字常數表功能:把項或項表的數值存入從標號開始的連續單元,其中項或項表是一個字(兩字節16位)

。高字節存入低地址單元,低字節存入高地址單元只對ROM起作用(5)DW定義字例.

偽指令應用

ORG8100H DW“AB” DW100H,1ACH說明

(1)(8100H)=41H(‘A’)(8101H)=42H(‘B’)

(2)8102H單元起存放01H、00H、01H、ACH§4-3匯編語言設計實例程序設計流程分析問題,確定算法根據算法,畫出程序框圖分配內存工作區及有關端口地址按流程圖編寫程序上機匯編、調試、修改及最后確定源程序程序流程符號端點框處理框判斷框子程序框連接符流程線1.順序結構程序順序程序又稱為簡單程序,是一種最簡單、最基本的程序結構。特點:是依次執行程序中的每一條指令,直到最后一條指令。練習1.編寫一個子程序,將寄存器R0中的內容*10(積<256)2.R1中存有一壓縮的BCD碼,請編程將其轉換為ASCII碼,存入外RAM1000H單元中

設(59H)=50H;MOVA,59HMOVR0,AMOVA,#00HMOV@R0,AMOVA,#25HMOV51H,AMOV52H,#70H求:A=;(50H)=;(51H)=;(52H)=;25H

00H25H70H練習答案1.編寫一個子程序,將寄存器R0中的內容*10(積<256).解:START:MOVA,R0MOVB,#10MULABMOVR0,ARET2.R1中存有一非壓縮的BCD碼,請編程將其轉換為ASCII碼,存入外RAM1000H單元中。解:BTAS:MOVA,R1ORLA,#30HMOVDPTR,#1000HMOVX@DPTR,ARET提示:0~9的ASCII碼為30H~39H3.

存放在40H單元的壓縮BCD碼轉換為ASCII碼,并存入內存RAM的31H,30HORG2000HSTART:MOVA,40HANLA,#0FH;屏蔽高四位

ADDA,#30H;轉換成ASCII碼

MOV30H,AMOVA,40HSWAPA;高低四位互換

ANLA,#0FH;保留高位BCD碼

ORLA,#30H;轉換成ASCII碼

MOV31H,A2.子程序設計子程序是能完成某項特定功能的獨立程序段,可被反復調用。SUBR子程序可以嵌套,通常情況下8層。(1)子程序結構MAIN:……

;主程序

LCALLSUB

;調用子程序

……SUB:PUSHPSW

;現場保護

PUSHA

子程序處理程序段

POPA

;現場恢復

POPPSWRET1.子程序應取名,即子程序的入口加標號;2.子程序調用指令:ACALLaddr11LCALLaddr163.堆棧保護現場(PUSH)和恢復現場(POP);4.子程序設計要考慮參數的傳遞,即要滿足入口條件和出口狀態;5.子程序結尾必須是返回指令RET。(2)子程序的參數傳遞設計子程序應滿足通用性要求,不針對具體數據編程。由主程序提供給子程序的參數為入口參數,由子程序返回主程序的參數為出口參數。如:1.子程序功能為求單字節數的立方:

A←A3,入口參數和出口參數為A。

2.子程序功能為求單字節數的n次方: (41H)(42H)←(40H)A,入口參數為(40H)和A,出口參數為(42H)(41H)。(2)子程序的參數傳遞

a.利用寄存器(R0~R7和A)傳遞參數MAIN:……MOVR0,#30HMOVR7,#0AHACALLZERO……ZERO:MOVA,#00HLOOP:MOV@R0,AINCR0DJNZR7,LOOP子程序名:Zero功能:對內部數據區清零入口參數:

R0內部數據區

R7內部數據區長度出口參數:無占用資源:A,R0,R7主程序用PUSH指令將入口參數壓入堆棧,進入子程序后通過POP指令間接訪問堆棧中的參數。子程序可用堆棧將出口參數傳遞給主程序。注意:

ACALL、LCALL指令斷點地址自動進棧,RET指令自動彈出斷點地址。(2)子程序的參數傳遞

b.通過堆棧傳遞參數數據區清零,起始地址放在70H,被清零單元個數放在71HORG0100HMain:MOVSP,#5FHMOV70H,#40HMOV71H,#10HPUSH70HPUSH71HLCALLZeroSJMP$ZERO:POPDPHPOPDPLPOP07H;R7POP00H;R0CLRALOOP:MOV@R0,AINCR0DJNZ,R7,LOOPPUSHDPLPUSHDPHRETEND子程序名:Zero功能:對內部數據區清零入口參數:

70H內部數據區地址

71H內部數據區長度出口參數:無占用資源:R0,R7,70H,71H內部RAM5F60H40H61H10H62HPCL63HPCHSP→輸出字符較多的打印子程序,遇00H停止打印

ORG0000HMain:MOVSP,#6FHLCALLPRINTDB‘THISISAN’DB’EXAMPLE’DB0AH,0DH,00HNEXT:……PRINT:POPDPHPOPDPLPPP1:MOVA,#00HMOVCA,@A+DPTR

INCDPTRJZPPPENDPPP2:(打印程序)…….SJMPPPP1PPPEND:JMP@A+DPTR(2)子程序的參數傳遞

c.利用數據指針傳遞例比較兩個數據串是否完全相等,若完全相等,A=0;否則A=FFH。PMT:MOV R2,A ;設數串長度CHC:MOV A,@R0;各取數串中的一個數

MOV 42H,@R1 CJNE A,42H,NOM;是否相等?不相等轉移

INC R0 ;相等,修改指針

INC R1 DJNZ R2,CHC ;全部比較完?

MOV A,#0 ;完全相等

SJMP PENDNOM:MOV A,#0FFH ;不完全相等PEND:RET3.查表程序設計事先將計算或實驗數據按一定順序編成表格,存于ROM內,然后根據輸入的參數值,從表中取得結果。查表指令:

MOVCA,@A+DPTRMOVCA,@A+PCMOVCA,@A+DPTR數據表頭地址存入DPTR要查得的數在表中相對表頭的偏移量送入A,可在64KB內查表MOVCA,@A+PC用傳送指令把所查數據的項數送入累加器A;使用ADDA,#data,修正A,data值=查表指令和數據表格間的字節數;data=數據表頭地址-PC當前值

=數據表頭地址-(查表指令PC值+1)用指令MOVCA,@A+PC完成查表例根據A的值查表找出對應的ASCII碼7402240383F880FE30313233MOVA,#02H;ADDA,#03H;MOVCA,@A+PCMOVR0,ASJMP$‘0’表頭‘1’‘2’‘3’2000200120022003200420052006200720082009200A2008例如:查找‘2’的ASCII碼偏移量=2008-2004-1=33B偏移量=表頭地址

-MOVC指令值PC–1例

根據R2中的值查表找出對應的值

MOVA,R2ADDA,R2;R2*2MOVR3,A

ADDA,#07HMOVCA,@A+PCXCHA,R3

ADDA,#03+1MOVCA,@A+PCMOVR4,ASJMP$TAB1:DW1520H……012345152075862345100008839943TAB11B2B1B1B2B7B3BR2y=f(R2)4.分支結構程序設計分支程序的基本形式用條件轉移語句實現二分支用CJNE實現三分支用JMP@A+DPTR實現多分支(1)用條件語句實現二分支根據不同的條件,執行不同的程序段。JZ、JNZ、JC、JNC、JB、JNB、CJNE、DJNZ正確合理地運用例

:求補碼,雙字節原碼放在30H和31H,補碼存放在32H和33H思路:原碼形式的正數,其補碼同原碼。原碼形式的負數,其補碼等于其反碼加1

MOVA,30HJNBACC.7,NN;判斷原碼符號S:ANLA,#7FH

;求原碼負數絕對值

CPLA;求原碼的補碼(模-1-原碼負數絕對值)

MOV32H,AMOVA,31HCPLAADDA,#1HMOV33H,AMOVA,32HADDCA,#0HMOV32H,AAJMPNEGTNN:MOV32H,AMOV33H,31HNEGT:SJMP$END(2)用CJNE實現三分支≠?Cy=0?語句組1語句組2語句組3入口YesYesNoNoCJNE出口或CY=1?例:編程實現y=(R0)x(R1)y2、判正負CJNER0,#0,ZEROCLRCMOVA,R0SUBBA,#0JZZEROMOVA,R0JZZERO1、判零三種方法MOVA,R0JNBACC.7,positive

CJNER0,#0,MP1MOVR1,#0

SJMPMP3MP1:MOVA,R0JNBACC.7,MP2MOVR1,#0FFH

SJMPMP3MP2:MOVR1,#01HMP3:SJMP$ENDy=(R0)x(R1)y判正負判零分支間隔離開始結束y0y-1y+1x=0?x<0?YYNNCJNEMP3MP1JNBMP2例:教材p72例4-12多路分支程序根據某變量的內容,分別轉入處理程序0、處理程序1…處理程序n。通過散轉指令JMP@A+DPTR實現根據R2值,轉入不同的處理程序R2=0,

轉PRG0:

R2=2,

轉PRG1;……R2=3,轉PRGn2編程提示

LJMP是3字節的指令

A是否能夠放得下變址數據5.循環程序設計將片外RAMl000H開始的10個單元清零循環程序的結構循環初始化:地址指針、循環次數、寄存器循環體:要求重復執行的程序段部分循環控制:修改地址指針、循環變量、循環判終計數循環結構示意圖條件循環結構示意圖例:數據塊求和設有20個單字節數,存放在RAM從30H開始的單元中,求累加和(雙字節),存放在60H、61H單元參考源程序例:尋找最大值設一個無符號的數據塊,起始地址為片外RAM3000H,其長度未知,只知道結束字節為00H。求這個數據塊中的最大值,結果存入片內RAM的MAX單元。條件循環結構參考源程序課堂練習編寫程序實現兩個4位BCD數相加,設被加數存放在內部RAM40H和41H單,加數存放在45H和46H單元,和數存入50H和51H單元,并設最高位不產生進位。欲將片外數據存儲器中7000H一70FFH單元全部清零?求內部RAM中的50H~5AH中的最大值并放入5AH單元。課堂練習1參考程序課堂練習2參考程序課堂練習3參考程序4.4匯編語言應用程序的開發與調試匯編語言程序需要調試,89C51沒有程序編輯、調試功能,也不能實現硬件電路的診斷、調試。借助開發工具模擬單片機,觀察程序運行過程——單片機仿真開發系統。4.4.1仿真開發系統簡介1、仿真開發系統的功能用戶樣機硬件電路的診斷、檢查;用戶樣機程序的輸入與修改;程序的運行、調試(單步、設置斷點)、排錯、狀態查詢;將程序寫入ROM中4.4.1仿真開發系統簡介完善的仿真開發系統的功能還有:較全的開發軟件:可用C語言編程、可編譯程序連接生成目標文件和可執行文件、可用匯編語言編程、反匯編功能、豐富的子程序可供調用。有跟蹤調試、

溫馨提示

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

最新文檔

評論

0/150

提交評論