微機(jī)原理及應(yīng)用匯編語言程序設(shè)計(jì)基礎(chǔ)_第1頁
微機(jī)原理及應(yīng)用匯編語言程序設(shè)計(jì)基礎(chǔ)_第2頁
微機(jī)原理及應(yīng)用匯編語言程序設(shè)計(jì)基礎(chǔ)_第3頁
微機(jī)原理及應(yīng)用匯編語言程序設(shè)計(jì)基礎(chǔ)_第4頁
微機(jī)原理及應(yīng)用匯編語言程序設(shè)計(jì)基礎(chǔ)_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四章匯編語言程序設(shè)計(jì)基礎(chǔ)4-1匯編語言程序設(shè)計(jì)方法4-2匯編語言程序結(jié)構(gòu)4-3匯編語言的編輯與匯編4-1匯編語言程序設(shè)計(jì)方法2程序設(shè)計(jì)步驟1程序及程序設(shè)計(jì)1

程序及程序設(shè)計(jì)例如:計(jì)算63+56+36+14=?MOVA,#63 ;數(shù)63送入寄存器AADDA,#56 ;數(shù)56與A中的數(shù)63相加,其結(jié)果119送AADDA,#36 ;數(shù)36與A中的數(shù)119相加,其結(jié)果155送AADDA,#14 ;數(shù)155與A中的數(shù)14相加,其結(jié)果169保存在A中程序是一系列指令的有序集合程序設(shè)計(jì)則是編制程序的過程程序設(shè)計(jì):就是人們用計(jì)算機(jī)能接受的語言,把欲解決問題的算法和步驟描述出來的過程。編程語言機(jī)器語言→匯編語言→高級語言(字符型→圖形化)2、

程序設(shè)計(jì)步驟分析課題→確定算法和數(shù)據(jù)結(jié)構(gòu)→確定操作步驟→畫流程圖→編制源程序→調(diào)試程序分析課題:對具體問題具體分析,并抽象出數(shù)學(xué)模型確定算法:解決同一問題有多種方法,從中選擇一種最佳的方法確定數(shù)據(jù)結(jié)構(gòu):合理安排數(shù)據(jù)結(jié)構(gòu),合理選擇和分配內(nèi)存空間、工作寄存器以及I/O接口地址

程序模塊:把整個(gè)問題分成若干個(gè)功能模塊,畫出層次圖及通信畫流程圖:以圖示形式表示解決具體問題的思路和方法編制源程序:精心挑選合適的指令和操作數(shù)的尋址方式 用注釋行說明程序,便于閱讀、調(diào)試和修改。調(diào)試程序:源程序--→機(jī)器程序--→分析結(jié)果正確--→調(diào)試程序完成

N

修改匯編執(zhí)行Y流程圖圖例起止框處理框判斷框連線開始結(jié)束X

X+1Y

Y-1F>5?YN開始1YN?

4-2匯編語言程序結(jié)構(gòu)程序設(shè)計(jì)方法結(jié)構(gòu)化設(shè)計(jì)三種基本控制結(jié)構(gòu),順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)一個(gè)子程序結(jié)構(gòu)子程序中斷服務(wù)子程序程序開發(fā)方法自頂向下方法→先頂層開發(fā)先寫主程序,后寫子程序自底向上方法→先底層開發(fā)先寫子程序,后寫主程序混合方法

程序設(shè)計(jì):就是人們用計(jì)算機(jī)能接受的語言,把欲解決問題的算法和步驟描述出來的過程。編程語言機(jī)器語言→匯編語言→高級語言(字符型→圖形化)

4-2匯編語言程序結(jié)構(gòu)4-2-1順序結(jié)構(gòu)程序設(shè)計(jì)4-2-2分支結(jié)構(gòu)程序設(shè)計(jì)4-2-3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)4-2-4子程序結(jié)構(gòu)程序設(shè)計(jì)4-2-1順序結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)是按照指令在存儲器中存放的先后順序,從某一條指令開始逐條順序執(zhí)行,直至某一條指令為止。特點(diǎn):程序中無轉(zhuǎn)移、調(diào)用、分支、循環(huán)指令;程序按編寫的先后順序執(zhí)行,程序流向不變PC自動加1在實(shí)際編程中應(yīng)注意如何正確選擇指令、尋址方式和合理使用工作寄存器,包括數(shù)據(jù)存儲器。數(shù)據(jù)傳送和交換程序、簡單運(yùn)算程序、查表程序【例4-1】拆字、拼字程序

將片內(nèi)RAM50H單元的低4位取出當(dāng)作高4位,與51H單元的低4位合成一個(gè)字節(jié)后存入52H單元。STR EQU 50H ;頭文件

ORG 0000H MOV R1,#STR MOV A,@R1 ;取50H單元中的數(shù)據(jù)

ANL A,#0FH ;拆字,屏蔽高4位

SWAPA ;高、低4位互換

INC R1 ;指向51H單元

XCH A,@R1 ;51H單元內(nèi)容與累加器內(nèi)容互換

ANL A,#0FH ;拆字,取原51H單元的低4位

ORL A,@R1 ;拼字

INC R1 MOV @R1,A ;存結(jié)果

RET END【例4-1】拆字、拼字程序

將片內(nèi)RAM50H單元的低4位取出當(dāng)作高4位,與51H單元的低4位合成一個(gè)字節(jié)后存入52H單元。STR EQU 50H ;頭文件

ORG 0000H MOV R1,#STR ;指向50H單元

MOV A,@R1 ;取50H單元中的數(shù)據(jù)

SWAP A ;高、低4位互換

INC R1 ;指向51H單元

XCHD A,@R1;拆字,拼字;51H單元的低4位

;與A的低4位內(nèi)容互換

INC R1 ;指向52H單元

MOV @R1,A ;存結(jié)果

RET END【例4-2】數(shù)制轉(zhuǎn)換

將片內(nèi)RAM30H單元的無符號二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼數(shù),結(jié)果按高低順序依次存放到33H、32H、31H單元。 ORG 0000HHEX_D: MOV A,30H ;取原數(shù)據(jù)數(shù)

MOV B,#10

DIV AB ;二進(jìn)制數(shù)除10

MOV 31H,B ;將余數(shù)(BCD碼的個(gè)位)送31H

MOV B,#10

DIV AB ;商再繼續(xù)除10

MOV 32H,B ;將余數(shù)(BCD碼的十位)送32H

MOV 33H,A ;將商(BCD碼的百位)送33H

RET【例4-3】查表程序

關(guān)鍵在:組織具有規(guī)律性的表格

求R1中數(shù)(0~15)的平方,結(jié)果仍放回到R1中。

ORG0000HTAB1:MOVA,R1ADDA,#02H;加上地址偏移量

MOVCA,@A+PC;查表MOVR1,ARETDB00H,01H,04H,09H;平方表DB10H,19H,24H,31H;續(xù)表DB40H,51H;續(xù)表【例4-3】查表程序

求R1中數(shù)(0~15)的平方,結(jié)果仍放回到R1中。 ORG 0000HTAB2: PUSH DPH ;保存DPTR的原值 PUSH DPL MOV DPTR,#TAB ;取平方表首地址 MOV A,R1 MOVC A,@A+DPTR ;查平方表 MOV R1,A POP DPL ;恢復(fù)DPTR的原值 POP DPH RETTAB: DB 00H,01H,04H,09H ;平方表 DB 10H,19H,24H,31H DB 40H,51H以PC為指針查表程序

輸入?yún)?shù):R2輸出參數(shù):R3R4TB1:movA,R2addA,R2;?

movR3,AaddA,#08H;?

movcA,@A+PCxchA,R3addA,#03H;?

IncA

;?

movcA,@A+PCmovR4,Asjmp$TAB1: DW1520,3721,4264DW7850,3483,32657DW883,9943,1000DW4051,6785,8931DW4468,5871DW13284,27808END以DPTR為指針查表程序

輸入?yún)?shù):R2R3輸出參數(shù):R2R3LTB2:movDPTR,#TAB2movA,R3clrCrlcAmovR3,AxchA,R2rlcAxchA,R2addA,DPLmovDPL,AmovA,DPHaddcA,R2movDPH,A

clrAmovcA,@A+DPTRmovR2,AclrAincDPTRmovcA,@A+DPTRmovR3,AretTAB2:DW520H,3721H,4264HDW7850H,3483H,3265HDW883H,9943H,1000H4-2-2分支結(jié)構(gòu)程序設(shè)計(jì)特點(diǎn):程序中含有轉(zhuǎn)移類指令關(guān)鍵:正確選用轉(zhuǎn)移指令無條件分支程序程序設(shè)計(jì)者事先設(shè)計(jì)好的流向LJMP、AJMP、SJMP、JMP、LCALL、ACALL、RET(I)有條件分支程序根據(jù)程序執(zhí)行過程中對標(biāo)志位、A、內(nèi)部RAM的某些單元或位的影響結(jié)果決定程序的流向。使cpu具有判斷決策能力JZ/JNZ、CJNE、DJNZ、位控制轉(zhuǎn)移類指令的有機(jī)配合注意

使用條件轉(zhuǎn)移指令形成分之前一定安排可供條件轉(zhuǎn)移指令進(jìn)行判別的條件。JCLOOP

正確選定所用的轉(zhuǎn)移條件、轉(zhuǎn)移目標(biāo)地址(標(biāo)號)及轉(zhuǎn)移范圍一、單重分支程序一個(gè)判斷決策框,程序有兩條出路,二選一。由一個(gè)條件轉(zhuǎn)移指令實(shí)現(xiàn)有三種典型單分支結(jié)構(gòu):條件滿足?N影響條件Y分支處理1分支處理2順序程序1順序程序2開始結(jié)束條件滿足?N影響條件Y分支處理段1順序程序1開始順序程序2結(jié)束順序程序3條件滿足?N影響條件Y分支處理段1順序程序1開始順序程序2結(jié)束順序程序3補(bǔ)碼絕對值條件滿足?N影響條件Y處理段例求R2中補(bǔ)碼絕對值,正數(shù)不變,負(fù)數(shù)變補(bǔ)。

MOVA,R2

JNBACC.7,NEXT;為正數(shù)?

CPLA ;負(fù)數(shù)變補(bǔ)

INCA MOVR2,ANEXT:SJMPNEXT;結(jié)束JNB【例4-4】無符號數(shù)的比較

比較外部RAMData1和Data2單元的兩個(gè)無符號數(shù),并將大數(shù)存入Data3單元中,Data1、Data2和Data3為連續(xù)的單元

ORG

0000HCOM1:MOV A,40H

CJNE A,41H,L1;兩數(shù)比較L1: JC J2

;C=1,則A小轉(zhuǎn)BIG2BIG1MOV 42H,A

;大數(shù)送42H RETBIG2: XCH A,41H

;大數(shù)送A SJMP BIG1 END 先看數(shù)據(jù)放在內(nèi)部RAM的情況data1equ 1000hcom1:mov dptr,#data1 movx a,@DPTR movb,a inc

DPTR movxa,@DPTR cjnea,b,l1l1:

jc

big2;c=1,則a小big1:

inc

dptr movx@dptr,a retbig2:xcha,b sjmpbig1 end【例4-5】代碼轉(zhuǎn)換程序設(shè)計(jì)1

一位十六進(jìn)制數(shù)與ASCII碼之間的轉(zhuǎn)換

1、一位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼

2、ASCII碼轉(zhuǎn)換為一位十六進(jìn)制數(shù)0~9的ASCII碼:30~39H,A~F的ASCII碼:41~46H?!?’~‘9’與0~9之間的差值30h‘A’~‘F’與A~F之間的差值37h;1、十六進(jìn)制轉(zhuǎn)換成ASCII碼輸入:R2中存放一位十六進(jìn)制;出口:R2返回ASCII值

ORG 0000HHEXASC:MOV A,R2 ;將該十六進(jìn)制數(shù)暫存于A中

CJNEA,#0AH,$+3 JNC ADD_37;若大于等于0AH,則加37HADD_30:ADD A,#30H;若小于0AH,則加30H MOV R2,A ;保存結(jié)果

RET ;子程序返回ADD_37:ADD A,#37H;大于或等于0AH,則加37H MOV R2,A ;保存結(jié)果

RET ;子程序返回

2、ASCII碼轉(zhuǎn)換成十六進(jìn)制輸入:R2中存放ASCII碼輸出:R2中返回十六進(jìn)制ASCHEX:mov A,R2 clrcsubbA,#30hcjneA,#10,$+3 jcA,HEXASC1

;A<10轉(zhuǎn)移

subbA,#07hASCHEX1:ret二、多重分支程序程序有兩條以上的出路,多選一。選擇參數(shù)送A開始分支程序0分支程序1分支程序nA=0A=1A=nA=?條件1成立?Y送條件參數(shù)N分支程序1分支程序3開始分支程序2條件2成立?NY順序程序2結(jié)束順序程序12、按分支號轉(zhuǎn)移,使用散轉(zhuǎn)指令JMP@A+DPTR(1)轉(zhuǎn)向地址表法:DW(2)轉(zhuǎn)向地址偏移量表法:DB(3)查表與RET指令結(jié)合MOVC和RET(4)轉(zhuǎn)移指令表法:LJMP或AJMP1、多次使用條件轉(zhuǎn)移指令,形成兩個(gè)以上判斷框。CJNE指令和JC、JNC有機(jī)配合JB、JNB、JBCJZ、JNZ1、多次使用條件轉(zhuǎn)移指令,形成兩個(gè)以上判斷框。例求符號函數(shù)Y=SGN(X)

輸入X存入40H,輸出Y存入41H中

+1當(dāng)X>0Y= SGN(X)=0當(dāng)X=0 -1當(dāng)X<0X=0?Y取XNA=0A=+1開始A=-1X<0?NY保存Y←A結(jié)束求符號函數(shù)流程圖SYMB:MOVA,40H ;取X JZ STOR ;X=0,Y=X JB ACC.7,MINUS;X<0 MOVA,#1 ;X>0,Y=+1STOR:MOV41H,A ;保存Y RETMINUS:MOVA,#0FFH ;X<0,Y=-1 SJMPSTOR要點(diǎn):將流程圖按條件NO優(yōu)先方式拉直在流程圖匯合處和轉(zhuǎn)移目的地址處加標(biāo)號比較內(nèi)部RAMData1和Data2單元內(nèi)以補(bǔ)碼形式表示的帶符號數(shù),并將大數(shù)存入BIG單元,小數(shù)存入SMALL單元,若相等,則建立起標(biāo)志位F0Data1 EQU 40hData2 EQU 41hBIG EQU 30HSMALL EQU 31H ORG 0000HCOM2: MOV A,Data1 XRL A,Data2 JNZ STEP1 ;兩數(shù)不等,轉(zhuǎn)STEP1 SETB F0 ;兩數(shù)相等,F(xiàn)0置位

RETSTEP1: JB ACC.7,TEST;兩數(shù)異號,轉(zhuǎn)TEST XRL A,Data2 ;兩數(shù)同號,恢復(fù)Data1 SUBB A,Data2 ;比較

JC STEP3;Data1小,轉(zhuǎn)STEP3STEP2: MOV BIG,Data1;Data1大

MOV SMALL,Data2 RETTEST: XRL A,Data2 ;恢復(fù)Data1 JNB ACC.7,STEP2;Data1為正,大,轉(zhuǎn)STEP2STEP3: MOV SMALL,Data1 MOV BIG,41H RET【例4-6】帶符號數(shù)的比較:

XRL指令和JNZ、JB、JNC有機(jī)配合不相等?Y取Data1和Data2N設(shè)置標(biāo)志F0開始異號?NY結(jié)束帶符號數(shù)的比較流程圖Data1存入SMALLData2存入BIG結(jié)束結(jié)束Data1小?NYData1存入BIGData2存入SMALLData1正?NY分支號R2=0,程序轉(zhuǎn)移到PROG0處;當(dāng)分支號R2=1,程序轉(zhuǎn)移到PROG1處;…當(dāng)分支號R2=n,程序轉(zhuǎn)移到PROGn處?!纠?-7】散轉(zhuǎn)程序:使用JMP實(shí)現(xiàn)多分支程序轉(zhuǎn)移

ORG 0000H MOV DPTR,#TAB ;取轉(zhuǎn)移地址表首地址

MOV A,R2 ;取變量值

ADD A,R2 ;對變量乘2修正

JMP @A+DPTRTAB: AJMP PROG0 AJMP PROG1 … AJMP PROGn-1 AJMP PROGn行李計(jì)價(jià): 當(dāng)G≤5,M=G×3;

當(dāng)G>5,M=G×3+(G-5)×(5-3)FRT:MOVA,40H ;取行李重量計(jì)價(jià)單位kg MOVR3,A MOVB,#03H ;M=G×3 MULAB MOVR2,A ;暫存3G MOVA,R3 ;取回G CJNEA,#05H,L1;G≤5?WETC:MOV41H,R2 ;存結(jié)果M RET L1:JC WETC ;是,轉(zhuǎn)至WETC SUBBA,#05H ;否則M=3G+2(G-5) RLC A ADDA,R2 MOVR2,A SJMPWETC例:某車站托運(yùn)行李,規(guī)定重量不超過5kg,每公斤按3元計(jì)價(jià),若超過5kg,其超重部分每公斤加收2元。試編制程序,當(dāng)行李重量為G時(shí),計(jì)算托運(yùn)費(fèi)MG≠5?NM=G×3Y存MG≤5?NYM=3G+2(G-5)CJNE指令和JC、JNC有機(jī)配合2、按分支號轉(zhuǎn)移如:分支號A=0,程序轉(zhuǎn)移到ADDR0處;當(dāng)分支號A=1,程序轉(zhuǎn)移到ADDR1處;…當(dāng)分支號A=n,程序轉(zhuǎn)移到ADDRn處。(1)、(3)用轉(zhuǎn)向地址表法。由PUSH同RET指令配合;

設(shè)分支號已存入A。MTJS:MOVDPTR,#TAB;取表首地址

CLRC ;分支號×2

RLCA JNCLOW ;若A≤127,則轉(zhuǎn)移

INCDPH ;若A>127,則DPTR加256LOW:MOVR2,A ;修正值送R2保存

MOVCA,@A+DPTR;取分支地址高8位

XCHA,R2 ;A<—>R2 INCA

MOVCA,@A+DPTR;取分支地址低八位

PUSHACC ;分支地址低八位入棧保存

MOVA,R2

PUSHACC ;分支地址高8位入棧保存

RET

;分支地址→PC,轉(zhuǎn)移TAB:DW ADDR0 ;分支轉(zhuǎn)移地址表

DW ADDR1 ;高字節(jié)地址,低字節(jié)地址

… ADDR0: … ;程序段0…A=?0處理一處理二處理…1n2、按分支號轉(zhuǎn)移JMP4:movR2,#1movDPTR,#TBL4movA,R2addA,R2jncNADDincDPHNADD:movR3,AmovcA,@A+DPTRxchA,R3incAmovcA,@A+DPTRmovDPL,AmovDPH,R3clrA

jmp@A+DPTR(1)用轉(zhuǎn)向地址表法。設(shè)分支號已存入R2,使用movcA,@A+DPTR和jmp@A+DPTR散轉(zhuǎn)指令配合。TBL4:DWPRG0DWPRG1DWPRG2DWPRG3PRG0:movR0,#0sjmpHaltPRG1:movR0,#1sjmpHaltPRG2:movR0,#2sjmpHaltPRG3:movR0,#3Halt:sjmp$(2)用地址偏移量表法。

巧妙利用JMP@A+DPTR和MOVCA,@A+DPTR兩條指令配合;

設(shè)R7=分支號MTJS:MOVDPTR,#TAB;指向表首地址

MOVA,R7;分支號送AMOVCA,@A+DPTR;查表內(nèi)容送A

JMP@A+DPTR;實(shí)現(xiàn)多分支轉(zhuǎn)移TAB:DBADDR0-TAB;地址偏移量表

DBADDR1-TAB … DBADDRn-TABADDR0: … ;程序段0…ADDR1: … ;程序段1……ADDR n: … ;程序段n…A=?0處理一處理二處理…1nPC=DPTR+A=TAB+ADDRn-TAB=ADDRn(4)轉(zhuǎn)移指令表法。用分支轉(zhuǎn)移指令JMP@A+DPTR。設(shè)R7R6=分支號MTJS:MOVDPTR,#TAB;指向表首地址

MOVA,R7;分支號高字節(jié)×3 MOVB,#03H MULAB ;乘積不超過1字節(jié)

ADDA,DPH MOVDPH,A MOVA,R6;分支號低字節(jié)×3

MOVB,#03H MULAB XCHA,B

ADDA,DPH;DPH←DPH+((R7、R6)×3)高字節(jié)

MOVDPH,A XCHA,B ;A←((R7、R6)×3)低字節(jié)

JMP@A+DPTR;實(shí)現(xiàn)多分支轉(zhuǎn)移TAB:LJMPADDR0;轉(zhuǎn)移指令表

LJMPADDR1 … LJMPADDRNADDR0: … ;程序段0…

…ADDR1: … ;程序段1…A+DPTR←TAB+R7R6×3DPTR←TABJMP@A+DPTRLJMPROUT0LJMPROUT1LJMPROUTnR6R73×DPLDPHA+A0ABTABLTABH4-2-3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)主要特點(diǎn):大大縮短程序,減少占用程序空間;程序結(jié)構(gòu)優(yōu)化,清晰易讀,循環(huán)結(jié)構(gòu)使程序緊湊;可以實(shí)現(xiàn)多重循環(huán)控制,循環(huán)嵌套;循環(huán)程序主要由循環(huán)常數(shù)初始化部分、循環(huán)體、結(jié)束部分三部分組成一、循環(huán)程序的構(gòu)成二、單重循環(huán)程序三、多重循環(huán)程序一、循環(huán)程序的構(gòu)成

循環(huán)控制?循環(huán)執(zhí)行循環(huán)結(jié)束循環(huán)初始化YN一.初始化部分循環(huán)準(zhǔn)備工作。如:清結(jié)果單元、設(shè)指針、設(shè)循環(huán)控制變量初值等。二.循環(huán)體循環(huán)執(zhí)行部分:需多次重復(fù)處理的工作。循環(huán)控制部分:

1.修改指針和循環(huán)控制變量。

2.檢測循環(huán)條件:滿足循環(huán)條件,繼續(xù)循環(huán),否則退出循環(huán)。三.結(jié)束部分分析、處理和保存循環(huán)結(jié)果。至少1次循環(huán)的循環(huán)結(jié)構(gòu):選用先執(zhí)行后判斷的循環(huán)結(jié)構(gòu)。允許0次循環(huán)的循環(huán)結(jié)構(gòu):選用先判斷后執(zhí)行的循環(huán)結(jié)構(gòu)。二、單重循環(huán)程序

簡單循環(huán)結(jié)構(gòu):循環(huán)體中不套循環(huán)?!纠?-8】

:計(jì)算1+2+…+10的和并保存在內(nèi)RAM的Y單元Y

EQU 20H

ORG 0000H

CLR A ;清部分和

MOV R0,#01 ;置累計(jì)初值LOOP:CJNE R0,#11,AD ;判斷是否完成

MOV Y,A ;保存結(jié)果

RET ;結(jié)束AD: ADD A,R0 ;計(jì)算部分和

INC R0 ;修改循環(huán)計(jì)數(shù)器

SJMP LOOP ;循環(huán)設(shè)有一組數(shù)存放在內(nèi)RAM從DATA開始的連續(xù)單元中,數(shù)據(jù)長度放在DATA1單元中,使編寫程序找出其中的最大數(shù),并存入DATA2單元Data2 EQU 40HData1 EQU 41HData EQU 42H

ORG

0000H

MOV R0,#Data

;設(shè)置地址指針,并指向存放數(shù)據(jù)的起始單元

MOV Data2,@R0 ;將第一個(gè)數(shù)當(dāng)作當(dāng)前最大數(shù)

DEC

Data1 ;修改剩余的數(shù)據(jù)個(gè)數(shù)NEXT: INC R0 ;指向下一個(gè)數(shù)據(jù)單元

MOV A,@R0 ;取當(dāng)前數(shù)據(jù)

CJNE A,Data2,COMP;比較當(dāng)前數(shù)與當(dāng)前最大數(shù)COMP: JC CON ;若當(dāng)前數(shù)小于當(dāng)前最大數(shù),則繼續(xù)。

MOV Data2,A ;否則,把當(dāng)前數(shù)當(dāng)作最大數(shù)CON: DJNZ Data1,NEXT ;判斷數(shù)據(jù)是否比較完畢 RET ;比較結(jié)束【例4-9】

:求最大數(shù)

三、多重循環(huán)程序

內(nèi)循環(huán)控制?循環(huán)工作循環(huán)結(jié)束外循環(huán)控制?內(nèi)循環(huán)初始化開始外循環(huán)初始化注意循環(huán)嵌套允許外重循環(huán)嵌套內(nèi)重循環(huán)循環(huán)體不能交叉不能從循環(huán)程序外部跳入循環(huán)程序內(nèi)部【例4-10】軟件延時(shí)程序

1s延時(shí)程序(設(shè)時(shí)鐘f=12MHz,T=1μs)DEL1s: MOV R3,#10 ;單周期,1TDEL1: MOV R4,#200 ;單周期,1TDEL2: MOV R5,#248 ;單周期,1TDEL3: DJNZ R5,DEL3 ;雙周期,2T NOP ;單周期,1T DJNZ R4,DEL2 ;雙周期,2T DJNZ R3,DEL1 ;雙周期,2T RET ;雙周期,2Tt=((((2T×248)+4T)×200+3T)×10+3T)×1μs=1000033μs≈1s1、什么叫程序設(shè)計(jì)?程序設(shè)計(jì):就是人們把欲解決問題的算法和步驟用計(jì)算機(jī)能接受的語言描述出來的過程復(fù)習(xí)提問問題分析算法確定步驟寫出流程圖畫出源程序編制目標(biāo)程序匯編程序存儲器編程人解決問題計(jì)算機(jī)解決問題復(fù)習(xí)提問2、匯編語言程序的四種基本結(jié)構(gòu)是什么?順序結(jié)構(gòu):按編寫的先后順序執(zhí)行、PC自動加1分支結(jié)構(gòu):含有轉(zhuǎn)移類指令、具有判斷決策能力循環(huán)結(jié)構(gòu):重復(fù)執(zhí)行某段程序子程序結(jié)構(gòu):具有特定功能的獨(dú)立程序段

4-2-4子程序結(jié)構(gòu)程序設(shè)計(jì)子程序:能完成某項(xiàng)特定功能的獨(dú)立程序段,可被反復(fù)調(diào)用。

具有通用性、完整性和獨(dú)立性.一、子程序結(jié)構(gòu)三、子程序參數(shù)傳遞二、子程序的調(diào)用與返回…CALLS…CALLS…調(diào)用程序或主程序RET………被調(diào)用程序或子程序S1.提供足夠的調(diào)用信息:如:子程序名、子程序功能、入口參數(shù)和出口參數(shù)、子程序占用的硬件資源、子程序中調(diào)用的其他子程序名。2.子程序第一條指令必須為標(biāo)號標(biāo)號作為子程序入口地址作為子程序名供主程序調(diào)用3.子程序最后一條指令必須為RET(I)恢復(fù)斷點(diǎn),返回主程序,一、子程序結(jié)構(gòu)

標(biāo)準(zhǔn)子程序的格式:

;子程序名 ;子程序功能: ;入口參數(shù): ;出口參數(shù): ;占用資源:;調(diào)用的其他子程序名子程序名:. ;

..RET(I)入口參數(shù):調(diào)用子程序之前,需要主程序傳給子程序的參數(shù)。出口參數(shù):子程序送回給主調(diào)程序的結(jié)果參數(shù)。1、調(diào)用子程序之前:設(shè)置好堆棧,配好入口參數(shù)。2、主程序通過調(diào)用指令:ACALL、LCALL進(jìn)入子程序注意現(xiàn)場的保護(hù)

PUSHPSW、A、B、改變R組執(zhí)行子程序操作——嵌套:注意嵌套深度與堆棧區(qū)大小的問題注意現(xiàn)場的恢復(fù)

POPB、A、PSW3、子程序用返回指令RET(I)結(jié)束子程序并保證堆棧棧頂為調(diào)用程序的返回地址。二、子程序的調(diào)用與返回注意防止自然進(jìn)入子程序和自然退出子程序CPU正在執(zhí)行子程序SubACPU正在執(zhí)行子程序SubB正在執(zhí)行主程序入口參數(shù)傳遞無參數(shù)傳遞:主程序和子程序之間不需要參數(shù)傳遞通過寄存器傳遞主程序?qū)?shù)存入A、Rn、DPTR子程序從A、Rn、DPTR中取參數(shù)通過地址傳遞主程序?qū)?shù)存入RAM的單元中子程序從RAM的單元中取參數(shù)通常用R0、R1、DPTR的間接尋址通過堆棧傳遞主程序用PUSH將參數(shù)壓入堆棧;子程序按堆棧指針來間接訪問參數(shù)三、子程序參數(shù)傳遞

主程序

子程序出口參數(shù)傳遞無參數(shù)傳遞:通過寄存器傳遞通過地址傳遞通過堆棧傳遞通過寄存器和地址傳遞方法簡單、通用性強(qiáng)例:

ORG0000HMain:MOVSP,#30HMOVR0,#40hMOVR7,#10HLCALLZeroSJMP$;子程序名:Zero;功能:對內(nèi)部數(shù)據(jù)區(qū)清零;入口參數(shù):R0

內(nèi)部數(shù)據(jù)區(qū)首地址;R7

內(nèi)部數(shù)據(jù)區(qū)長度;出口參數(shù):無;占用資源:R0,R7;調(diào)用的其他子程序名:無Zero:pushA;現(xiàn)場的保護(hù)

clrALoop:mov@R0,AincR0djnz,R7,Loop POPA;現(xiàn)場的恢復(fù)

ret【例4-11】通過寄存器傳遞試編程計(jì)算y=a12+a22+……+a102;ai存放在內(nèi)RAM20H單元中且小于10,結(jié)果按高低順序存放在R2、R3中。循環(huán)控制?循環(huán)執(zhí)行循環(huán)結(jié)束循環(huán)初始化YN開始建立棧底SP←#60H設(shè)置數(shù)據(jù)指針R0←#20H設(shè)置循環(huán)計(jì)數(shù)器R7←#10結(jié)果單元清零R2、R3←#0A←取ai=@R0A←調(diào)用子程序SQRT計(jì)算ai2R3←A+部分和低字節(jié)R3R2←C+部分和高字節(jié)R2修改數(shù)據(jù)指針指向下一數(shù)據(jù)單元R0←

R0+1計(jì)數(shù)器R7-1≠0?YN結(jié)束開始堆棧初始化循環(huán)初始化取ai調(diào)用子程序計(jì)算ai2計(jì)算∑ai2存入結(jié)果單元循環(huán)控制?YN結(jié)束【例4-11】通過寄存器傳遞 ORG 0000HMAIN: MOV SP,#60H;堆棧初始化

MOV R0,#20H;設(shè)置數(shù)據(jù)指針

MOV R7,#10 ;設(shè)置循環(huán)計(jì)數(shù)器

MOV R3,#00H;清結(jié)果低字節(jié)單元

MOV R2,#00H;清結(jié)果高字節(jié)單元NEXT: MOV A,@R0 ;取數(shù)據(jù)

ACALL SQRT ;調(diào)用求平方數(shù)子程序

ADD A,R3 ;平方部分和

MOV R3,A ;保存低字節(jié)

CLR A ;部分和高字節(jié)加

ADDC A,R2 ;部分和低字節(jié)產(chǎn)生的進(jìn)位

MOV R2,A;保存高字節(jié)

INC R0 ;指向下一個(gè)數(shù)據(jù)單元

DJNZ R7,NEXT;未完,繼續(xù)

SJMP $試編程計(jì)算y=a12+a22+……+a102;ai存放在內(nèi)RAM20H單元中且小于10,結(jié)果按高低順序存放在R2、R3中。開始建立棧底SP←#60H設(shè)置數(shù)據(jù)指針R0←#20H設(shè)置循環(huán)計(jì)數(shù)器R7←#10結(jié)果單元清零R2、R3←#0A←取ai=@R0A←調(diào)用子程序SQRT計(jì)算ai2R3←A+部分和低字節(jié)R3R2←C+部分和高字節(jié)R2修改數(shù)據(jù)指針指向下一數(shù)據(jù)單元R0←

R0+1計(jì)數(shù)器R7-1≠0?YN結(jié)束【例4-11】通過寄存器傳遞試編程計(jì)算y=a12+a22+……+a102;ai存放在內(nèi)RAM20H單元中且小于10,結(jié)果按高低順序存放在R2、R3中。;子程序名:SQRT;功能:求A平方的子程序;入口參數(shù):A;出口參數(shù):A;占用資源:DPTR;調(diào)用的其他子程序名:無SQRT:MOV DPTR,#TAB ;取平方表首地址

MOVC A,@A+DPTR ;查平方表

RET ;子程序返回TAB: DB0,1,4,9,16,25,36,49,64,81,100 END【例4-10】通過堆棧傳遞參數(shù)碼制轉(zhuǎn)換2:將內(nèi)RAM20H單元中十六進(jìn)制數(shù)轉(zhuǎn)換為兩位ASCII,結(jié)果高低順序存入21H與22H單元。54PCLPCHSP→34SP→SP→34 ORG 0000HMAIN: MOV SP,#60H;設(shè)置堆棧初值

MOV A,20H ;取被轉(zhuǎn)換的16進(jìn)制數(shù)

SWAP A ;交換位置,以便對高位進(jìn)行轉(zhuǎn)換

PUSH ACC ;壓入堆棧

ACALL HEXASC;調(diào)用轉(zhuǎn)換子程序,對高位進(jìn)行轉(zhuǎn)換

POP 21H ;從堆棧中取出轉(zhuǎn)換結(jié)果

PUSH 20H ;將將原數(shù)據(jù)壓入堆棧

ACALL HEXASC;調(diào)用轉(zhuǎn)換子程序,對低位進(jìn)行轉(zhuǎn)換

POP 22H ;從堆棧中取出轉(zhuǎn)換結(jié)果

SJMP $ ;轉(zhuǎn)換結(jié)束,等待HEXASC: MOV R1,SP ;轉(zhuǎn)移堆棧指針,因SP不可修改

DEC R1 ;下移指針,以便指向被轉(zhuǎn)換數(shù)據(jù)單元

DEC R1 MOV A,@R1 ;從棧區(qū)中取出被轉(zhuǎn)換數(shù)據(jù)

ANL A,#0FH ;屏蔽高半字節(jié),只對低半字節(jié)轉(zhuǎn)換

ADD A,#02H ;修正查表指針

MOVC A,@A+PC;查ASCII表

MOV @R1,A ;保存轉(zhuǎn)換結(jié)果到棧區(qū)

RET ;轉(zhuǎn)換子程序返回TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H END4.3匯編語言的編輯與匯編4.3.1、匯編語言源程序的編輯4.3.2、源程序的匯編4.3.1、匯編語言源程序的編輯源程序的編寫要依據(jù)8051匯編語言的基本規(guī)則(指令系統(tǒng)),特別要用好常用的匯編命令(即偽指令),例如下面的程

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論