微型計算機原理及應用課件-第6章-3_第1頁
微型計算機原理及應用課件-第6章-3_第2頁
微型計算機原理及應用課件-第6章-3_第3頁
微型計算機原理及應用課件-第6章-3_第4頁
微型計算機原理及應用課件-第6章-3_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

順序結(jié)構(gòu)程序是最簡單的程序結(jié)構(gòu),也稱為直線結(jié)構(gòu)程序。程序中既無分支、循環(huán),也不調(diào)用子程序,程序按順序一條一條地執(zhí)行指令。6.3.1.順序結(jié)構(gòu)程序設(shè)計6.3MCS-51匯編程序設(shè)計

在MCS-51單片機匯編語言程序設(shè)計中,程序結(jié)構(gòu)主要有順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、查表結(jié)構(gòu)和子程序結(jié)構(gòu)。例

拆字程序。將內(nèi)部RAM30H單元內(nèi)的兩位BCD碼拆開并轉(zhuǎn)換成ASCII碼,將轉(zhuǎn)換后的ASCII碼放在內(nèi)部RAM31H和32H單元,低位ASCII碼放在內(nèi)部RAM32H單元。

ORG

0100H

MOV

A,30H

ANLA,#0FH

ADDA,#30H

MOV32H,A

MOVA,30H

SWAP

A

ANLA,#0FH

ADDA,#30H

MOV31H,ASJMP$END例.將內(nèi)部RAM60H單元中的8位無符號數(shù)轉(zhuǎn)換成3位BCD碼,并存放在BAIW(百位)、SHIW(十位)和GEW(個位)3個單元中。

ORG2000HBAIW

DATA

40HSHIWDATA41HGEW

DATA42H

MOV A,60H

MOVB,#100

DIV AB BAIW,A

MOVA,B MOVB,#10 DIVABMOVSHIW,A MOVGEW,B SJMP$END例.將兩個3字節(jié)無符號數(shù)相加,第1個數(shù)在內(nèi)部RAM的32H、31H和30H單元;第2個加數(shù)在內(nèi)部RAM的35H、34H和33H單元,要求相加后的和存入32H、31H和30H單元,進位存入20H位。ORG2000HMOV R0,#30HMOV R1,#33H

MOV A,@R0ADD A,@R1MOV @R0,A

INC R0INC R1MOV A,@R0ADDCA,@R1MOV@R0,A

INCR0 INCR1MOVA,@R0ADDCA,@R1MOV@R0,A

MOV20H,C

END6.3.2分支結(jié)構(gòu)程序設(shè)計分支程序的設(shè)計要點如下:(1)先建立可供條件轉(zhuǎn)移指令測試的條件;(2)選用合適的條件轉(zhuǎn)移指令;(3)在轉(zhuǎn)移的目的地址處設(shè)定標號。

在MCS-51指令系統(tǒng)中,通過條件判斷,實現(xiàn)單分支程序轉(zhuǎn)移的指令有JZ,JNZ,CJNE和DJNZ等。此外還有以位狀態(tài)作為條件進行程序分支的指令,如JC,JNC,JB,JNB和JBC等。使用這些指令可以完成以0、1、正、負,以及相等、不相等作為各種條件判斷依據(jù)的程序轉(zhuǎn)移。分支結(jié)構(gòu)程序的特點就是程序中含有轉(zhuǎn)移指令

例已知內(nèi)部RAM50H單元內(nèi)存有符號二進制數(shù)的原碼,將其轉(zhuǎn)換為補碼。

ORG0100H

MOVA,50HJNBACC.7,SAVECPLAINCAADDA,#1ORLA,#80HSAVE:SJMP$

END例.已知VAR單元中有自變量X,請按如下條件編出求函數(shù)值Z并將它存入FUN單元的程序。ORG0100HVARDATA40HFUNDATA41HSTART:MOVA,VAR

JZSAVE JNBACC.7,ZHENMOVA,#0FFHSJMP SAVEZHEN:

MOVA,#01HSAVE:

MOVFUN,ASJMP $ENDORG0100HVARDATA40HFUNDATA41HSTART:MOVA,VAR

JZSAVE MOVR1,#0FFH JBACC.7,NEGMOVR1,#01H SJMPSAVENEG:

MOVA,R1SAVE:MOVFUN,A

SJMP$END

例.兩個帶符號數(shù)分別存于ONE和TWO單元,試編程比較大小,并將大的數(shù)存入MAX單元。若X-Y為正,則OV=0,X>Y,OV=1,X<Y若X-Y為負,則OV=0,X<Y,OV=1,X>Y

ORG0100HONEDATA30HTWODATA31HMAXDATA32HCLRC MOVA,ONESUBBA,TWOJZXMAX

JBACC.7,NEG

JBOV,YMAX

SJMPXMAXNEG:JBOV,XMAX YMAX:MOVA,TWO

SJMPSAVEXMAX:MOVA,ONE SAVE:

MOVMAX,A

SJMP$

END6.3.3.循環(huán)結(jié)構(gòu)程序設(shè)計(1)循環(huán)初始化

循環(huán)初始化程序段一般位于循環(huán)程序的開頭,位于循環(huán)體外,用于設(shè)置循環(huán)過程工作單元的初始值。例如設(shè)置循環(huán)次數(shù)計數(shù)器、地址指針初值等(2)循環(huán)處理

循環(huán)程序的主體,位于循環(huán)體內(nèi),即需要重復執(zhí)行的程序段。(4)循環(huán)結(jié)束(3)循環(huán)控制循環(huán)控制程序段也位于循環(huán)體內(nèi),用于判斷循環(huán)條件是否滿足,若滿足則繼續(xù)循環(huán),否則結(jié)束循環(huán)。循環(huán)結(jié)束程序段用于處理循環(huán)程序的最終結(jié)果以及恢復各工作單元的初始值。例.將內(nèi)部數(shù)據(jù)存儲器30H~7FH單元中的內(nèi)容送到外部數(shù)據(jù)存儲器以1000H開始的連續(xù)單元中去。

ORG0100H

EQU1000H

MOVR0,#30H

MOVDPTR,#TAB1

MOVR7,#50HLOOP:MOVA,@R0

MOVX@DPTR,AINCR0INCDPTRDJNZR7,LOOPSJMP$END

例.已知內(nèi)部RAM的ADDR單元開始有一無符號數(shù)據(jù)塊,塊長在LEN單元,請編出求數(shù)據(jù)累加和并存累加和至外部RAMSUM單元的程序。LOOP:

ADDA,@R1 INCR1CHECK:DJNZR2,LOOP MOVX@DPTR,A SJMP$ ENDORG0100HADDREQU30HLENEQU20H

SUM1EQU2000H

MOVDPTR,#SUM

CLRA

MOVR2,LEN

MOVR1,#ADDR

INCR2

SJMPCHECKNEXT1:JCNEXT MOVMAX,A NEXT:INCR1 DJNZLEN,LOOPSJMP$ END

例.已知內(nèi)部RAMADDR為起始地址的數(shù)據(jù)塊內(nèi)部數(shù)據(jù)是無符號數(shù),塊長在LEN單元內(nèi),請編程求出數(shù)據(jù)塊中的最大值并存入MAX單元。ORG2000H

ADDRDATA50H

LENDATA30H

MAXDATA32HMOVMAX,#00H MOVR1,#ADDR1LOOP:MOVA,@R1

CJNEA,MAX,NEXT16.3.4.查表結(jié)構(gòu)程序設(shè)計所謂查表就是根據(jù)存放在ROM中的數(shù)據(jù)表格的項數(shù)來查找和它對應的表中值。即把事先計算或?qū)嶒灁?shù)據(jù)按一定順序編成表格,存于ROM中,然后根據(jù)輸入?yún)?shù)值,從表中取出結(jié)果。

例.求函數(shù)Y=X!(X=0,…,7)的值。設(shè)自變量存放在ADDR單元,表頭的地址為TAB,表中每個數(shù)據(jù)占兩個字節(jié),Y值為雙字節(jié),存放在寄存器R2R3中,R3存放Y值低字節(jié),請編出查表程序。ORG0100H

ADDREQU20HSTART:MOVA,ADDR

ADDA,ADDR

MOVR3,A ADDA,#07H MOVCA,@A+PC XCHA,R3 ADDA,#04H MOVCA,@A+PC MOVR2,ASJMP$TAB:DB01H,00H,01H,00H,02H,00H,06H,00H

DB24H,00H,20H,01H,20H,07H,40H,50HEND例.已知R0低四位有一個十六進制數(shù)(0~F中的一個),請編出能把它轉(zhuǎn)換成相應ASCII碼并送入R0的程序。ORG0100HMOVA,R0 ANLA,#0FH CJNEA,#10,NEXT1 NEXT1:JNCNEXT2 ADDA,#30H SJMPSAVE NEXT2:ADDA,#37H SAVE:MOVR0,A SJMP$ END

ORG0100H MOVA,R0 ANLA,#0FH ADDA,#90H DAA ADDCA,#40H DAA MOVR0,A SJMP$

END

ORG0100H

MOVA,R0 ANLA,#0FH ADDA,#03H MOVCA,@A+PC

MOVR0,A

SJMP$ TAB:DB`0`,`1`,`2`,`3`,`4`,`5`,`6`,`7`,`8`,`9`,`A`,`B`,`C`,`D`,`E`,`F`

END6.3.5.子程序結(jié)構(gòu)程序設(shè)計通用性、獨立性和可調(diào)用性

①子程序的第一條指令地址稱為子程序的開始地址或入口地址。該指令前必須有標號,標號應以子程序任務定名。例如求和子程序常以SUM為標號。③子程序調(diào)用和返回指令能自動保護和恢復斷點地址,但對需要保護的工作、特殊寄存器和內(nèi)存單元中的內(nèi)容,就必須在子程序開始和RET指令前安排保護和恢復的指令。②主程序調(diào)用子程序是通過安排在主程序中的調(diào)用指令實現(xiàn)的,在子程序中應在合適位置放置RET返回指令。

④為使所編子程序可以放在64KB程序存儲器的任何地方并能被主程序調(diào)用,子程序內(nèi)容通常使用相對轉(zhuǎn)移指令而不使用長轉(zhuǎn)移指令,以便匯編時生成浮動代碼。

⑤子程序參數(shù)可以分為入口參數(shù)和出口參數(shù)兩類:入口參數(shù)是指子程序需要的原始參數(shù),由調(diào)用它的主程序通過約定工作寄存器R0~R7、特殊功能寄存器SFR、內(nèi)存單元或堆棧等預先傳送給子程序使用;出口參數(shù)是由子程序根據(jù)入口參數(shù)執(zhí)行程序后獲得的結(jié)果參數(shù),應由子程序通過約定的工作寄存器R0~R7、特殊功能寄存器SFR、內(nèi)存單元或堆棧等傳遞給主程序使用。例.在寄存器R2中存放兩位16進制數(shù),請編制程序?qū)⑵浞謩e轉(zhuǎn)換為ASCII碼并且存入M1單元和M1+1單元。

問題分析:由于需要兩次轉(zhuǎn)換,可以采用調(diào)用子程序的方式完成,本例用堆棧完成參數(shù)傳遞。子程序采用查表方式完成1個十六進制數(shù)的ASCII碼的轉(zhuǎn)換,子程序入口參數(shù)和出口參數(shù)采用堆棧傳遞。使用資源:SP、A、DPTR、R2、內(nèi)部RAM40H、41H單元。ORG0100HM1DATA40HMOVSP,#60H MOVDPTR,

溫馨提示

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

評論

0/150

提交評論