第3章-匯編程序設(shè)計_第1頁
第3章-匯編程序設(shè)計_第2頁
第3章-匯編程序設(shè)計_第3頁
第3章-匯編程序設(shè)計_第4頁
第3章-匯編程序設(shè)計_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

會計學(xué)1第3章-匯編程序設(shè)計3.4.1匯編程序偽指令

在匯編時起控制作用,自身并不產(chǎn)生機器碼,而僅是為匯編服務(wù)的一些指令,稱為偽指令。偽指令不屬于80C51指令系統(tǒng)。常用的偽指令有以下幾種:⒈起始偽指令

ORG(Origin)

功能:規(guī)定ORG下面目標(biāo)程序的起始地址。格式:ORG16位地址第1頁/共31頁功能:將一個數(shù)據(jù)或特定的匯編符號賦予規(guī)定 的字符名稱。⒉結(jié)束偽指令END功能:匯編語言源程序的結(jié)束標(biāo)志。在END后面的指令,匯編程序不再處理。格式:END⒊等值偽指令

EQU(Equate)格式:字符名稱EQU

數(shù)據(jù)或匯編符號第2頁/共31頁⒋數(shù)據(jù)地址賦值偽指令

DATA格式:字符名稱DATA

表達式功能:將數(shù)據(jù)地址或代碼地址賦予規(guī)定的 字符名稱。⒌定義字節(jié)偽指令DB(DefineByte)格式:DB8位二進制數(shù)表功能:從指定的地址單元開始,定義若干 個8位內(nèi)存單元的數(shù)據(jù)。數(shù)據(jù)與數(shù)據(jù)之間用“,”分割。第3頁/共31頁格式:字符名稱BIT

位地址⒍定義字偽指令DW(DefineWord)格式:DW16位二進制數(shù)表功能:從指定的地址單元開始,定義 若干個16位數(shù)據(jù)。⒎定義位地址偽指令BIT功能:將位地址賦予所規(guī)定的字符名稱。第4頁/共31頁匯編語言基本概念

將匯編語言源程序轉(zhuǎn)換為計算機所能識別的機器語言代碼程序的過程稱為匯編。匯編可分為:⒈手工匯編⒉計算機匯編第5頁/共31頁⑷

匯編和調(diào)試程序設(shè)計的基本方法編寫程序要求:

不僅要完成規(guī)定的功能任務(wù),而且還要求:

執(zhí)行速度快、占用內(nèi)存少、條理清晰、

閱讀方便、便于移植、巧妙而實用。一般應(yīng)按以下幾個步驟進行:⑴分析問題,確定算法或解題思路⑵畫流程圖⑶編寫源程序第6頁/共31頁

順序程序是指按順序依次執(zhí)行的程序,也稱為簡單程序或直線程序。順序程序結(jié)構(gòu)雖然比較簡單,但也能完成一定的功能任務(wù),是構(gòu)成復(fù)雜程序的基礎(chǔ)。3.4.2順序程序第7頁/共31頁CONT:MOV A,R0 ;讀低8位

CPL A ;取反

ADD A,#1 ;加1 MOV R2,A ;存低8位

MOV A,R1 ;讀高8位

CPL A ;取反

ADDC A,#80H ;加進位及符號位

MOVR3,A ;存高8位

RET ;【例】已知16位二進制負(fù)數(shù)存放在R1R0中, 試求其補碼,并將結(jié)果存在R3R2中。解:二進制負(fù)數(shù)的求補方法可歸結(jié)為“求反加1”,符號位不變。利用CPL指令實現(xiàn)求反;加1時,則應(yīng)低8位先加1,高8位再加上低位的進位。注意這里不能用INC指令,因為INC指令不影響標(biāo)志位。程序如下:第8頁/共31頁

根據(jù)不同條件轉(zhuǎn)向不同的處理程序,這種結(jié)構(gòu)的程序稱為分支程序。

80C51指令系統(tǒng)中的條件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令和位轉(zhuǎn)移指令,可以實現(xiàn)分支程序。3.4.3分支程序第9頁/共31頁①S0單獨按下,

紅燈亮,其余燈滅;②S1單獨按下,

綠燈亮,其余燈滅;③其余情況,黃燈亮?!纠恳阎娐啡鐖D4-5所示,要求實現(xiàn):第10頁/共31頁解:程序如下SGNL:ANLP1,#11100011B;紅綠黃燈滅

ORLP1,#00000011B;置P1.0、P1.1輸入態(tài),

P1.5~P1.7狀態(tài)不變SL0:JNBP1.0,SL1 ;P1.0=0,S0未按下,轉(zhuǎn)判S1JNBP1.1,RED ;P1.0=1,S0按下;且P1.1=0,S1未按下,轉(zhuǎn)紅燈亮YELW:SETBP1.4 ;黃燈亮

CLRP1.2 ;紅燈滅

CLRP1.3 ;綠燈滅

SJMPSL0 ;轉(zhuǎn)循環(huán)SL1:JNBP1.1,YELW ;P1.0=0,S0未按下;P1.1=0,S1未按下,轉(zhuǎn)黃燈亮GREN:SETBP1.3 ;綠燈亮

CLRP1.2 ;紅燈滅

CLRP1.4 ;黃燈滅

SJMPSL0 ;轉(zhuǎn)循環(huán)RED:SETBP1.2 ;紅燈亮

CLRP1.3 ;綠燈滅

CLRP1.4 ;黃燈滅

SJMPSL0 ;轉(zhuǎn)循環(huán)

第11頁/共31頁課堂練習(xí)題:

電路及燈亮滅要求同上述【例】題,其中第3、4兩條指令JNBP1.0和JNBP1.1按下列要求修改,試重新編程。 ⑴ JB P1.0,… JB P1.1,… ⑵ JB P1.0,… JNBP1.1,… ⑶ JNBP1.0,… JB P1.1,…第12頁/共31頁

循環(huán)程序一般包括以下幾個部分: ⑴循環(huán)初值; ⑵循環(huán)體; ⑶循環(huán)修改; ⑷循環(huán)控制; 以上四部分可以有兩種組織形式,其結(jié)構(gòu)如下圖所示。3.4.4

循環(huán)程序第13頁/共31頁第14頁/共31頁【例】設(shè)Xi均為單字節(jié)數(shù),并按順序存放在以50H為首地址的內(nèi)RAM存儲單元中,數(shù)據(jù)長度(個數(shù))N存在R2中,試編程求和S=X1+X2+‥‥+XN,并將S(雙字節(jié))存放在R3R4中,(設(shè)S<65536)。解:程序如下:SXN:MOVR2,#N ;置數(shù)據(jù)長度(循環(huán)次數(shù))MOVR3,#00H;和單元(高8位)清0MOVR4,#00H;和單元(低8位)清0MOVR0,#50H;求和數(shù)據(jù)區(qū)首址LOOP:MOVA,R4 ;讀前次低8位和

ADDA,@R0 ;低8位累加

MOVR4,A ;存低8位和

CLRA;

ADDCA,R3;高8位加進位

MOVR3,A;存高8位和

INCR0;指向下一數(shù)據(jù)循環(huán)修改

DJNZR2,LOOP;判N個數(shù)據(jù)累加完否?循環(huán)控制

RET;退出循環(huán)退出循環(huán)

置循環(huán)初值循環(huán)體第15頁/共31頁【例】編寫延時10ms子程序,fosc=12MHz。

解:fosc=12MHz,一個機器周期為1s。DY10ms:MOVR6,#20;置外循環(huán)次數(shù)DLP1:MOVR7,#250;置內(nèi)循環(huán)次數(shù)DLP2:DJNZR7,DLP2;2機周×250=500機周

DJNZR6,DLP1;500機周×20=10000機周

RET;說明:MOVRn指令為1個機器周期;DJNZ指令為2個機器周期;RET指令為2個機器周期;{[(2機周×250)+1+2]×20+1+2}×1s/機周=10063s≈10ms【課堂練習(xí)題】

按下列要求編寫延時子程序:⑴延時2ms,fosc=6MHz;⑵延時5ms,fosc=12MHz;⑶延時10s,fosc=12MHz;第16頁/共31頁

設(shè)80C51單片機的P1口作為輸出口,經(jīng)驅(qū)動電路74LS240(8反相三態(tài)緩沖/驅(qū)動器)接8只發(fā)光二極管,如下圖所示。當(dāng)輸出位為“1”時,發(fā)光二極管點亮,輸出位為“0”時為暗。試編程實現(xiàn):每個燈閃爍點亮10次,再轉(zhuǎn)移到下一個燈閃爍點亮10次,循環(huán)不止?!纠烤幹埔粋€循環(huán)閃爍燈的程序。第17頁/共31頁FLASH:MOVA,#01H ;置燈亮初值FSH0:MOVR2,#0AH ;置閃爍次數(shù)FLOP:MOVP1,A ;點亮

LCALLDY1s ;延時1sMOVP1,#00H ;熄滅

LCALLDY1s ;延時1sDJNZR2,FLOP ;閃爍10次

RL A ;左移一位

SJMPFSH0 ;循環(huán)

RET ;解:程序如下:延時子程序可根據(jù)延時長短,自行編寫。第18頁/共31頁【課堂練習(xí)題】

根據(jù)上圖電路,設(shè)計燈亮移位程序,要求8只發(fā)光二極管每次點亮一個,點亮?xí)r間為250ms,順序是從下到上一個一個地循環(huán)點亮。設(shè)fosc=6MHz。第19頁/共31頁【例】已知P1口數(shù)據(jù)每隔10ms刷新一次,試求其1s內(nèi)的平均值,平均值存30H。解:本題需求100個數(shù)據(jù)的平均值,一般有兩種方法:一種是全部累加后再平均;另一種是邊平均邊累加,現(xiàn)給出兩種方法的程序。第20頁/共31頁AVRG1:MOVR2,#0 ;低8位累加寄存器清0MOVR3,#0 ;高8位累加寄存器清0MOVR4,#100 ;置平均次數(shù)ALOP:MOVA,P1 ;讀P1口數(shù)據(jù)

ADDA,R2 ;低8位累加

MOVR2,A ;回存

CLRA ;高8位與進位累加

ADDCA,R3 ;MOVR3,A ;回存

LCALLDY10ms ;延時10msDJNZR4,ALOP ;判100次累加完否?未完繼續(xù)

MOVA,R3 ;100次累加完,求平均值,被除數(shù)→A、BMOVB,R2 ;MOVR0,30H ;置商間址

MOVR6,#0 ;置除數(shù)100,除數(shù)→R6R5MOVR5,#100 ;LCALLSUM ;(A、B)÷(R6、R5)=商@R0,余數(shù)A

CJNEA,#50,NEXT ;四舍五入NEXT:JC GRET ;C=1,<50,舍

INC 30H ;C=0,≥50,入GRET:RET ;⑴全部累加后再平均注:SUM子程序可參閱例4-9第21頁/共31頁AVRG2: MOV 30H,#0 ;商累加寄存器清0 MOV 31H,#0 ;余數(shù)累加寄存器清0 MOV R4,#100 ;置平均次數(shù)ALOP: MOV A,P1 ;讀P1口數(shù)據(jù)

MOV B,#100 ;置除數(shù)(平均次數(shù)) DIV AB ;P1口數(shù)據(jù)除以100 ADD A,30H ;商累加

MOV 30H,A ;回存

MOV A,B ; ADD A,31H ;余數(shù)累加

MOV 31H,A ;回存

CLR C ; SUBB A,#100 ; JC GON ;余數(shù)累加<100,余數(shù)累加寄存器不變

INC 30H ;余數(shù)累加≥100,商累加寄存器+1 MOV 31H,A ;減去100后差→余數(shù)累加寄存器GON: LCALL DY10ms ;延時10ms DJNZ R4,ALOP ;判100次累加完否?未完繼續(xù)

MOV A,31H ;100次累加完畢,余數(shù)累加四舍五入

CJNE A,#50,NEXT ;NEXT: JC GRET ;C=1,<50,舍

INC 30H ;C=0,≥50,入GRET: RET;⑵邊平均邊累加第22頁/共31頁【課堂練習(xí)題】

已知某單片機系統(tǒng)每隔20ms測一次溫度,8位溫度A/D值存在特殊功能寄存器SBUF中,試分別求其1s和1分內(nèi)的平均值,分別存30H和31H。第23頁/共31頁

當(dāng)用PC作基址寄存器時,其表格首地址與PC值間距不能超過256字節(jié),且編程要事先計算好偏移量,比較麻煩。因此,一般情況下用DPTR作基址寄存器。3.4.5查表程序用于查表的指令有兩條:⑴MOVCA,@A+DPTR⑵MOVCA,@A+PC

當(dāng)用DPTR作基址寄存器時,查表的步驟分三步:①基址值(表格首地址)→DPTR;②變址值(表中要查的項與表格首地址之間的間隔字節(jié)數(shù))→A;③執(zhí)行MOVCA,@A+DPTR。第24頁/共31頁解:編程如下:CHAG:MOVDPTR,#TABD;置共陰字段碼表首址

MOVA,30H;讀顯示數(shù)字

MOVCA,@A+DPTR;查表,轉(zhuǎn)換為顯示字段碼

MOV30H,A;存顯示字段碼

RET;TABD:DB3FH,06H,5BH,4FH,66H;0~4共陰字段碼表

DB6DH,7DH,07H,7FH,6FH;5~9共陰字段碼表【例】在單片機應(yīng)用系統(tǒng)中,常用LED數(shù)碼管顯示數(shù)碼,但顯示數(shù)字(≤9)與顯示數(shù)字編碼并不相同,需要將顯示數(shù)字轉(zhuǎn)換為顯示字段碼,通常是用查表的方法?,F(xiàn)要求將30H中的顯示數(shù)字轉(zhuǎn)換為顯示字段碼并存入30H。已知共陰字段碼表首址為TABD。第25頁/共31頁【課堂練習(xí)題】

已知8位顯示數(shù)字已存入首址為30H的內(nèi)RAM中,試將其轉(zhuǎn)換為共陰顯示字段碼,存入首址為40H的內(nèi)RAM中。第26頁/共31頁解:編程如下:CUBE: MOVDPTR,#TAB;置立方表首址

MOVA,30H ;讀數(shù)據(jù)

ADDA,30H ;數(shù)據(jù)×2→A MOV30H,A ;暫存立方表數(shù)據(jù)序號

MOVCA,@A+DPTR;讀立方數(shù)據(jù)高8位

XCHA,30H;存立方數(shù)據(jù)高8位,立方表數(shù)據(jù)序號→A INCA ;指向立方數(shù)據(jù)低8位

MOVCA,@A+DPTR;讀立方數(shù)據(jù)低8位

MOV31H,A ;存立方數(shù)據(jù)低8位

RET;TAB:DW0,0,0,1,0,8,0,27,0,64;0~40立方表

DW0,125,0,216,…,0FAH,00H;說明:數(shù)據(jù)×2→A原因是立方表數(shù)據(jù)為雙字節(jié)【例】用查表程序求0~40之間整數(shù)的立方。已知該整數(shù)存在內(nèi)RAM30H中,查得立方數(shù)存內(nèi)RAM30H(高8位)31H。已知立方表(雙字節(jié))首地址為TAB。第27頁/共31頁

在單片機系統(tǒng)中設(shè)置+、、、四個運算命令鍵,它們的鍵號分別為0、1、2、3。當(dāng)其中一個鍵按下時,進行相應(yīng)的運算。操作數(shù)由P1口和P3口輸入,運算結(jié)果仍由P1口和P3口輸出。具體如下:P1口輸入被加數(shù)、被減數(shù)、被乘數(shù)和被除數(shù),輸出運算結(jié)果的低8位或商;P3口輸入加數(shù)、減數(shù)、乘數(shù)和除數(shù),輸出進位(借位)、運算結(jié)果的高8位或余數(shù)。鍵盤號已存放在30H中。3.4.6散轉(zhuǎn)程序散轉(zhuǎn)程序是一種并行多分支程序?!纠繂纹瑱C四則運算系統(tǒng)。第28頁/共31頁解:程序如下:PRGM:MOVP1,#0FFH;P1口置輸入態(tài)

MOVP3,#0FFH;P3口置輸入態(tài)

MOVDPTR,#TBJ;置“+-×÷”表首地址

MOVA,30H;讀鍵號

RLA;鍵號2→A ADDA,30H;鍵號3→A JMP@A+DPTR;散轉(zhuǎn)TBJ:LJMPPRGM0

;轉(zhuǎn)PRGM0(加法)LJMPPRGM1

;轉(zhuǎn)PRGM1(減法)LJMPPRGM3

;轉(zhuǎn)P

溫馨提示

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

評論

0/150

提交評論