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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

偽指令應(yīng)用

ORG8100H DW“AB” DW100H,1ACH說明

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

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

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

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

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

ADDA,#30H;轉(zhuǎn)換成ASCII碼

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

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

ORLA,#30H;轉(zhuǎn)換成ASCII碼

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

;主程序

LCALLSUB

;調(diào)用子程序

……SUB:PUSHPSW

;現(xiàn)場保護

PUSHA

子程序處理程序段

POPA

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

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

A←A3,入口參數(shù)和出口參數(shù)為A。

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

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

R0內(nèi)部數(shù)據(jù)區(qū)

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

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

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

70H內(nèi)部數(shù)據(jù)區(qū)地址

71H內(nèi)部數(shù)據(jù)區(qū)長度出口參數(shù):無占用資源:R0,R7,70H,71H內(nèi)部RAM5F60H40H61H10H62HPCL63HPCHSP→輸出字符較多的打印子程序,遇00H停止打印

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

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

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

MOV 42H,@R1 CJNE A,42H,NOM;是否相等?不相等轉(zhuǎn)移

INC R0 ;相等,修改指針

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

MOV A,#0 ;完全相等

SJMP PENDNOM:MOV A,#0FFH ;不完全相等PEND:RET3.查表程序設(shè)計事先將計算或?qū)嶒灁?shù)據(jù)按一定順序編成表格,存于ROM內(nèi),然后根據(jù)輸入的參數(shù)值,從表中取得結(jié)果。查表指令:

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

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

-MOVC指令值PC–1例

根據(jù)R2中的值查表找出對應(yīng)的值

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

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

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

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

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

;求原碼負數(shù)絕對值

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

MOV32H,AMOVA,31HCPLAADDA,#1HMOV33H,AMOVA,32HADDCA,#0HMOV32H,AAJMPNEGTNN:MOV32H,AMOV33H,31HNEGT:SJMP$END(2)用CJNE實現(xiàn)三分支≠?Cy=0?語句組1語句組2語句組3入口YesYesNoNoCJNE出口或CY=1?例:編程實現(xiàn)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判正負判零分支間隔離開始結(jié)束y0y-1y+1x=0?x<0?YYNNCJNEMP3MP1JNBMP2例:教材p72例4-12多路分支程序根據(jù)某變量的內(nèi)容,分別轉(zhuǎn)入處理程序0、處理程序1…處理程序n。通過散轉(zhuǎn)指令JMP@A+DPTR實現(xiàn)根據(jù)R2值,轉(zhuǎn)入不同的處理程序R2=0,

轉(zhuǎn)PRG0:

R2=2,

轉(zhuǎn)PRG1;……R2=3,轉(zhuǎn)PRGn2編程提示

LJMP是3字節(jié)的指令

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

溫馨提示

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

最新文檔

評論

0/150

提交評論