第四章匯編語言程序設計_第1頁
第四章匯編語言程序設計_第2頁
第四章匯編語言程序設計_第3頁
第四章匯編語言程序設計_第4頁
第四章匯編語言程序設計_第5頁
已閱讀5頁,還剩38頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第四章匯編語言程序設計提要程序設計概述匯編語言源程序的編輯和匯編匯編語言程序設計2023年12月14日2第1節程序設計概述1、程序設計語言簡介2、匯編語言程序設計初步2023年12月14日31、程序設計語言簡介常用的編程語言是匯編語言和高級語言。1.匯編語言用英文字符來代替機器語言,這些英文字符被稱為助記符匯編語言:用助記符表示的指令。匯編語言源程序:用匯編語言編寫的程序。優點:用匯編語言編寫程序效率高,占用存儲空間小,運行速度快,能編寫出最優化的程序。缺點:可讀性差,離不開具體的硬件,是面向“硬件”的語言通用性差。2023年12月14日41、程序設計語言簡介2.高級語言不受具體“硬件”的限制,優點:通用性強,直觀、易懂、易學,可讀性好。目前多數的51單片機用戶使用C語言(C51)來進行程序設計,已公認為高級語言中高效簡潔而又貼近51單片機硬件的編程語言。將C語言向單片機上移植,始于20世紀80年代的中后期。匯編語言設計步驟(1)分析題意,明確要求(2)確定算法(3)畫程序流程圖(4)分配內存工作單元(5)編寫源程序(6)程序優化(7)上機調試、修改和最后確定源程序4.2匯編語言源程序的編輯和匯編偽指令源程序的編輯和匯編1、偽指令(1)指令語句已在第3章介紹。每一指令語句在匯編時都產生一個指令代碼(機器代碼),執行該指令代碼對應著機器的一種操作。(2)偽指令語句是控制匯編(翻譯)過程的一些控制命令。在匯編時沒有機器代碼與之對應。下面介紹偽指令語句。1、偽指令1.ORG(ORiGin)匯編起始地址命令 源程序的開始,用一條ORG偽指令規定程序的起始地址。如果不用ORG,則匯編得到的目標程序將從0000H地址開始。例如:

ORG 2000HSTART:

MOV A,#00H

……即規定標號START代表地址為2000H開始。在一源程序中,可多次用ORG指令,規定不同的程序段的起始地址。但是,地址必須由小到大排列,且不能交叉、重疊。例如:ORG 2000H……ORG 2500H……ORG 3000H……這種順序是正確的。若按下面順序的排列則是錯誤的,因為地址出現了交叉。ORG 2500H……ORG 2000H……ORG 3000H……1、偽指令2.

END(ENDofAssembly)匯編終止命令源程序結束標志,終止源程序的匯編工作。整個源程序中只能有一條END命令,且位于程序的最后。如果END出現在程序中間,其后的源程序,將不進行匯編處理。1、偽指令3.DB(DefineByte)定義數據字節命令格式:[標號:]DB8位字節數據表用于從(標號)指定的地址開始,在程序存儲器連續單元中定義字節數據。例如:

ORG 1000HDB -2,-4,100,30H,‘C’,‘A’1、偽指令4、DW(DefineWord)定義字數據命令該命令用于從指定的地址開始,在程序存儲器的連續單元中定義16位的字數據。例如:ORG 2000HDATA:DW 1246H,7BH,10匯編后(2000H)=12H (2001H)=46H ;第1個字(2002H)=00H (2003H)=7BH ;第2個字(2004H)=00H (2005H)=0AH ;第3個字1、偽指令5.DS(DefineStorage)定義存儲區命令從指定地址開始,保留指定數目的字節單元作為存儲區,供程序運行使用。例如:

TABEL:DS 10表示從TABEL代表的地址開始,保留10個連續的地址單元。又例如:

ORG 2000H DS 10H表示從2000H地址開始,保留16個連續地址單元。2023年12月14日141、偽指令6.EQU(EQUate)標號賦值命令用于給標號賦值。賦值后,標號值在整個程序有效。例如:TEST: EQU2000H

表示TEST=2000H,匯編時,凡是遇到TEST時,均以2000H來代替。2023年12月14日152、源程序的編輯和匯編1、源程序的編輯2、源程序的匯編2023年12月14日164.3匯編語言程序設計順序結構分支結構循環結構子程序結構2023年12月14日174.3.1順序結構例:兩個無符號雙字節數相加。設被加數存放于內部RAM的40H(高位字節),41H(低位字節),加數存放于50H(高位字節),51H(低位字節),和數存入40H和41H單元中。2023年12月14日18程序如下:START:CLRC;將Cy清零

MOVR0,#41H;將被加數地址送數據指針R0MOVR1,#51H;將加數地址送數據指針R1AD1:MOVA,@R0;被加數低字節的內容送入AADDA,@R1;兩個低字節相加MOV@R0,A;低字節的和存入被加數低字節中

DECR0;指向被加數高位字節

DECR1;指向加數高位字節

MOVA,@R0;被加數高位字節送入AADDCA,@R1;兩個高位字節帶Cy相加

MOV@R0,A;高位字節的和送被加數高位字節2023年12月14日194.3.2分支程序設計2023年12月14日20(a)單分支流程;(b)多分支流程例設變量X存放在內部RAM30H單元,函數值Y存入內部RAM31H單元。試編程,按照下式的要求給Y賦值。1X>0Y=0

X=0-1X<02023年12月14日212023年12月14日22開始A←XA=0A>0A=-1A=1存結果結束YNNYORG0200HMOVA,30H

;JZ

COMPJNB

ACC.7,POSIMOV

A,#0FFHSJMP

COMPPOSI:MOV

A,#1COMP:MOV

31H,AEND2023年12月14日234.3.3循環程序設計2023年12月14日24循環的組成

循環程序一般由四個主要部分組成:(1)初始化部分:為循環程序做準備,如規定循環次數、給各變量和地址指針預置初值。

(2)處理部分:為反復執行的程序段,是循環程序的實體,也是循環程序的主體。

(3)循環控制部分:這部分的作用是修改循環變量和控制變量,并判斷循環是否結束,直到符合結束條件時,跳出循環為止。

(4)結束部分:這部分主要是對循環程序的結果進行分析、處理和存放。2023年12月14日25例:編寫多字節無符號數加法程序設有兩個多字節無符號數分別存放在內部RAM的DAT1和DAT2開始的區域中(低字節先存),字節個數放在R2中,求它們的和,并將結果存放在DAT1開始的區域中。2023年12月14日262023年12月14日27開始循環初始化讀取被加數兩數相加傳送部分和到目的單元指向下一個被加數和加數全部相加完畢處理高字節進位結束NYORG0400HMOVR0,#DAT1MOVR1,#DAT2CLRCLOOP:MOVA,@R0ADDCA,@R1MOV@R0,AINCR0INCR1DJNZR2,LOOPCLRAADDCA,#0MOV@R0,AEND2023年12月14日28多重循環例5秒延時程序。延時程序與MCS-51執行指令的時間有關,如果使用12MHz晶振,一個機器周期為1μs,計算出一條指令以至一個循環所需要的執行時間,給出相應的循環次數,便能達到延時的目的。5秒延時程序如下:2023年12月14日29DELAY:MOVR5,#50DEL0:MOVR6,#200#49901539980306DEL1:MOVR7,#248DEL2:DJNZR7,$;DEL2DJNZR6,DEL1DJNZR5,DEL0RET2023年12月14日304.3.4子程序設計子程序的概念

通常把那些基本操作功能編制為一個獨立夫人程序段,這些就是可供不同程序或同一程序反復調用的子程序。在程序中需要執行這種操作的地方放置一條調用指令,當程序執行到調用指令,就轉到子程序中完成規定的操作,并返回到原來的程序繼續執行下去。2023年12月14日31子程序結構與設計注意事項子程序中必須有一條子程序返回指令(RET),其功能是當子程序執行完后能自動返回到主程序中去。注意事項:(1)子程序名(2)明確入口條件、出口條件(3)注意保護現場和恢復現場2023年12月14日32子程序的調用與返回子程序的調用調用子程序的指令有“ACALL”和“LCALL”,“LCALL”:16位入口地址

“ACALL”:11位入口地址,另5位由PC提供執行調用指令時,先將程序地址指針PC改變(“ACALL”加2,“LCALL”加3),然后PC值壓入堆棧,用新的地址值代替。執行返回指令時,再將PC值彈出。

2023年12月14日33子程序調用中,主程序應先把有關的參數存入約定的位置,子程序在執行時,可以從約定的位置取得參數,當子程序執行完,將得到的結果再存入約定的位置,返回主程序后,主程序可以從這些約定的位置上取得需要的結果,這就是參數的傳遞。子程序的調用涉及到堆棧,在主程序中必須要正確設置堆棧指針。子程序嵌套是指在子程序執行過程中,還可以調用另一個子程序。2023年12月14日34例4-13用程序實現C=A*A+B*B。設A和B均小于10,A存在內部RAM31H單元,B存在內部RAM32H,把C存入內部RAM33H單元。解:本題中包含2個求平方值,把求平方設計為子程序。子程序名稱:SQR功能:求小于10的數的平方(查表法)入口參數A,出口參數A2023年12月14日35

主程序:ORG0800HMOVSP,#60HMOVA,31HLCALLSQRMOVR1,AMOVA,32HLCALLSQRADDA,R1MOV33H,ASJMP $2023年12月14日36ORG0900HSQR:ADDA,#01HMOVCA,@A+PCRETTAB:DB0,1,4,9,16DB25,36,49,64,81END堆棧變化:畫圖說明2023年12月14日37TheEnd習題:4-6試編程將內部RAM40H---60H單元內容傳送到外部RAM以2000H為首地址的存儲區中4-7在外部RAM首地址為DATA的存貯器中,有10個字節的數據,試編程將每個字節的最高位無條件置“1”4-8編寫程序將外部RAM3000H開始的13個單元中的數據隔一個傳送到內部RAM30H開始的區域4-9編程將外部RAM地址為1000H---1030H的數據塊全部搬遷到內部RAM30H---60H中,并將原來數據全部清零。4-18設在外部RAM2000H---2004H單元中,存放有5個壓縮BCD碼,試編程將它們轉換成ASCII碼,存放到以2005H為首地址的外部RAM中。4-21根據圖3-10,設計燈亮移位程序,要求8個發光二極管每次亮1個,點亮40ms。順次循環右移點亮,循環不止。4-22根據圖3-10,設計亮燈程序,要求8個發光二極管間隔分成2組,每組4個,2組交叉點亮,變換時間為100ms,反復循環不止。2023年12月14日392023年12月14日40該單片機系統的晶振頻率為12MHz3-14已知(A)=5Bh,(R1)=40H,(40H)=C3H,(PSW)=81H,試寫出各條指令單獨執行結果,并說明程序狀態字的狀態。

(1)XCHA,R1(2)XCH A,40H (3)XCH A,@R1 (4)XCHD A,@R1 (5)SWAP A (6)ADD A,R1 (7)ADD A,40H (8)ADD A,#40H (9)ADDC

溫馨提示

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

評論

0/150

提交評論