版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【3年高考2年模擬】2024高考地理二輪高頻考點(diǎn):第二練-地球運(yùn)動(dòng)規(guī)律
- 隋唐制度的變化與創(chuàng)新課件 2024-2025學(xué)年高一上學(xué)期統(tǒng)編版(2019)必修中外歷史綱要上
- 新解讀《GB 51079-2016城市防洪規(guī)劃規(guī)范 》
- 天津市南開(kāi)區(qū)2023-2024學(xué)年高二下學(xué)期7月期末考試語(yǔ)文試題(解析版)
- 質(zhì)量和環(huán)保保證協(xié)議
- 2024年職業(yè)技能(生態(tài)環(huán)境監(jiān)測(cè))專(zhuān)業(yè)技術(shù)員知識(shí)考試題庫(kù)與答案
- 人力資源政策對(duì)女性就業(yè)影響的研究
- 股權(quán)激勵(lì)機(jī)制在高新技術(shù)企業(yè)中的應(yīng)用
- 江蘇省南通市海門(mén)市2024年中考五模數(shù)學(xué)試題含解析
- unit4(進(jìn)階作業(yè))2024-2025學(xué)年六年級(jí)上冊(cè) 英語(yǔ) 人教版
- 《心系國(guó)防 強(qiáng)國(guó)有我》 課件-2024-2025學(xué)年高一上學(xué)期開(kāi)學(xué)第一課國(guó)防教育主題班會(huì)
- 第3課+追求人生理想+第一框+第3目【中職專(zhuān)用】2024-2025學(xué)年中職思想政治《哲學(xué)與人生》(高教版2023基礎(chǔ)模塊)
- 第一章第三節(jié) 地球的運(yùn)動(dòng)課件 2024-2025學(xué)年(2024)人教版地理七年級(jí)上冊(cè)
- 2024年公益性崗位考試真題及答案解析分享
- 新北師大版七年級(jí)上冊(cè)數(shù)學(xué)全冊(cè)教學(xué)課件(2024年秋季新版教材)
- 2024年聯(lián)通網(wǎng)絡(luò)運(yùn)營(yíng)及線務(wù)運(yùn)維技能競(jìng)賽考試題庫(kù)-上(單選題)
- 咸陽(yáng)市縣級(jí)地圖可編輯矢量行政區(qū)劃(陜西省)
- 2024年網(wǎng)絡(luò)安全技能競(jìng)賽(CTF)考試題庫(kù)600題(含答案)
- 2024年珠海市香洲區(qū)招考社會(huì)管理協(xié)管員(高頻重點(diǎn)提升專(zhuān)題訓(xùn)練)共500題附帶答案詳解
- 馬術(shù)俱樂(lè)部衛(wèi)生與會(huì)員安全
- 城市商業(yè)綜合體運(yùn)營(yíng)管理方案
評(píng)論
0/150
提交評(píng)論