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

下載本文檔

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

文檔簡(jiǎn)介

第四章匯編語(yǔ)言程序設(shè)計(jì)知識(shí)要點(diǎn):偽指令及其使用方法;順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)程序設(shè)計(jì)方法;子程序、查表程序設(shè)計(jì)方法;數(shù)據(jù)運(yùn)算和處理的典型匯編語(yǔ)言實(shí)現(xiàn)方法。

本章學(xué)習(xí)目標(biāo):能夠讀懂匯編程序,并能夠編寫(xiě)較為復(fù)雜的匯編語(yǔ)言程序,懂得匯編程序仿真軟件的使用,懂得調(diào)試匯編程序。4.匯編語(yǔ)言程序設(shè)計(jì)4.1程序設(shè)計(jì)概述4.2匯編語(yǔ)言偽指令4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)4.匯編語(yǔ)言程序設(shè)計(jì)程序設(shè)計(jì)語(yǔ)言的種類(lèi)程序的編譯和匯編程序設(shè)計(jì)的基本過(guò)程匯編語(yǔ)言的基本格式4.1程序設(shè)計(jì)概述1、

程序設(shè)計(jì)語(yǔ)言的種類(lèi)高級(jí)語(yǔ)言:接近于人的常用語(yǔ)言形式,是一種面向過(guò)程

而獨(dú)立于機(jī)器的通用語(yǔ)言,如C語(yǔ)言。

voidmain() { chara=21; charb=48; charc; c=a+b; }4.1程序設(shè)計(jì)概述匯編語(yǔ)言:它是一種符號(hào)語(yǔ)言,是一種面向機(jī)器的語(yǔ)言。

ORG 0000H MOV A, 15H ADD A, 30H MOV R0, A SJMP $ END4.1程序設(shè)計(jì)概述機(jī)器語(yǔ)言:是用二進(jìn)制0,1表示指令和數(shù)據(jù)的最原始的程序設(shè)計(jì)語(yǔ)言。RAWDATA:E5152530F880FEDisassembledDATA:0000 E515 MOV A, 15H0002 2530 ADD A, 30H0004 F8 MOVR0, A0005 80FE SJMP$4.1程序設(shè)計(jì)概述選擇程序設(shè)計(jì)語(yǔ)言類(lèi)型的原則是什么?4.1程序設(shè)計(jì)概述2、

程序的編譯、匯編和鏈接4.1程序設(shè)計(jì)概述4.1程序設(shè)計(jì)概述3、

程序設(shè)計(jì)的基本過(guò)程分析問(wèn)題確定算法設(shè)計(jì)流程分配資源編寫(xiě)源程序調(diào)試、修改4.1程序設(shè)計(jì)概述4、

匯編語(yǔ)言的基本格式例:計(jì)算21+48

ORG0200H

START: MOV A,#21 ;A←21(1Cycle)

ADD A,#48 ;A←A+48(1Cycle)

MOV R1,A ;R1←A(1Cycle)

SJMP START;原地踏步(2Cycles)

END[標(biāo)號(hào):]操作碼[第一操作數(shù),第二操作數(shù)]

[;注釋]4.1程序設(shè)計(jì)概述其中,Cycle:機(jī)器周期標(biāo)號(hào)的作用:

為程序轉(zhuǎn)移和子程序的調(diào)用提供轉(zhuǎn)移目的地址。標(biāo)號(hào)的命名方法:

1)由字母或數(shù)字組成,標(biāo)號(hào)必須以字母開(kāi)頭。

2)不可使用關(guān)鍵字,如助記符、寄存器名。

3)建議使用具有描述性的符號(hào),能夠說(shuō)明程序功能。[標(biāo)號(hào):]操作碼[第一操作數(shù),第二操作數(shù)]

[;注釋]4.1程序設(shè)計(jì)概述4.1程序設(shè)計(jì)概述4.2匯編語(yǔ)言偽指令4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)偽指令的作用偽指令詳解偽指令的應(yīng)用

4.2匯編語(yǔ)言偽指令4.2.1偽指令的作用和使用方法偽指令的作用寫(xiě)在源文件中,用于控制匯編過(guò)程的命令。如設(shè)置程序或數(shù)據(jù)存儲(chǔ)區(qū)的地址、定義符號(hào)、判斷程序是否結(jié)束等。

沒(méi)有對(duì)應(yīng)的機(jī)器碼,它是不可執(zhí)行的指令。4.2匯編語(yǔ)言偽指令偽指令種類(lèi):ORG:指定語(yǔ)句行裝載的起始地址,可以在同一文件中出現(xiàn)多次。END:指示語(yǔ)句行到此結(jié)束,一般出現(xiàn)在程序行結(jié)束以前。EQU:賦值指令,用于定義常數(shù),或地址。

等同于C中的#define語(yǔ)句。DATA:定義字節(jié)地址。BIT:

定義位符號(hào)地址。DB:定義字節(jié)數(shù)據(jù)。用于給代碼空間的存儲(chǔ)單元進(jìn)行初始化、

賦值,或定義表格。DW:

定義字?jǐn)?shù)據(jù),即兩個(gè)字節(jié)。用于給代碼空間的存儲(chǔ)單元

進(jìn)行初始化、賦值,或定義表格。

DS:

預(yù)留若干個(gè)存儲(chǔ)單元,等同于C中的malloc函數(shù)。4.2匯編語(yǔ)言偽指令1、ORG(Origin)匯編起始地址命令

指定語(yǔ)句行裝載的起始地址。

命令格式:ORGadd16例如,ORG2000H START:MOVA,#40H

上例說(shuō)明程序的起始地址是2000H,第一條指令就從2000H開(kāi)始存放。4.2匯編語(yǔ)言偽指令在一個(gè)源程序中,可以多次使用ORG指令,以規(guī)定不同程序段的起始位置不允許有重疊,即不同的程序段之間不能有重疊。通常所規(guī)定的地址從小到大。4.2匯編語(yǔ)言偽指令2、END匯編終止命令

匯編語(yǔ)言源程序結(jié)束的偽指令,表示源程序結(jié)束。

在END以后所寫(xiě)的指令,匯編程序都不予以處理,即不再翻譯。

一個(gè)源程序只能有一個(gè)END指令,放在程序的末尾。4.2匯編語(yǔ)言偽指令3、EQU(Equate)賦值指令。

將操作數(shù)段中的地址或數(shù)據(jù)賦值給標(biāo)號(hào)。賦值后的標(biāo)號(hào),其值在整個(gè)程序中不改變,可多次使用。

命令格式:標(biāo)號(hào)EQU數(shù)或匯編符號(hào)

例如:COUNT EQU 16H ;COUNT=16H ADDR EQU 3000H ;ADDR=3000H MOV A, #COUNT ;A=16H標(biāo)號(hào)與EQU之間不能用“:”來(lái)作分隔符。4.2匯編語(yǔ)言偽指令4、DATA

數(shù)據(jù)地址賦值指令

將數(shù)據(jù)地址或代碼地址賦予所規(guī)定的標(biāo)號(hào)。

命令格式為:字符名稱(chēng) DATA表達(dá)式

例如,MN DATA10H

匯編后,MN的值為10H。

DATA指令在程序中常用來(lái)定義存放數(shù)據(jù)的單元字節(jié)地址。4.2匯編語(yǔ)言偽指令5、BIT位地址符號(hào)命令

將位地址賦予所規(guī)定的字符名稱(chēng),常用于定義位符號(hào)地址。命令格式為:字符名稱(chēng)BIT位地址例如, AABITP1.0 BBBITP2.04.2匯編語(yǔ)言偽指令6、DB(DefineByte)定義字節(jié)命令

定義字節(jié)數(shù)據(jù)。它的作用是從指定的地址單元開(kāi)始,定義數(shù)據(jù)或ASCII碼字符,常用于定義數(shù)據(jù)常數(shù)表。

命令格式:

[標(biāo)號(hào):]DB字節(jié)常數(shù)表例如:

ORG2000H TAB:DB14H,26,'A' DB0AFH,‘BC’匯編結(jié)果:

(2000H)=14H(2001H)=1AH (2002H)=41H(2003H)=AFH (2004H)=42H(2005H)=43H2000H142001H1A2002H412003HAF2004H422005H434.2匯編語(yǔ)言偽指令7、DW(DefineWord)定義字命令

定義16位數(shù)據(jù)。從指定的地址單元開(kāi)始,定義若干個(gè)字常數(shù),常用于定義地址表。

命令格式為:[標(biāo)號(hào):]DW字常數(shù)表

例如,ORG2000H TAB:DW7423H,00ABH,20匯編結(jié)果: (2000H)=74H(2001H)=23H (2002H)=00H(2003H)=ABH (2004H)=00H(2005H)=14H2000H742001H232002H002003HAB2004H002005H14提示:一個(gè)字占兩個(gè)存儲(chǔ)單元,其中高字節(jié)數(shù)存入低位地址,低字節(jié)數(shù)存入高位地址,即順序存放。4.2匯編語(yǔ)言偽指令8、DS(DefineStore)定義存儲(chǔ)區(qū)

定義存儲(chǔ)區(qū)。從指定的地址開(kāi)始,保留一定數(shù)量的內(nèi)存單元,以備程序使用,其區(qū)域的大小由指令的操作數(shù)確定。

命令格式:[標(biāo)號(hào):]DS數(shù)值

例如: ORG1000H DS5 DB23H匯編結(jié)果:從地址1000H開(kāi)始,保留5個(gè)字節(jié)的內(nèi)存單元,而(1005H)=23H1000H--1001H--1002H--1003H--1004H--1005H23H4.2匯編語(yǔ)言偽指令匯編語(yǔ)言偽指令應(yīng)用實(shí)例4.2匯編語(yǔ)言偽指令ORG的應(yīng)用:4.2匯編語(yǔ)言偽指令EQU、DATA的應(yīng)用:4.2匯編語(yǔ)言偽指令BIT的應(yīng)用:4.2匯編語(yǔ)言偽指令DB、DW的應(yīng)用:4.2匯編語(yǔ)言偽指令使用DB、DW定義字符時(shí)可以用單引號(hào),也可以用雙引號(hào),其作用等同。4.2匯編語(yǔ)言偽指令程序裝載之后,程序空間顯示結(jié)果:4.1程序設(shè)計(jì)概述4.2匯編語(yǔ)言偽指令4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)程序的基本結(jié)構(gòu)順序分支循環(huán)子程序4.3.1順序結(jié)構(gòu)例:編寫(xiě)程序?qū)崿F(xiàn)兩個(gè)16bits無(wú)符號(hào)數(shù)的加法。(徐-例4.1)X+Y=0x5678+0x98761、基本原理分析1)分兩次完成,每次完成8位加法。2)采用間接尋址方式,讀取加數(shù)和被加數(shù),以及保存結(jié)果。ADDC

ADD4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)2、資源分配

33H、32H:

存放被加數(shù),以及結(jié)果37H、36H:

存放加數(shù)

22H.0:

存放和的最高位

R0、R1:

數(shù)據(jù)指針4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)3、流程圖4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)4、

源程序4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)5、程序調(diào)試與測(cè)試調(diào)試方法:?jiǎn)尾健帱c(diǎn)調(diào)試方法程序測(cè)試:考慮有進(jìn)位和沒(méi)有進(jìn)位兩種情況。思考:1.保存和的最高位還有哪些方法?2.如何實(shí)現(xiàn)多字節(jié)數(shù)的減法?3.如何實(shí)現(xiàn)多字節(jié)BCD碼數(shù)的加法,以及減法?4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)兩個(gè)16位數(shù)加法(C51實(shí)現(xiàn))4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)#include<reg52.h>unsignedintdataa=0; //定義被加數(shù)變量unsignedintdatab=0; //定義加數(shù)變量bitc; //定義進(jìn)位位變量

voidmain(void){ a=0x5678;//賦值被加數(shù)

b=0xF876;//賦值加數(shù)

a=a+b;c=CY;//保存進(jìn)位位}4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)在源文件中如果需要對(duì)芯片的寄存器進(jìn)行操作,就必須通過(guò)include引述頭文件reg52.h!

4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)unsignedintdataa=0; //定義被加數(shù)變量unsignedintdatab=0; //定義加數(shù)變量bitc; //定義位變量a分配到片上08H,09H單元b分配到片上0AH,0BH單元c分配到20H.0Compiling…….4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)a分配到片外數(shù)據(jù)0000H,0001H單元b分配到片外數(shù)據(jù)0002H,0003H單元

unsignedintxdataa=0; //定義被加數(shù)變量unsignedintxdatab=0; //定義加數(shù)變量

4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)存儲(chǔ)類(lèi)型描述code程序存儲(chǔ)區(qū)(64KBytes),由操作碼“MOVC@A+DPTR”訪問(wèn)

data直接尋址內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)idata間接尋址內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū),可訪問(wèn)全部?jī)?nèi)部地址空間(256Bytes)bdata可位尋址內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū),支持位和字節(jié)混合訪問(wèn)。xdata外部數(shù)據(jù)存儲(chǔ)區(qū)(64KBytes),由操作碼“MOVX@DPTR”訪問(wèn)

pdata分頁(yè)(256Bytes)外部數(shù)據(jù)存儲(chǔ)區(qū),由操作碼“MOVX@Ri"訪問(wèn)

C51變量的存儲(chǔ)類(lèi)型4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)存儲(chǔ)器模式描述SMALL參數(shù)及局部變量放入可直接尋址的內(nèi)部存儲(chǔ)器(最大128B,默認(rèn)存儲(chǔ)器類(lèi)型為data)COMPAT參數(shù)及局部變量放入分頁(yè)外部存儲(chǔ)區(qū)(最大256B,默認(rèn)存儲(chǔ)器類(lèi)型為pdata)LARGE參數(shù)及局部變量直接放入外部數(shù)據(jù)存儲(chǔ)器(最大64KB,默認(rèn)存儲(chǔ)器類(lèi)型為xdata)C51的存儲(chǔ)器模式4.3.2分支結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)形式與轉(zhuǎn)移指令典型分支結(jié)構(gòu)設(shè)計(jì)

二分支結(jié)構(gòu)

三分支結(jié)構(gòu)

散轉(zhuǎn)結(jié)構(gòu)4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)4.3.2分支結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)形式if…thenelse…4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)switch(){}轉(zhuǎn)移指令1.無(wú)條件轉(zhuǎn)移 SJMP:

短跳轉(zhuǎn),轉(zhuǎn)移范圍-128B~+127B AJMP:

絕對(duì)跳轉(zhuǎn),轉(zhuǎn)移范圍2KB LJMP:

長(zhǎng)跳轉(zhuǎn),轉(zhuǎn)移范圍64KB JMP:

散轉(zhuǎn)指令,實(shí)現(xiàn)多分支2.條件轉(zhuǎn)移

JZ/JNZ ;測(cè)試A

JC/JNC ;測(cè)試Cy JB/JBC/JNB ;測(cè)試某一比特位

CJNE ;比較兩數(shù)的大小;可用于形成三分支結(jié)構(gòu)DJNZ ;可用于循環(huán)結(jié)構(gòu)4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)1、二分支結(jié)構(gòu)設(shè)計(jì)例:求取|x|(x為8bits符號(hào)數(shù))解:基本原理

當(dāng)x<0:若已知[x]補(bǔ)=y(tǒng),則有[y]補(bǔ)=|x|4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)

XDATA20H;

定義X為20H,符號(hào)數(shù)X存于20H單元中。

ORG0000H

LJMPSTART

ORG0200HSTART: MOVSP,#30H MOVA,X

JNBACC.7,ISPOS ;是正數(shù) CPLA ;對(duì)負(fù)數(shù)取反加1 INCAISPOS: MOVX,A ;保存結(jié)果HERE: SJMPHERE

END

4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)例:二分支結(jié)構(gòu)應(yīng)用找出XD1,XD2單元中的最小數(shù),并保存于XD3單元中。

X,Y均為無(wú)符號(hào)數(shù),XD1位于片外1000H。(徐-例4.2)

解:設(shè)X:(1000H)=10,Y:(1001H)=20基本原理: 利用SUBB和JC指令判斷數(shù)的大小關(guān)系徐-例4.22、

三分支程序設(shè)計(jì)例:判斷電壓值的范圍,并設(shè)置相應(yīng)的標(biāo)志。(徐-例4.3)X>V50: Y=11H(滿(mǎn)電)V40≤X≤V50: Y=10H(正常)X<V40: Y=01H(空電)解:基本原理: 利用CJNE和JC/JNC指令實(shí)現(xiàn)三分支

資源分配

A: 存放當(dāng)前電壓值 50H:存放電壓上限值 40H:存放電壓下限值 30H:存放標(biāo)志變量流程圖:10H徐-例4.3調(diào)試方法:1)合理選取測(cè)試樣本集C={34,33,31,30,29}

保證測(cè)試數(shù)據(jù)的完備性,每個(gè)支路都要測(cè)試到?。?!

2)合理設(shè)置斷點(diǎn)3、

散轉(zhuǎn)結(jié)構(gòu)

散轉(zhuǎn)結(jié)構(gòu)的提出是為了僅僅使用單條指令就能高效地實(shí)現(xiàn)多分支。如滿(mǎn)足按鍵處理的要求。switch(X){

case0: { … break; } case1: { … break; } …}散轉(zhuǎn)結(jié)構(gòu)程序 作用:實(shí)現(xiàn)按鍵響應(yīng),以及其它需要實(shí)現(xiàn)多分支的應(yīng)用。特點(diǎn):效率高。實(shí)現(xiàn)方法:1)散轉(zhuǎn)指令表

2)散轉(zhuǎn)地址表

3)散轉(zhuǎn)偏移量表

例:根據(jù)R3的值,轉(zhuǎn)向3個(gè)分支,R3中存放支路號(hào)。R3=0,轉(zhuǎn)向R_KEY0R3=1,轉(zhuǎn)向R_KEY1R3=2,轉(zhuǎn)向R_KEY2解:a.構(gòu)造轉(zhuǎn)移指令表

JMP@A+DPTRENTRY: LJMPR_KEY0 ;轉(zhuǎn)移指令表:3字節(jié)

LJMPR_KEY1

LJMPR_KEY2b.根據(jù)R3,計(jì)算偏移量偏移量=R3×31)散轉(zhuǎn)指令表;MLJMP.lst思考:1.若按鍵數(shù)目達(dá)到100個(gè),應(yīng)如何修改程序?2.若改用AJMP指令,應(yīng)如何修改程序?

;MAJMP.asm ORG0400HSTART: MOVDPTR,#ENTRY ;賦指令表入口地址

MOVA,R3 ;計(jì)算偏移量

MOVB,#3MULAB;JNBOV,NEXT ;

INCDPH;乘積>255時(shí),

需要執(zhí)行INCDPHNEXT: JMP@A+DPTR;散轉(zhuǎn)ENTRY:LJMPR_KEY0 ;轉(zhuǎn)移指令表:3

字節(jié)

LJMPR_KEY1 LJMPR_KEY2……LJMPR_KEY99LJMP指令與散轉(zhuǎn)結(jié)構(gòu)99×3=297=129H

;MAJMP.asm ORG0400HSTART: MOVDPTR,#ENTRY ;賦指令表入口地址

MOVA,R3 ;計(jì)算偏移量

ADDA,R3

JMP@A+DPTR ;散轉(zhuǎn)ENTRY: AJMPR_KEY0 ;轉(zhuǎn)移指令表:2

字節(jié)

AJMPR_KEY1 AJMPR_KEY2R_KEY0: CLRP1.0 SJMPSTARTR_KEY1: SETBP1.0 SJMPSTARTR_KEY2: MOVP1,#0AAH SJMPSTART ENDAJMP指令與散轉(zhuǎn)結(jié)構(gòu)4.3.3循環(huán)結(jié)構(gòu)基本知識(shí)

循環(huán)結(jié)構(gòu)三要素典型程序設(shè)計(jì)

延時(shí)程序

數(shù)據(jù)塊求和、尋找最大數(shù)、均值濾波

4.3匯編語(yǔ)言程序結(jié)構(gòu)與設(shè)計(jì)1、基本知識(shí)應(yīng)用背景:常常某一段代碼需要執(zhí)行多次。常見(jiàn)C語(yǔ)言形式1) for(i=0;i<10;i++) { …… }4.3.3循環(huán)結(jié)構(gòu)2)do while(I!=10){ { …… ……}while(I!=10); }3)for(;;){ … if(x==‘q’)break;}2、循環(huán)結(jié)構(gòu)基本要素基本要素:循環(huán)變量,循環(huán)體,循環(huán)條件典型匯編語(yǔ)言循環(huán)結(jié)構(gòu)Mode1:已知循環(huán)次數(shù)

MOVR6,#8 MOVR0,#30HLOOP: MOV@R0,#0 INCR0 DJNZR6,LOOP SJMP$Mode2:未知循環(huán)次數(shù)TEST: JBP3.0,QUIT;IfP3.0=1,thenquit!

INCA SJMPTESTQUIT: SJMP$3、典型程序設(shè)計(jì)

延時(shí)程序設(shè)計(jì)數(shù)據(jù)塊求和尋找最大數(shù)

均值濾波例:延時(shí)程序設(shè)計(jì)應(yīng)用背景:LED燈控制START:MOVP1,#11111110B ;2cycles MOVP1,#11111101B ;2cycles SJMPSTART ;2cycles全速執(zhí)行時(shí)能夠觀察到LED閃爍現(xiàn)象嗎?信號(hào)頻率=1/6=167kHz(12MHz的晶振)人眼對(duì)頻率高于24Hz的信號(hào)已不敏感。降低信號(hào)頻率、改變占空比的方法:

START: MOVP1,#11111110B

NOP NOP MOVP1,#11111101B SJMPSTART若間隔1s需要插入多少個(gè)NOP指令?

NOP指令執(zhí)行時(shí)間1us(12MHz),需要插入106個(gè)。所需程序存儲(chǔ)空間為1M字節(jié)。試分析如下代碼段的執(zhí)行時(shí)間(晶振頻率=8MHz)

MOVR2,#255 ;1cycleLOOP2: NOP ;1cycle NOP NOP DJNZR2,LOOP2 ;2cycles循環(huán)體執(zhí)行時(shí)間 (1+1+1+2)×255=1275cycles整體時(shí)間:

1+1275=1276cycles=1.914ms

1cycle=12/8=1.5us若想延時(shí)20ms怎么辦? MOVR3,#10LOOP1: MOVR2,#255 ;1cycleLOOP2: NOP ;1cycle NOP NOP DJNZR2,LOOP2 ;2cycles

DJNZR3,LOOP1 ;2cycles如何精確計(jì)算代碼的運(yùn)行時(shí)間?內(nèi)循環(huán)體執(zhí)行時(shí)間T內(nèi):5×255=1275cycles外循環(huán)體執(zhí)行時(shí)間T外:(1+T內(nèi)+2)×10

=(1+1275+2)×10

=12780cycles整體執(zhí)行時(shí)間:1+T外=12781cycles

=19.172ms如何粗略估算運(yùn)行時(shí)間?(1+1+1+2)×255×10=12750cycles=19.125ms思考:1.若延時(shí)1s,應(yīng)如何修改程序?2.若晶振頻率改為6MHz,則R3的初值為多少?3.如何形成多重循環(huán)?數(shù)據(jù)塊的處理問(wèn)題:1,54,3,0,36,5,78,27,9,……..求取累加和;或找出最大數(shù)、或最小數(shù)、或奇數(shù)、或偶數(shù);或求取平均值;或找出大于X的所有數(shù);或找出某個(gè)特定數(shù);或由大到小排序。例:數(shù)據(jù)塊求和(胡-例4.2.9)應(yīng)用領(lǐng)域:內(nèi)存測(cè)試通訊數(shù)據(jù)測(cè)試(校驗(yàn)和測(cè)試法)基本原理:

利用ADD實(shí)現(xiàn)數(shù)據(jù)累加,僅保留和的低8位。資源分配:R0:數(shù)據(jù)指針

R1:循環(huán)計(jì)數(shù)器

A:校驗(yàn)和(8位)

BLOCKDATA11H;定義數(shù)據(jù)塊首地址RESULTDATA10H;定義結(jié)果單元地址

ORG1000HMOVA#0;累加器A清零

MOVR0,#BLOCK;置地址指針

MOVR1,#100;置循環(huán)次數(shù)LOOP:ADDA,@R0INCR0;修改指針

DJNZR1,LOOPMOVRESULT,A;存放結(jié)果

SJMP$數(shù)據(jù)塊求和源程序:例:尋找最大數(shù)(胡–例4.2.10)應(yīng)用領(lǐng)域:

消除噪聲

基本原理:利用SUBB和JC指令判斷大小關(guān)系。資源分配:R1:數(shù)據(jù)指針R2:循環(huán)計(jì)數(shù)器A:存放MAX值核心代碼:LOOP: CLRC SUBBA,@R1 JNCNEXT;Cy=0,A中數(shù)較大MOVA,@R1SJMPNEXT1NEXT:ADDA,@R1;恢復(fù)A的值NEXT1:INCR1DJNZR2,LOOP思考:1.若尋找最小數(shù),應(yīng)如何修改程序?2.比較兩數(shù)的大小還可使用什么指令?有何特點(diǎn)?比較轉(zhuǎn)移指令

CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE @Ri,#data,relCJNE指令不改變第一、第二操作數(shù)的內(nèi)容。例:

均值濾波(胡–例4.2.12)應(yīng)用領(lǐng)域:數(shù)字濾波基本原理:

y=(X1+X2+X3+…+X8)÷8利用RRC指令實(shí)現(xiàn)雙字節(jié)除8

資源分配:R0、R1:累加和,前者存放高位R2:計(jì)數(shù)器任務(wù)要求:在一個(gè)采樣周期內(nèi)連續(xù)采樣8次,求采樣值的平均值。采樣數(shù)據(jù)從P1端口讀入采樣數(shù)據(jù)。1000100101001000100010010010001001R0R1CyCy01001000101001000CyRRCRRC如何實(shí)現(xiàn)雙字節(jié)無(wú)符號(hào)數(shù)右移一次?如何保證從P1口正確輸入采樣值?編程中不要忘記寫(xiě)“讀預(yù)備指令”MOVP1,#0FFH;讀預(yù)備指令;保證P1能夠正確輸入外部信息MOVA,P1;讀入電壓值MOVA,P1;讀引腳,

執(zhí)行過(guò)程中會(huì)發(fā)出readpin信號(hào)

。均值濾波源程序4.3.4查表程序設(shè)計(jì)表格的用途表格的定義方法表格的結(jié)構(gòu)和表項(xiàng)地址求取方法查表指令查表程序典型應(yīng)用

應(yīng)用1:已知十六進(jìn)制數(shù),求取其ASCII

應(yīng)用2:利用散轉(zhuǎn)地址表,實(shí)現(xiàn)多分支

應(yīng)用3:利用順序查表法,尋找關(guān)鍵字符4.3.4查表程序設(shè)計(jì)表格是計(jì)算機(jī)的一種基本數(shù)據(jù)結(jié)構(gòu)。查表法是一種非數(shù)值計(jì)算方法,不需復(fù)雜計(jì)算。主要優(yōu)點(diǎn):可以大大簡(jiǎn)化程序,提高程序執(zhí)行速度。主要缺點(diǎn):如果表格過(guò)大,會(huì)占用較多的存儲(chǔ)單元。常用查表方法:計(jì)算查表法、順序查表法、對(duì)分查表法。1、表格的用途例:求sin(x)=?sin(x)=x-x3/3!+x5/5!-…+(-1)nx2n+1/(2n+1)!+…求函數(shù)值、傳感器非線性校正、碼制轉(zhuǎn)換、LED字模轉(zhuǎn)換2、表格的定義方法表格使用DB、DW偽指令定義,存放于代碼段中。3、表格的結(jié)構(gòu)和表項(xiàng)地址求取方法表項(xiàng)首地址=表首地址+表項(xiàng)序號(hào)×表項(xiàng)大小表項(xiàng)序號(hào):0,1,2,3…表項(xiàng)大?。?4、查表指令MOVCA,@A+DPTR;對(duì)應(yīng)于DPTR查表方式MOVCA,@A+PC;對(duì)應(yīng)于PC查表方式5、查表程序典型應(yīng)用

應(yīng)用1:已知十六進(jìn)制數(shù),求取其ASCII

應(yīng)用2:利用散轉(zhuǎn)地址表,實(shí)現(xiàn)多分支

應(yīng)用3:利用順序查表法,尋找關(guān)鍵字符例:利用查表法求取字符0-F的ASCII碼

(lkup1.asm)基本原理:

利用DB語(yǔ)句定義字符的ASCII碼表;

利用MOVC指令讀取程序空間中的表格內(nèi)容。

采用DPTR方式查表時(shí),DPTR的初始值為表格首地址。

采用PC方式查表時(shí),需要計(jì)算PC與表格首地址間的偏移量。尋找ASCII指令長(zhǎng)度估算方法:指令基本長(zhǎng)度為1字節(jié);逢立即數(shù)(8bits)長(zhǎng)度加1;逢立即數(shù)(16bits)長(zhǎng)度加2;逢直接尋址方式,指令長(zhǎng)度加1。兩種查表方式特點(diǎn)比較例:利用散轉(zhuǎn)地址表實(shí)現(xiàn)多分支

基本原理:利用DW偽指令將程序入口地址定義在程序空間中;利用MOVC分兩次讀取16位散轉(zhuǎn)地址;利用JMP指令實(shí)現(xiàn)散轉(zhuǎn)。

例:利用散轉(zhuǎn)地址表實(shí)現(xiàn)多分支

解:利用DW偽指令將程序入口地址定義在程序空間中。散轉(zhuǎn)地址散轉(zhuǎn)地址存放的單元地址源程序:利用散轉(zhuǎn)地址表實(shí)現(xiàn)多分支MDWJMP.asm

例:利用順序查表,在無(wú)序表中查找關(guān)鍵字。任務(wù)要求:有一個(gè)長(zhǎng)度為100字節(jié)的表格,其中數(shù)據(jù)無(wú)序存放,在其中找出KEY,并記錄其在表中的地址號(hào)。若表中無(wú)此關(guān)鍵字,則返回0。基本原理:順序讀取表中內(nèi)容,將其與KEY比較,判斷是否相同。采用DPTR查表方式,其步驟:1)表的起始地址送入DPTR;2)表格的長(zhǎng)度放在某一個(gè)寄存器中;3)要查找的關(guān)鍵字放在某一內(nèi)存單元中;4)用MOVCA,@A+DPTR指令取數(shù);5)用CJNEA,direct,rel指令判斷是否是要找的關(guān)鍵字。

流程圖無(wú)序表中搜索關(guān)鍵字調(diào)試結(jié)果:當(dāng)(KEY)=08H,即希望查找數(shù)據(jù)8程序運(yùn)行后有:思考:1)如果不知道表的長(zhǎng)度,但知道表格的結(jié)束標(biāo)志是’$’,

應(yīng)該如何修改程序?2)表格能放在上電入口0000H的地方嗎?

為什么?

會(huì)有什么嚴(yán)重后果?

ORG0000HDB‘!’,3,4,8,10,4,….

2)表格能放在上電入口0000H的地方嗎?

ORG0000HDB‘!’,3,4,8,10,4,….不能?。?!程序匯編和裝載以后,程序空間結(jié)果如下:反匯編結(jié)果:表格數(shù)據(jù)被解析為指令,導(dǎo)致結(jié)果不可預(yù)見(jiàn)。4.3.5子程序設(shè)計(jì)子程序的作用調(diào)用和返回指令子程序的定義和調(diào)用方法參數(shù)傳遞方法

典型應(yīng)用

:多字節(jié)加法

現(xiàn)場(chǎng)與現(xiàn)場(chǎng)保護(hù)方法

堆棧沖突及其規(guī)避

子程序的作用:提高程序的模塊性,壓縮代碼長(zhǎng)度。4.3.5子程序設(shè)計(jì)子程序設(shè)計(jì)要素:1)子程序需命名。子程序的第一條指令應(yīng)加標(biāo)號(hào),

以便調(diào)用。2)要正確傳送參數(shù)。3)注意保護(hù)和恢復(fù)現(xiàn)場(chǎng)。4)子程序的末尾必須是RET指令。1、調(diào)用和返回指令調(diào)用指令:LCALL,ACALL返回指令:RET,RETI(用于中斷返回)ACALL:絕對(duì)調(diào)用LCALL:長(zhǎng)調(diào)用RET:子程序返回LCALLaddr16

;PC←PC+3,

;SP←SP+1,((SP))←PC7~0

;SP←SP+1,((SP))←PC15~8

;PC←addr16RET

;PC15~8←((SP)),SP←SP-1

;PC7~0←((SP)),SP←SP-1子程序返回指令。功能:將堆棧內(nèi)的返回地址送入PC,

使CPU返回到原斷點(diǎn)地址處,繼續(xù)執(zhí)行原程序。2、子程定義和調(diào)用方法

ORG0030HSTART: MOVSP,#40HAGAIN: SETBP1.0

LCALLDELAY CLRP1.0

LCALLDELAY SJMPAGAIN;------------------------------------------------------DELAY: MOVR6,#40DLOOP: NOP DJNZR6,DLOOP

RET ENDLCALL指令執(zhí)行后:

返回地址0038H

存入堆棧,SP指針向上移動(dòng)兩個(gè)單元380041H42Hxx40HSP準(zhǔn)備執(zhí)行LCALL指令…..SP0x40SP-max0x40PC轉(zhuǎn)移到子程序DELAY的入口……SP0x42SP-max0x42PC返回主程序……SP0x40SP-max0x42片上RAM空間

信息0x40:0000000000……

片上RAM空間

信息0x40:0038000000……

3、參數(shù)傳遞方法入口參數(shù):子程序執(zhí)行中所必須的寄存器值或存儲(chǔ)單元內(nèi)容(或地址)。出口參數(shù):子程序執(zhí)行完畢后,結(jié)果存放的寄存器或存儲(chǔ)單元(或地址)。

MOV A,#4 LCALL SQR ……

SQR: MOV B,A MUL AB RET入口參數(shù):A出口參數(shù):A,B入口參數(shù)、出口參數(shù)傳遞方法:1.利用A2.利用寄存器,或存儲(chǔ)單元3.利用堆棧

MOVR6,#40H LCALLDELAY …… ;------------------------------------------------- DELAY: NOP DLOOP: NOP DJNZR6,DLOOP RET例:兩個(gè)3字節(jié)數(shù)加法入口參數(shù):R0,R1出口參數(shù):R020H21H22H30H31H32H20H21H22H+23HR0R1多字節(jié)加法思考:程序執(zhí)行后,R0指向哪個(gè)單元?20H21H22H30H31H32H20H21H22H+23HR0R1R04、現(xiàn)場(chǎng)保護(hù)何謂“現(xiàn)場(chǎng)”?如何保護(hù)?

ORG0100H MOV R0,#30H MOV R2,#0AH CLR A LOOP: MOV @R0,A INC R0 ACALLDELAY DJNZ R2,LOOP……

DELAY: MOVR2,#20LOOP1: NOP DJNZR2,LOOP1 RET

保護(hù)現(xiàn)場(chǎng)的方法:1)選用其它寄存器2)選用其它組寄存器

;選用2組工作寄存器

SETBRS1;RS1=1 CLRRS0;RS0=03)利用堆棧保護(hù)重要寄存器內(nèi)容,如A,PSW

PUSHACC PUSHPSW …… POPPSW POPACC5、堆棧溢出和堆棧沖突堆棧溢出、沖突:棧頂位置超出了合理范圍。會(huì)使SP指針向上移動(dòng)的操作和事件: PUSH指令運(yùn)行后SP指針加1 LCALL、ACALL指令運(yùn)行后SP指針加2 MOVSP,#data;SP移動(dòng)情況由#data決定 中斷事件

習(xí)題課:匯編語(yǔ)言程序設(shè)計(jì)利用RET指令實(shí)現(xiàn)散轉(zhuǎn)單字節(jié)BC

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論