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

下載本文檔

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

文檔簡介

第十四章51匯編語言及程序設計

偽指令不是真正的指令,在匯編時不產生機器代碼。偽指令的功能主要是用來對匯編過程進行某種控制。采用機器匯編的方法時,源程序必須通過匯編程序的處理,才能轉換為計算機識別和執行的機器語言。為此,在源程序中應有向匯編程序發出的指示信息,告訴匯編程序如何完成匯編工作。如用偽指令給程序分配一定的存儲區、定義符號、指定暫存數據的RAM區等?!?.1偽指令一般用于確定匯編語言源程序或某數據塊在內存存儲的首地址ORG2000HSTART:MOVA,#10H┇END在一個源程序中,可以多次使用ORG規定不同程序段的起始地址,但定義的地址順序應該是從小到大,不允許交叉、重疊。1.ORG(起始匯編)偽指令ORG2000H┇ORG2500H┇ORG3000H┇ORG2500H┇ORG2000H┇ORG3000H┇

END是匯編語言源程序的結束標志,常用于匯編語言源程序末尾,表示匯編結束。一個源程序只能有一個END命令,且置于程序的最后。在END以后所寫的指令,匯編程序都不予處理。2.END(結束匯編)偽指令字符名EQU數據或匯編符

ORG2000HKAEQUR1M1EQU20HSTRTEQU2500H MOVR0,#M1MOVKA,A┇ACALLSTRT┇END3.EQU(賦值)偽指令

①“字符名”不是標號,故它與EQU之間不能用“:”隔開;②“字符名”必須先賦值后使用,只能賦值一次;K1EQU30HMOVA,K1+1③在有些MCS-51匯編程序中,EQU定義的“字符名”不能在表達式中運算。如下面語句就是錯誤的。字符名DATA表達式①表達式允許是一個數據或地址,也可以是包含被定義的“字符名”在內的表達式,但不能是匯編符號,如R0~R7等

②DATA偽指令可放在程序的任何位置,比EQU偽指令靈活

4.DATA(賦值)偽指令

ORG2000HMDATA20HDELAYXDATA08AFHMOVA,M┇LCALLDELAY┇END

③DATA偽指令一般用于定義程序中所用的8位或16位的數據或地址,但在有些匯編程序中,只允許DATA語句定義8位數據或地址,定義16位的數據或地址時,需使用XDATA語句

DB偽指令可用來為匯編語言源程序在內存的某區域中定義一個或一串字節。[標號:]DB項或項表ORG2000HTAB1:DB30H,8AH,7FH,73DB'5','A','BCD'5.DB(定義字節)偽指令(2000H)=30H(2001H)=8AH(2002H)=7FH(2003H)=49H;十進制數73以十六進制數存放(2004H)=35H;35H是數字5的ASCII碼(2005H)=41H;41H是字母A的ASCII碼(2006H)=42H;42H是字符串'BCD'中B的ASCII碼(2007H)=43H;43H是字符串'BCD'中C的ASCII碼(2008H)=44H;44H是字符串'BCD'中D的ASCII碼

DW偽指令稱為定義字偽指令,用于為源程序在內存某個區域定義一個字或一串字。其格式為:

[標號:]DW項或項表

ORG1500HTAB2:DW1234H,80H(1500H)=12H,(1501H)=34H,(1502H)=00H,(1503H)=80H6.DW(定義字)偽指令

DS偽指令稱為定義存儲空間偽指令。

[標號:]DS表達式

ORG1000HDS20HDB30H,8FH匯編后從1000H開始,預留32(20H)個字節的內存單元,然后從1020H開始,按照下一條DB指令賦值,即(1020H)=30H,(1021H)=8FH。7.DS(定義存儲空間)偽指令

BIT偽指令稱為位地址賦值偽指令,用于給以符號形式的位地址賦值。字符名BIT位地址ORG0500HK1BIT20HK2BIT30HYBITP1.0BG:MOVC,K1ANLC,K2MOVY,C┇END8.BIT(位地址賦值)偽指令§4.2匯編語言的程序設計

順序結構分支結構循環結構查表結構子程序結構順序結構程序是最簡單的程序結構,也稱為直線結構程序。這種程序中既無分支、循環,也不調用子程序,程序按順序一條一條地執行指令。

【例】拆字程序。將30H單元內的兩位BCD碼拆開并轉換成ASCII碼,將轉換后的ASCII碼放在31H和32H單元,并讓低位ASCII碼放在32H單元。1.順序結構程序設計

ORG 2000HMOV A,30H ANLA,#0FH ADD A,#30H MOV 32H,A MOV A,30H SWAPA ANL A,#0FH ADD A,#30H MOV 31H,ASJMP$END例.將60H單元中的8位無符號數轉換成三位BCD碼,并存放在BAI(百位)、SHI(十位)和GE(個位)三個單元中。ORG2000HBAIWDATA40HSHIWDATA 41HGEWDATA 42HMOV A,60H MOVB,#100 DIV AB MOVBAIW,A

MOVA,B MOVB,#10 DIVABMOVSHIW,A MOVGEW,B SJMP$END例.將兩個三字節無符號數相加,其中一個加數在內部RAM的32H、31H和30H單元;另一個加數在內部RAM的35H、34H和33H單元,要求相加后的和存入32H、31H和30H單元,進位存入位尋址區的20H單元中。ORG2000HMOV R0,#30H MOV R1,#33H MOV A,@R0 ADD A,@R1 MOV @R0,A INC R0 INC R1MOV A,@R0 ADDCA,@R1MOV @R0,A INC R0 INC R1MOV A,@R0 ADDCA, @R1 MOV @R0,A MOV 20H,C END例.16位數求補。已知16位二進制數在R1、R0中,將此16位二進制數求補,求補結果存入內部RAM31H、30H單元。ORG2000HMOVA,R0 CPLA ADDA, #01HMOV30H,A MOVA,R1 CPL A ADDCA,#00H MOV31H,A END分支結構程序的特點就是程序中含有轉移指令分支程序的設計要點如下:(1)先建立可供條件轉移指令測試的條件;(2)選用合適的條件轉移指令;(3)在轉移的目的地址處設定標號。在MCS-51指令系統中,通過條件判斷,實現單分支程序轉移的指令有JZ,JNZ,CJNE和DJNZ等。此外還有以位狀態作為條件進行程序分支的指令,如JC,JNC,JB,JNB和JBC等。使用這些指令可以完成以0、1、正、負,以及相等、不相等作為各種條件判斷依據的程序轉移。2.分支結構程序設計例求單字節有符號二進制數的補碼

ORG2000HJNBACC.7,NEGMOVC,ACC.7MOV00H,CCPLAADDA,#1MOVC,00HMOVACC.7,CNEG:SJMP$END例.已知VAR單元中有一自變量X,請按如下條件編出求函數值Z并將它存入FUN單元的程序。

ORG2000HVARDATA40HFUNDATA41HSTART:MOVA,VAR JZSAVE JNBACC.7,ZHENMOVA,#0FFHSJMP SAVEZHEN:MOVA,#01HSAVE:MOVFUN,ASJMP $END

ORG2000HVARDATA40HFUNDATA41HSTART:MOVA,VAR CJNE A,#0,NEQ SJMPSAVE NEQ:JNBACC.7,ZHEN;

MOVA,#0FFH SJMP SAVEZHEN:MOVA,#01HSAVE:MOVFUN,ASJMP $END

ORG2000HVARDATA40HFUNDATA41HSTART:MOVA,VAR JZSAVE MOVR1,#0FFH JBACC.7,NEGMOVR1,#01H SJMP SAVENEG:MOVA,R1SAVE:MOVFUN,A SJMP $END例.兩個帶符號數分別存于ONE和TWO單元,試編程比較大小,并將大的數存入MAX單元。若X-Y為正,則

OV=0,X>YOV=1,X<Y若X-Y為負,則

OV=0,X<YOV=1,X>YORG2000HONEDATA30HTWODATA31HMAXDATA32HCLRC MOVA,ONESUBBA,TWOJZXMAX JBACC.7,NEGJBOV,YMAXSJMPXMAX NEG:JBOV,XMAX YMAX:MOVA,TWO SJMPSAVEXMAX:MOVA,ONE SAVE:MOVMAX,A SJMP$END3.循環結構程序設計(1)循環初始化:

循環初始化程序段一般位于循環程序的開頭,位于循環體外,用于設置循環過程工作單元的初始值。例如,設置循環次數計數器、地址指針初值等(2)循環處理:循環處理程序段位于循環體內,是需要重復執行的程序段部分。(4)循環結束:循環結束程序段用于處理循環程序的最終結果以及恢復各工作單元的初始值。在循環次數已知的情況下,用計數方法控制循環的終止。循環次數未知的情況下,可根據某種條件判斷決定是否終止循環。(3)循環控制:循環控制程序段也位于循環體內,用于判斷循環條件是否滿足,不滿足則轉去執行循環處理程序部分,否則,退出循環。一般采用DJNZ指令來自動修改控制變量并結束循環。例.將內部數據存儲器30H~7FH單元中的內容送到外部數據存儲器以1000H開始的連續單元中去。LOOP:MOVA,@R0MOVX@DPTR,A INCR0 INCDPTRDJNZR7,LOOPSJMP$

ENDORG2000HTAB1EQU1000HMOVR0,#30HMOVDPTR,#TAB1 MOVR7,#50H例.已知內部RAM的ADDR1單元開始有一無符號數據塊,塊長在LEN單元,請編出求數據塊中各數累加和并存數外部RAM的SUM1單元的程序。LOOP:ADDA,@R1 INCR1CHECK:DJNZR2,LOOP MOVX@DPTR,A SJMP$ ENDORG2000HADDR1EQU30HLENEQU20HSUM1EQU2000HMOVDPTR,#SUM1CLRA MOVR2,LEN MOVR1,#ADDR1 INCR2 SJMPCHECK

NEXT:ADDA,@R1 INCR1 DJNZR2,NEXT MOVX@DPTR,A SJMP$ ENDORG2000HADDR1EQU30HLENEQU20HSUM1EQU2000HMOVDPTR,#SUM1CLRA MOVR2,LEN MOVR1,#ADDR1NEXT1:JCNEXT MOVMAX,A NEXT:INCR1 DJNZLEN,LOOPSJMP$ END例.已知內部RAMADDR1為起始地址的數據塊內部數據是無符號數,塊長在LEN單元內,請編程求出數據塊中的最大值并存入MAX單元。ORG2000HADDR1DATA50HLENDATA30HMAXDATA32HMOVMAX,#00H MOVR1,#ADDR1LOOP:MOVA,@R1 CJNEA,MAX,NEXT14.查表結構程序設計所謂查表就是根據存放在ROM中的數據表格的項數來查找和它對應的表中值。即:把事先計算或實驗數據按一定順序編成表格,存于ROM中,然后根據輸入參數值,從表中取出結果。例.求函數Y=X!(X=0,…,7)的值。設自變量存放在ADDR1單元,表頭的地址為TAB1,表中每個數據占兩個字節,Y值為雙字節,存放在寄存器R2R3中,R3存放Y值低字節,請編出查表程序。ORG2000HADDR1EQU20HSTART:MOVA,ADDR1 ADDA,ADDR1 MOVR3,A ADDA,#07H MOVCA,@A+PC XCHA,R3 ADDA,#04H MOVCA,@A+PC MOVR2,ASJMP$TAB1:DB01,00,01,00,02,00,06,00DB24H,00,20H,01,20H,07,40H,50HEND例.已知R0低四位有一個十六進制數(0~F中的一個),請編出能把它轉換成相應ASCII碼并送入R0的程序。ORG2000HMOVA,R0 ANLA,#0FH CJNEA,#10,NEXT1 NEXT1:JNCNEXT2 ADDA,#30H SJMPSAVE NEXT2:ADDA,#37H SAVE:MOVR0,A SJMP$ ENDORG2000H MOVA,R0 ANLA,#0FH ADDA,#90H DAA ADDCA,#40H DAA MOVR0,A SJMP$ ENDORG2000H MOVA,R0 ANLA,#0FH ADDA,#03H MOVCA,@A+PC MOVR0,A SJMP$ TAB: DB‘0’,’1’,’2’,’3’,’4’ DB‘5’,’6’,’7’,’8’,’9’ DB‘A’,’B’,’C’,’D’,’E’,’F’END5.子程序結構程序設計子程序在結構上應具有通用性、獨立性和可調用性①子程序的第一條指令地址稱為子程序的始地址或入口地址。該指令前必須有標號,標號應以子程序任務定名。例如求和子程序常以ADD1為標號。②主程序調用子程序是通過安排在主程序中的調用指令實現的,在子程序末尾放置RET子程序返回指令。③子程序調用和返回指令能自動保護和恢復斷點地址,但對需要保護的工作寄存器、特殊寄存器和內存單元中的內容,就必須在子程序開始和末尾(RET指令前)安排保護和恢復的指令。⑤子程序參數可以分為入口參數和出口參數兩類:入口參數是指子程序需要的原

溫馨提示

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

評論

0/150

提交評論