版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第四章匯編語言程序設(shè)計知識要點:偽指令及其使用方法;順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)程序設(shè)計方法;子程序、查表程序設(shè)計方法;數(shù)據(jù)運算和處理的典型匯編語言實現(xiàn)方法。
本章學習目標:能夠讀懂匯編程序,并能夠編寫較為復雜的匯編語言程序,懂得匯編程序仿真軟件的使用,懂得調(diào)試匯編程序。4.匯編語言程序設(shè)計4.1程序設(shè)計概述4.2匯編語言偽指令4.3匯編語言程序結(jié)構(gòu)與設(shè)計4.匯編語言程序設(shè)計程序設(shè)計語言的種類程序的編譯和匯編程序設(shè)計的基本過程匯編語言的基本格式4.1程序設(shè)計概述1、
程序設(shè)計語言的種類高級語言:接近于人的常用語言形式,是一種面向過程
而獨立于機器的通用語言,如C語言。
voidmain() { chara=21; charb=48; charc; c=a+b; }4.1程序設(shè)計概述匯編語言:它是一種符號語言,是一種面向機器的語言。
ORG 0000H MOV A, 15H ADD A, 30H MOV R0, A SJMP $ END4.1程序設(shè)計概述機器語言:是用二進制0,1表示指令和數(shù)據(jù)的最原始的程序設(shè)計語言。RAWDATA:E5152530F880FEDisassembledDATA:0000 E515 MOV A, 15H0002 2530 ADD A, 30H0004 F8 MOVR0, A0005 80FE SJMP$4.1程序設(shè)計概述選擇程序設(shè)計語言類型的原則是什么?4.1程序設(shè)計概述2、
程序的編譯、匯編和鏈接4.1程序設(shè)計概述4.1程序設(shè)計概述3、
程序設(shè)計的基本過程分析問題確定算法設(shè)計流程分配資源編寫源程序調(diào)試、修改4.1程序設(shè)計概述4、
匯編語言的基本格式例:計算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[標號:]操作碼[第一操作數(shù),第二操作數(shù)]
[;注釋]4.1程序設(shè)計概述其中,Cycle:機器周期標號的作用:
為程序轉(zhuǎn)移和子程序的調(diào)用提供轉(zhuǎn)移目的地址。標號的命名方法:
1)由字母或數(shù)字組成,標號必須以字母開頭。
2)不可使用關(guān)鍵字,如助記符、寄存器名。
3)建議使用具有描述性的符號,能夠說明程序功能。[標號:]操作碼[第一操作數(shù),第二操作數(shù)]
[;注釋]4.1程序設(shè)計概述4.1程序設(shè)計概述4.2匯編語言偽指令4.3匯編語言程序結(jié)構(gòu)與設(shè)計偽指令的作用偽指令詳解偽指令的應用
4.2匯編語言偽指令4.2.1偽指令的作用和使用方法偽指令的作用寫在源文件中,用于控制匯編過程的命令。如設(shè)置程序或數(shù)據(jù)存儲區(qū)的地址、定義符號、判斷程序是否結(jié)束等。
沒有對應的機器碼,它是不可執(zhí)行的指令。4.2匯編語言偽指令偽指令種類:ORG:指定語句行裝載的起始地址,可以在同一文件中出現(xiàn)多次。END:指示語句行到此結(jié)束,一般出現(xiàn)在程序行結(jié)束以前。EQU:賦值指令,用于定義常數(shù),或地址。
等同于C中的#define語句。DATA:定義字節(jié)地址。BIT:
定義位符號地址。DB:定義字節(jié)數(shù)據(jù)。用于給代碼空間的存儲單元進行初始化、
賦值,或定義表格。DW:
定義字數(shù)據(jù),即兩個字節(jié)。用于給代碼空間的存儲單元
進行初始化、賦值,或定義表格。
DS:
預留若干個存儲單元,等同于C中的malloc函數(shù)。4.2匯編語言偽指令1、ORG(Origin)匯編起始地址命令
指定語句行裝載的起始地址。
命令格式:ORGadd16例如,ORG2000H START:MOVA,#40H
上例說明程序的起始地址是2000H,第一條指令就從2000H開始存放。4.2匯編語言偽指令在一個源程序中,可以多次使用ORG指令,以規(guī)定不同程序段的起始位置不允許有重疊,即不同的程序段之間不能有重疊。通常所規(guī)定的地址從小到大。4.2匯編語言偽指令2、END匯編終止命令
匯編語言源程序結(jié)束的偽指令,表示源程序結(jié)束。
在END以后所寫的指令,匯編程序都不予以處理,即不再翻譯。
一個源程序只能有一個END指令,放在程序的末尾。4.2匯編語言偽指令3、EQU(Equate)賦值指令。
將操作數(shù)段中的地址或數(shù)據(jù)賦值給標號。賦值后的標號,其值在整個程序中不改變,可多次使用。
命令格式:標號EQU數(shù)或匯編符號
例如:COUNT EQU 16H ;COUNT=16H ADDR EQU 3000H ;ADDR=3000H MOV A, #COUNT ;A=16H標號與EQU之間不能用“:”來作分隔符。4.2匯編語言偽指令4、DATA
數(shù)據(jù)地址賦值指令
將數(shù)據(jù)地址或代碼地址賦予所規(guī)定的標號。
命令格式為:字符名稱 DATA表達式
例如,MN DATA10H
匯編后,MN的值為10H。
DATA指令在程序中常用來定義存放數(shù)據(jù)的單元字節(jié)地址。4.2匯編語言偽指令5、BIT位地址符號命令
將位地址賦予所規(guī)定的字符名稱,常用于定義位符號地址。命令格式為:字符名稱BIT位地址例如, AABITP1.0 BBBITP2.04.2匯編語言偽指令6、DB(DefineByte)定義字節(jié)命令
定義字節(jié)數(shù)據(jù)。它的作用是從指定的地址單元開始,定義數(shù)據(jù)或ASCII碼字符,常用于定義數(shù)據(jù)常數(shù)表。
命令格式:
[標號:]DB字節(jié)常數(shù)表例如:
ORG2000H TAB:DB14H,26,'A' DB0AFH,‘BC’匯編結(jié)果:
(2000H)=14H(2001H)=1AH (2002H)=41H(2003H)=AFH (2004H)=42H(2005H)=43H2000H142001H1A2002H412003HAF2004H422005H434.2匯編語言偽指令7、DW(DefineWord)定義字命令
定義16位數(shù)據(jù)。從指定的地址單元開始,定義若干個字常數(shù),常用于定義地址表。
命令格式為:[標號:]DW字常數(shù)表
例如,ORG2000H TAB:DW7423H,00ABH,20匯編結(jié)果: (2000H)=74H(2001H)=23H (2002H)=00H(2003H)=ABH (2004H)=00H(2005H)=14H2000H742001H232002H002003HAB2004H002005H14提示:一個字占兩個存儲單元,其中高字節(jié)數(shù)存入低位地址,低字節(jié)數(shù)存入高位地址,即順序存放。4.2匯編語言偽指令8、DS(DefineStore)定義存儲區(qū)
定義存儲區(qū)。從指定的地址開始,保留一定數(shù)量的內(nèi)存單元,以備程序使用,其區(qū)域的大小由指令的操作數(shù)確定。
命令格式:[標號:]DS數(shù)值
例如: ORG1000H DS5 DB23H匯編結(jié)果:從地址1000H開始,保留5個字節(jié)的內(nèi)存單元,而(1005H)=23H1000H--1001H--1002H--1003H--1004H--1005H23H4.2匯編語言偽指令匯編語言偽指令應用實例4.2匯編語言偽指令ORG的應用:4.2匯編語言偽指令EQU、DATA的應用:4.2匯編語言偽指令BIT的應用:4.2匯編語言偽指令DB、DW的應用:4.2匯編語言偽指令使用DB、DW定義字符時可以用單引號,也可以用雙引號,其作用等同。4.2匯編語言偽指令程序裝載之后,程序空間顯示結(jié)果:4.1程序設(shè)計概述4.2匯編語言偽指令4.3匯編語言程序結(jié)構(gòu)與設(shè)計4.3匯編語言程序結(jié)構(gòu)與設(shè)計程序的基本結(jié)構(gòu)順序分支循環(huán)子程序4.3.1順序結(jié)構(gòu)例:編寫程序?qū)崿F(xiàn)兩個16bits無符號數(shù)的加法。(徐-例4.1)X+Y=0x5678+0x98761、基本原理分析1)分兩次完成,每次完成8位加法。2)采用間接尋址方式,讀取加數(shù)和被加數(shù),以及保存結(jié)果。ADDC
ADD4.3匯編語言程序結(jié)構(gòu)與設(shè)計2、資源分配
33H、32H:
存放被加數(shù),以及結(jié)果37H、36H:
存放加數(shù)
22H.0:
存放和的最高位
R0、R1:
數(shù)據(jù)指針4.3匯編語言程序結(jié)構(gòu)與設(shè)計3、流程圖4.3匯編語言程序結(jié)構(gòu)與設(shè)計4、
源程序4.3匯編語言程序結(jié)構(gòu)與設(shè)計5、程序調(diào)試與測試調(diào)試方法:單步、斷點調(diào)試方法程序測試:考慮有進位和沒有進位兩種情況。思考:1.保存和的最高位還有哪些方法?2.如何實現(xiàn)多字節(jié)數(shù)的減法?3.如何實現(xiàn)多字節(jié)BCD碼數(shù)的加法,以及減法?4.3匯編語言程序結(jié)構(gòu)與設(shè)計兩個16位數(shù)加法(C51實現(xiàn))4.3匯編語言程序結(jié)構(gòu)與設(shè)計#include<reg52.h>unsignedintdataa=0; //定義被加數(shù)變量unsignedintdatab=0; //定義加數(shù)變量bitc; //定義進位位變量
voidmain(void){ a=0x5678;//賦值被加數(shù)
b=0xF876;//賦值加數(shù)
a=a+b;c=CY;//保存進位位}4.3匯編語言程序結(jié)構(gòu)與設(shè)計4.3匯編語言程序結(jié)構(gòu)與設(shè)計在源文件中如果需要對芯片的寄存器進行操作,就必須通過include引述頭文件reg52.h!
4.3匯編語言程序結(jié)構(gòu)與設(shè)計unsignedintdataa=0; //定義被加數(shù)變量unsignedintdatab=0; //定義加數(shù)變量bitc; //定義位變量a分配到片上08H,09H單元b分配到片上0AH,0BH單元c分配到20H.0Compiling…….4.3匯編語言程序結(jié)構(gòu)與設(shè)計a分配到片外數(shù)據(jù)0000H,0001H單元b分配到片外數(shù)據(jù)0002H,0003H單元
unsignedintxdataa=0; //定義被加數(shù)變量unsignedintxdatab=0; //定義加數(shù)變量
4.3匯編語言程序結(jié)構(gòu)與設(shè)計存儲類型描述code程序存儲區(qū)(64KBytes),由操作碼“MOVC@A+DPTR”訪問
data直接尋址內(nèi)部數(shù)據(jù)存儲區(qū)idata間接尋址內(nèi)部數(shù)據(jù)存儲區(qū),可訪問全部內(nèi)部地址空間(256Bytes)bdata可位尋址內(nèi)部數(shù)據(jù)存儲區(qū),支持位和字節(jié)混合訪問。xdata外部數(shù)據(jù)存儲區(qū)(64KBytes),由操作碼“MOVX@DPTR”訪問
pdata分頁(256Bytes)外部數(shù)據(jù)存儲區(qū),由操作碼“MOVX@Ri"訪問
C51變量的存儲類型4.3匯編語言程序結(jié)構(gòu)與設(shè)計存儲器模式描述SMALL參數(shù)及局部變量放入可直接尋址的內(nèi)部存儲器(最大128B,默認存儲器類型為data)COMPAT參數(shù)及局部變量放入分頁外部存儲區(qū)(最大256B,默認存儲器類型為pdata)LARGE參數(shù)及局部變量直接放入外部數(shù)據(jù)存儲器(最大64KB,默認存儲器類型為xdata)C51的存儲器模式4.3.2分支結(jié)構(gòu)程序設(shè)計分支結(jié)構(gòu)形式與轉(zhuǎn)移指令典型分支結(jié)構(gòu)設(shè)計
二分支結(jié)構(gòu)
三分支結(jié)構(gòu)
散轉(zhuǎn)結(jié)構(gòu)4.3匯編語言程序結(jié)構(gòu)與設(shè)計4.3.2分支結(jié)構(gòu)程序設(shè)計分支結(jié)構(gòu)形式if…thenelse…4.3匯編語言程序結(jié)構(gòu)與設(shè)計switch(){}轉(zhuǎn)移指令1.無條件轉(zhuǎn)移 SJMP:
短跳轉(zhuǎn),轉(zhuǎn)移范圍-128B~+127B AJMP:
絕對跳轉(zhuǎn),轉(zhuǎn)移范圍2KB LJMP:
長跳轉(zhuǎn),轉(zhuǎn)移范圍64KB JMP:
散轉(zhuǎn)指令,實現(xiàn)多分支2.條件轉(zhuǎn)移
JZ/JNZ ;測試A
JC/JNC ;測試Cy JB/JBC/JNB ;測試某一比特位
CJNE ;比較兩數(shù)的大小;可用于形成三分支結(jié)構(gòu)DJNZ ;可用于循環(huán)結(jié)構(gòu)4.3匯編語言程序結(jié)構(gòu)與設(shè)計1、二分支結(jié)構(gòu)設(shè)計例:求取|x|(x為8bits符號數(shù))解:基本原理
當x<0:若已知[x]補=y(tǒng),則有[y]補=|x|4.3匯編語言程序結(jié)構(gòu)與設(shè)計
XDATA20H;
定義X為20H,符號數(shù)X存于20H單元中。
ORG0000H
LJMPSTART
ORG0200HSTART: MOVSP,#30H MOVA,X
JNBACC.7,ISPOS ;是正數(shù) CPLA ;對負數(shù)取反加1 INCAISPOS: MOVX,A ;保存結(jié)果HERE: SJMPHERE
END
4.3匯編語言程序結(jié)構(gòu)與設(shè)計例:二分支結(jié)構(gòu)應用找出XD1,XD2單元中的最小數(shù),并保存于XD3單元中。
X,Y均為無符號數(shù),XD1位于片外1000H。(徐-例4.2)
解:設(shè)X:(1000H)=10,Y:(1001H)=20基本原理: 利用SUBB和JC指令判斷數(shù)的大小關(guān)系徐-例4.22、
三分支程序設(shè)計例:判斷電壓值的范圍,并設(shè)置相應的標志。(徐-例4.3)X>V50: Y=11H(滿電)V40≤X≤V50: Y=10H(正常)X<V40: Y=01H(空電)解:基本原理: 利用CJNE和JC/JNC指令實現(xiàn)三分支
資源分配
A: 存放當前電壓值 50H:存放電壓上限值 40H:存放電壓下限值 30H:存放標志變量流程圖:10H徐-例4.3調(diào)試方法:1)合理選取測試樣本集C={34,33,31,30,29}
保證測試數(shù)據(jù)的完備性,每個支路都要測試到!?。?/p>
2)合理設(shè)置斷點3、
散轉(zhuǎn)結(jié)構(gòu)
散轉(zhuǎn)結(jié)構(gòu)的提出是為了僅僅使用單條指令就能高效地實現(xiàn)多分支。如滿足按鍵處理的要求。switch(X){
case0: { … break; } case1: { … break; } …}散轉(zhuǎn)結(jié)構(gòu)程序 作用:實現(xiàn)按鍵響應,以及其它需要實現(xiàn)多分支的應用。特點:效率高。實現(xiàn)方法:1)散轉(zhuǎn)指令表
2)散轉(zhuǎn)地址表
3)散轉(zhuǎn)偏移量表
例:根據(jù)R3的值,轉(zhuǎn)向3個分支,R3中存放支路號。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,計算偏移量偏移量=R3×31)散轉(zhuǎn)指令表;MLJMP.lst思考:1.若按鍵數(shù)目達到100個,應如何修改程序?2.若改用AJMP指令,應如何修改程序?
;MAJMP.asm ORG0400HSTART: MOVDPTR,#ENTRY ;賦指令表入口地址
MOVA,R3 ;計算偏移量
MOVB,#3MULAB;JNBOV,NEXT ;
INCDPH;乘積>255時,
需要執(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 ;計算偏移量
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)基本知識
循環(huán)結(jié)構(gòu)三要素典型程序設(shè)計
延時程序
數(shù)據(jù)塊求和、尋找最大數(shù)、均值濾波
4.3匯編語言程序結(jié)構(gòu)與設(shè)計1、基本知識應用背景:常常某一段代碼需要執(zhí)行多次。常見C語言形式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)條件典型匯編語言循環(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è)計
延時程序設(shè)計數(shù)據(jù)塊求和尋找最大數(shù)
均值濾波例:延時程序設(shè)計應用背景:LED燈控制START:MOVP1,#11111110B ;2cycles MOVP1,#11111101B ;2cycles SJMPSTART ;2cycles全速執(zhí)行時能夠觀察到LED閃爍現(xiàn)象嗎?信號頻率=1/6=167kHz(12MHz的晶振)人眼對頻率高于24Hz的信號已不敏感。降低信號頻率、改變占空比的方法:
START: MOVP1,#11111110B
NOP NOP MOVP1,#11111101B SJMPSTART若間隔1s需要插入多少個NOP指令?
NOP指令執(zhí)行時間1us(12MHz),需要插入106個。所需程序存儲空間為1M字節(jié)。試分析如下代碼段的執(zhí)行時間(晶振頻率=8MHz)
MOVR2,#255 ;1cycleLOOP2: NOP ;1cycle NOP NOP DJNZR2,LOOP2 ;2cycles循環(huán)體執(zhí)行時間 (1+1+1+2)×255=1275cycles整體時間:
1+1275=1276cycles=1.914ms
1cycle=12/8=1.5us若想延時20ms怎么辦? MOVR3,#10LOOP1: MOVR2,#255 ;1cycleLOOP2: NOP ;1cycle NOP NOP DJNZR2,LOOP2 ;2cycles
DJNZR3,LOOP1 ;2cycles如何精確計算代碼的運行時間?內(nèi)循環(huán)體執(zhí)行時間T內(nèi):5×255=1275cycles外循環(huán)體執(zhí)行時間T外:(1+T內(nèi)+2)×10
=(1+1275+2)×10
=12780cycles整體執(zhí)行時間:1+T外=12781cycles
=19.172ms如何粗略估算運行時間?(1+1+1+2)×255×10=12750cycles=19.125ms思考:1.若延時1s,應如何修改程序?2.若晶振頻率改為6MHz,則R3的初值為多少?3.如何形成多重循環(huán)?數(shù)據(jù)塊的處理問題:1,54,3,0,36,5,78,27,9,……..求取累加和;或找出最大數(shù)、或最小數(shù)、或奇數(shù)、或偶數(shù);或求取平均值;或找出大于X的所有數(shù);或找出某個特定數(shù);或由大到小排序。例:數(shù)據(jù)塊求和(胡-例4.2.9)應用領(lǐng)域:內(nèi)存測試通訊數(shù)據(jù)測試(校驗和測試法)基本原理:
利用ADD實現(xiàn)數(shù)據(jù)累加,僅保留和的低8位。資源分配:R0:數(shù)據(jù)指針
R1:循環(huán)計數(shù)器
A:校驗和(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)應用領(lǐng)域:
消除噪聲
基本原理:利用SUBB和JC指令判斷大小關(guān)系。資源分配:R1:數(shù)據(jù)指針R2:循環(huán)計數(shù)器A:存放MAX值核心代碼:LOOP: CLRC SUBBA,@R1 JNCNEXT;Cy=0,A中數(shù)較大MOVA,@R1SJMPNEXT1NEXT:ADDA,@R1;恢復A的值NEXT1:INCR1DJNZR2,LOOP思考:1.若尋找最小數(shù),應如何修改程序?2.比較兩數(shù)的大小還可使用什么指令?有何特點?比較轉(zhuǎn)移指令
CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE @Ri,#data,relCJNE指令不改變第一、第二操作數(shù)的內(nèi)容。例:
均值濾波(胡–例4.2.12)應用領(lǐng)域:數(shù)字濾波基本原理:
y=(X1+X2+X3+…+X8)÷8利用RRC指令實現(xiàn)雙字節(jié)除8
資源分配:R0、R1:累加和,前者存放高位R2:計數(shù)器任務(wù)要求:在一個采樣周期內(nèi)連續(xù)采樣8次,求采樣值的平均值。采樣數(shù)據(jù)從P1端口讀入采樣數(shù)據(jù)。1000100101001000100010010010001001R0R1CyCy01001000101001000CyRRCRRC如何實現(xiàn)雙字節(jié)無符號數(shù)右移一次?如何保證從P1口正確輸入采樣值?編程中不要忘記寫“讀預備指令”MOVP1,#0FFH;讀預備指令;保證P1能夠正確輸入外部信息MOVA,P1;讀入電壓值MOVA,P1;讀引腳,
執(zhí)行過程中會發(fā)出readpin信號
。均值濾波源程序4.3.4查表程序設(shè)計表格的用途表格的定義方法表格的結(jié)構(gòu)和表項地址求取方法查表指令查表程序典型應用
應用1:已知十六進制數(shù),求取其ASCII
應用2:利用散轉(zhuǎn)地址表,實現(xiàn)多分支
應用3:利用順序查表法,尋找關(guān)鍵字符4.3.4查表程序設(shè)計表格是計算機的一種基本數(shù)據(jù)結(jié)構(gòu)。查表法是一種非數(shù)值計算方法,不需復雜計算。主要優(yōu)點:可以大大簡化程序,提高程序執(zhí)行速度。主要缺點:如果表格過大,會占用較多的存儲單元。常用查表方法:計算查表法、順序查表法、對分查表法。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)和表項地址求取方法表項首地址=表首地址+表項序號×表項大小表項序號:0,1,2,3…表項大?。?4、查表指令MOVCA,@A+DPTR;對應于DPTR查表方式MOVCA,@A+PC;對應于PC查表方式5、查表程序典型應用
應用1:已知十六進制數(shù),求取其ASCII
應用2:利用散轉(zhuǎn)地址表,實現(xiàn)多分支
應用3:利用順序查表法,尋找關(guān)鍵字符例:利用查表法求取字符0-F的ASCII碼
(lkup1.asm)基本原理:
利用DB語句定義字符的ASCII碼表;
利用MOVC指令讀取程序空間中的表格內(nèi)容。
采用DPTR方式查表時,DPTR的初始值為表格首地址。
采用PC方式查表時,需要計算PC與表格首地址間的偏移量。尋找ASCII指令長度估算方法:指令基本長度為1字節(jié);逢立即數(shù)(8bits)長度加1;逢立即數(shù)(16bits)長度加2;逢直接尋址方式,指令長度加1。兩種查表方式特點比較例:利用散轉(zhuǎn)地址表實現(xiàn)多分支
基本原理:利用DW偽指令將程序入口地址定義在程序空間中;利用MOVC分兩次讀取16位散轉(zhuǎn)地址;利用JMP指令實現(xiàn)散轉(zhuǎn)。
例:利用散轉(zhuǎn)地址表實現(xiàn)多分支
解:利用DW偽指令將程序入口地址定義在程序空間中。散轉(zhuǎn)地址散轉(zhuǎn)地址存放的單元地址源程序:利用散轉(zhuǎn)地址表實現(xiàn)多分支MDWJMP.asm
例:利用順序查表,在無序表中查找關(guān)鍵字。任務(wù)要求:有一個長度為100字節(jié)的表格,其中數(shù)據(jù)無序存放,在其中找出KEY,并記錄其在表中的地址號。若表中無此關(guān)鍵字,則返回0?;驹恚喉樞蜃x取表中內(nèi)容,將其與KEY比較,判斷是否相同。采用DPTR查表方式,其步驟:1)表的起始地址送入DPTR;2)表格的長度放在某一個寄存器中;3)要查找的關(guān)鍵字放在某一內(nèi)存單元中;4)用MOVCA,@A+DPTR指令取數(shù);5)用CJNEA,direct,rel指令判斷是否是要找的關(guān)鍵字。
流程圖無序表中搜索關(guān)鍵字調(diào)試結(jié)果:當(KEY)=08H,即希望查找數(shù)據(jù)8程序運行后有:思考:1)如果不知道表的長度,但知道表格的結(jié)束標志是’$’,
應該如何修改程序?2)表格能放在上電入口0000H的地方嗎?
為什么?
會有什么嚴重后果?
ORG0000HDB‘!’,3,4,8,10,4,….
2)表格能放在上電入口0000H的地方嗎?
ORG0000HDB‘!’,3,4,8,10,4,….不能!??!程序匯編和裝載以后,程序空間結(jié)果如下:反匯編結(jié)果:表格數(shù)據(jù)被解析為指令,導致結(jié)果不可預見。4.3.5子程序設(shè)計子程序的作用調(diào)用和返回指令子程序的定義和調(diào)用方法參數(shù)傳遞方法
典型應用
:多字節(jié)加法
現(xiàn)場與現(xiàn)場保護方法
堆棧沖突及其規(guī)避
子程序的作用:提高程序的模塊性,壓縮代碼長度。4.3.5子程序設(shè)計子程序設(shè)計要素:1)子程序需命名。子程序的第一條指令應加標號,
以便調(diào)用。2)要正確傳送參數(shù)。3)注意保護和恢復現(xiàn)場。4)子程序的末尾必須是RET指令。1、調(diào)用和返回指令調(diào)用指令:LCALL,ACALL返回指令:RET,RETI(用于中斷返回)ACALL:絕對調(diào)用LCALL:長調(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返回到原斷點地址處,繼續(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指針向上移動兩個單元380041H42Hxx40HSP準備執(zhí)行LCALL指令…..SP0x40SP-max0x40PC轉(zhuǎn)移到子程序DELAY的入口……SP0x42SP-max0x42PC返回主程序……SP0x40SP-max0x42片上RAM空間
信息0x40:0000000000……
片上RAM空間
信息0x40:0038000000……
3、參數(shù)傳遞方法入口參數(shù):子程序執(zhí)行中所必須的寄存器值或存儲單元內(nèi)容(或地址)。出口參數(shù):子程序執(zhí)行完畢后,結(jié)果存放的寄存器或存儲單元(或地址)。
MOV A,#4 LCALL SQR ……
SQR: MOV B,A MUL AB RET入口參數(shù):A出口參數(shù):A,B入口參數(shù)、出口參數(shù)傳遞方法:1.利用A2.利用寄存器,或存儲單元3.利用堆棧
MOVR6,#40H LCALLDELAY …… ;------------------------------------------------- DELAY: NOP DLOOP: NOP DJNZR6,DLOOP RET例:兩個3字節(jié)數(shù)加法入口參數(shù):R0,R1出口參數(shù):R020H21H22H30H31H32H20H21H22H+23HR0R1多字節(jié)加法思考:程序執(zhí)行后,R0指向哪個單元?20H21H22H30H31H32H20H21H22H+23HR0R1R04、現(xiàn)場保護何謂“現(xiàn)場”?如何保護?
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
保護現(xiàn)場的方法:1)選用其它寄存器2)選用其它組寄存器
;選用2組工作寄存器
SETBRS1;RS1=1 CLRRS0;RS0=03)利用堆棧保護重要寄存器內(nèi)容,如A,PSW
PUSHACC PUSHPSW …… POPPSW POPACC5、堆棧溢出和堆棧沖突堆棧溢出、沖突:棧頂位置超出了合理范圍。會使SP指針向上移動的操作和事件: PUSH指令運行后SP指針加1 LCALL、ACALL指令運行后SP指針加2 MOVSP,#data;SP移動情況由#data決定 中斷事件
習題課:匯編語言程序設(shè)計利用RET指令實現(xiàn)散轉(zhuǎn)單字節(jié)BC
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度礦產(chǎn)資源開發(fā)合作協(xié)議3篇
- 二零二五年度互聯(lián)網(wǎng)廣告投放與監(jiān)測合同3篇
- 2025版餐飲業(yè)環(huán)保設(shè)施合作建設(shè)合同范本3篇
- 2024年廣東揭陽技師學院招聘考試真題
- 2024年成都銀行重慶分行西安分行社會招聘考試真題
- 2024年安康紫陽國企招聘文員考試真題
- 2024年甘肅省社會工作綜合服務(wù)中心選調(diào)工作人員筆試真題
- 怎么做視頻航模課程設(shè)計
- 用芯片做的課程設(shè)計
- 裝修公司運營課程設(shè)計
- 空氣壓縮機檢驗原始記錄表
- 叉車部件的涂裝工藝及體系
- DB32∕T 3261-2017 水利工程預拌混凝土應用技術(shù)規(guī)范
- 物理學習的8種思考方式
- 閱讀題賒小雞
- 中國風圍棋對弈雅致文藝教育培訓活動策劃版
- 鋼管購銷合同
- 基于51單片機的簡易計算器時間顯示(LCD1602顯示)
- engel恩格爾注塑機機操作說明書
- 2022國開大學電大??啤掇r(nóng)科基礎(chǔ)化學》期末試題及答案
- 醫(yī)院設(shè)備科工作流程圖
評論
0/150
提交評論