MCS-51第四章 匯編語(yǔ)言及程序設(shè)計(jì)_第1頁(yè)
MCS-51第四章 匯編語(yǔ)言及程序設(shè)計(jì)_第2頁(yè)
MCS-51第四章 匯編語(yǔ)言及程序設(shè)計(jì)_第3頁(yè)
MCS-51第四章 匯編語(yǔ)言及程序設(shè)計(jì)_第4頁(yè)
MCS-51第四章 匯編語(yǔ)言及程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第十四章51匯編語(yǔ)言及程序設(shè)計(jì)

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

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

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

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

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

4.DATA(賦值)偽指令

ORG2000HMDATA20HDELAYXDATA08AFHMOVA,M┇LCALLDELAY┇END

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

DB偽指令可用來(lái)為匯編語(yǔ)言源程序在內(nèi)存的某區(qū)域中定義一個(gè)或一串字節(jié)。[標(biāo)號(hào):]DB項(xiàng)或項(xiàng)表ORG2000HTAB1:DB30H,8AH,7FH,73DB'5','A','BCD'5.DB(定義字節(jié))偽指令(2000H)=30H(2001H)=8AH(2002H)=7FH(2003H)=49H;十進(jìn)制數(shù)73以十六進(jìn)制數(shù)存放(2004H)=35H;35H是數(shù)字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偽指令稱為定義字偽指令,用于為源程序在內(nèi)存某個(gè)區(qū)域定義一個(gè)字或一串字。其格式為:

[標(biāo)號(hào):]DW項(xiàng)或項(xiàng)表

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

DS偽指令稱為定義存儲(chǔ)空間偽指令。

[標(biāo)號(hào):]DS表達(dá)式

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

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

順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)查表結(jié)構(gòu)子程序結(jié)構(gòu)順序結(jié)構(gòu)程序是最簡(jiǎn)單的程序結(jié)構(gòu),也稱為直線結(jié)構(gòu)程序。這種程序中既無(wú)分支、循環(huán),也不調(diào)用子程序,程序按順序一條一條地執(zhí)行指令。

【例】拆字程序。將30H單元內(nèi)的兩位BCD碼拆開(kāi)并轉(zhuǎn)換成ASCII碼,將轉(zhuǎn)換后的ASCII碼放在31H和32H單元,并讓低位ASCII碼放在32H單元。1.順序結(jié)構(gòu)程序設(shè)計(jì)

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位無(wú)符號(hào)數(shù)轉(zhuǎn)換成三位BCD碼,并存放在BAI(百位)、SHI(十位)和GE(個(gè)位)三個(gè)單元中。ORG2000HBAIWDATA40HSHIWDATA 41HGEWDATA 42HMOV A,60H MOVB,#100 DIV AB MOVBAIW,A

MOVA,B MOVB,#10 DIVABMOVSHIW,A MOVGEW,B SJMP$END例.將兩個(gè)三字節(jié)無(wú)符號(hào)數(shù)相加,其中一個(gè)加數(shù)在內(nèi)部RAM的32H、31H和30H單元;另一個(gè)加數(shù)在內(nèi)部RAM的35H、34H和33H單元,要求相加后的和存入32H、31H和30H單元,進(jìn)位存入位尋址區(qū)的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位數(shù)求補(bǔ)。已知16位二進(jìn)制數(shù)在R1、R0中,將此16位二進(jìn)制數(shù)求補(bǔ),求補(bǔ)結(jié)果存入內(nèi)部RAM31H、30H單元。ORG2000HMOVA,R0 CPLA ADDA, #01HMOV30H,A MOVA,R1 CPL A ADDCA,#00H MOV31H,A END分支結(jié)構(gòu)程序的特點(diǎn)就是程序中含有轉(zhuǎn)移指令分支程序的設(shè)計(jì)要點(diǎn)如下:(1)先建立可供條件轉(zhuǎn)移指令測(cè)試的條件;(2)選用合適的條件轉(zhuǎn)移指令;(3)在轉(zhuǎn)移的目的地址處設(shè)定標(biāo)號(hào)。在MCS-51指令系統(tǒng)中,通過(guò)條件判斷,實(shí)現(xiàn)單分支程序轉(zhuǎn)移的指令有JZ,JNZ,CJNE和DJNZ等。此外還有以位狀態(tài)作為條件進(jìn)行程序分支的指令,如JC,JNC,JB,JNB和JBC等。使用這些指令可以完成以0、1、正、負(fù),以及相等、不相等作為各種條件判斷依據(jù)的程序轉(zhuǎn)移。2.分支結(jié)構(gòu)程序設(shè)計(jì)例求單字節(jié)有符號(hào)二進(jìn)制數(shù)的補(bǔ)碼

ORG2000HJNBACC.7,NEGMOVC,ACC.7MOV00H,CCPLAADDA,#1MOVC,00HMOVACC.7,CNEG:SJMP$END例.已知VAR單元中有一自變量X,請(qǐng)按如下條件編出求函數(shù)值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例.兩個(gè)帶符號(hào)數(shù)分別存于ONE和TWO單元,試編程比較大小,并將大的數(shù)存入MAX單元。若X-Y為正,則

OV=0,X>YOV=1,X<Y若X-Y為負(fù),則

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.循環(huán)結(jié)構(gòu)程序設(shè)計(jì)(1)循環(huán)初始化:

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

ENDORG2000HTAB1EQU1000HMOVR0,#30HMOVDPTR,#TAB1 MOVR7,#50H例.已知內(nèi)部RAM的ADDR1單元開(kāi)始有一無(wú)符號(hào)數(shù)據(jù)塊,塊長(zhǎng)在LEN單元,請(qǐng)編出求數(shù)據(jù)塊中各數(shù)累加和并存數(shù)外部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例.已知內(nèi)部RAMADDR1為起始地址的數(shù)據(jù)塊內(nèi)部數(shù)據(jù)是無(wú)符號(hào)數(shù),塊長(zhǎng)在LEN單元內(nèi),請(qǐng)編程求出數(shù)據(jù)塊中的最大值并存入MAX單元。ORG2000HADDR1DATA50HLENDATA30HMAXDATA32HMOVMAX,#00H MOVR1,#ADDR1LOOP:MOVA,@R1 CJNEA,MAX,NEXT14.查表結(jié)構(gòu)程序設(shè)計(jì)所謂查表就是根據(jù)存放在ROM中的數(shù)據(jù)表格的項(xiàng)數(shù)來(lái)查找和它對(duì)應(yīng)的表中值。即:把事先計(jì)算或?qū)嶒?yàn)數(shù)據(jù)按一定順序編成表格,存于ROM中,然后根據(jù)輸入?yún)?shù)值,從表中取出結(jié)果。例.求函數(shù)Y=X!(X=0,…,7)的值。設(shè)自變量存放在ADDR1單元,表頭的地址為TAB1,表中每個(gè)數(shù)據(jù)占兩個(gè)字節(jié),Y值為雙字節(jié),存放在寄存器R2R3中,R3存放Y值低字節(jié),請(qǐng)編出查表程序。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低四位有一個(gè)十六進(jìn)制數(shù)(0~F中的一個(gè)),請(qǐng)編出能把它轉(zhuǎn)換成相應(yīng)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.子程序結(jié)構(gòu)程序設(shè)計(jì)子程序在結(jié)構(gòu)上應(yīng)具有通用性、獨(dú)立性和可調(diào)用性①子程序的第一條指令地址稱為子程序的始地址或入口地址。該指令前必須有標(biāo)號(hào),標(biāo)號(hào)應(yīng)以子程序任務(wù)定名。例如求和子程序常以ADD1為標(biāo)號(hào)。②主程序調(diào)用子程序是通過(guò)安排在主程序中的調(diào)用指令實(shí)現(xiàn)的,在子程序末尾放置RET子程序返回指令。③子程序調(diào)用和返回指令能自動(dòng)保護(hù)和恢復(fù)斷點(diǎn)地址,但對(duì)需要保護(hù)的工作寄存器、特殊寄存器和內(nèi)存單元中的內(nèi)容,就必須在子程序開(kāi)始和末尾(RET指令前)安排保護(hù)和恢復(fù)的指令。⑤子程序參數(shù)可以分為入口參數(shù)和出口參數(shù)兩類:入口參數(shù)是指子程序需要的原

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論