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

下載本文檔

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

文檔簡介

1、1第第4 4章章 匯編語言程序設(shè)計匯編語言程序設(shè)計單片機原理及應(yīng)用2 2 第第4章章 目錄目錄4.1 單片機匯編語言程序設(shè)計概述單片機匯編語言程序設(shè)計概述 4.1.1 機器語言、匯編語言和C語言 4.1.2 匯編語言的特點4.2 偽指令偽指令4.3 匯編語言程序的基本結(jié)構(gòu)形式匯編語言程序的基本結(jié)構(gòu)形式 4.3.1 順序程序 4.3.2 分支程序 4.3.3 循環(huán)程序 4.3.4 位操作程序34.4 匯編語言程序設(shè)計舉例匯編語言程序設(shè)計舉例 4.4.1 順序程序設(shè)計 4.4.2分支程序設(shè)計 4.4.3 循環(huán)程序設(shè)計 4.4.4 子程序設(shè)計34n匯編語言的相關(guān)概念、匯編語言程序的基本結(jié)構(gòu)形式、編匯

2、編語言的相關(guān)概念、匯編語言程序的基本結(jié)構(gòu)形式、編寫匯編語言程序的基本方法。寫匯編語言程序的基本方法。目的:目的:由于匯編語言是面向機器硬件的語言,掌握匯編語言由于匯編語言是面向機器硬件的語言,掌握匯編語言 能夠更好的理解單片機的內(nèi)部結(jié)構(gòu)和工作原理。能夠更好的理解單片機的內(nèi)部結(jié)構(gòu)和工作原理。內(nèi)容概要內(nèi)容概要454 4.1 .1 單片機匯編語言程序設(shè)計概述單片機匯編語言程序設(shè)計概述4 4.1.1 .1.1 機器語言、匯編語言和機器語言、匯編語言和C C語言語言計算機所用的程序設(shè)計語言可以分為三類:機器語言,匯編語言,高級語言。1 1機器語言機器語言機器語言。也稱為機器碼機器碼,是一種由二進制碼“0

3、 0”、“1 1”組成的、能夠被計算機直接識別和執(zhí)行的語言。用機器語言表示的程序,又稱目標程序目標程序。單片機程序設(shè)計中,不管采用高級語言還是匯編語言編寫,最終下載到單片機芯片的HexHex文件或BinBin文件也都是二進制機器碼。由于二進制代碼較為冗長,通常用一位十六進制數(shù)來表示四位二進制數(shù),即應(yīng)用十六進制十六進制表示機器碼。56 6例如例如,51單片機控制P1口實現(xiàn)流水燈效果的某Hex文件,用記事本打開該文件,可以看到如下幾行機器碼:圖圖4-14-1 5151控制控制P1P1口實現(xiàn)流水燈的機器碼口實現(xiàn)流水燈的機器碼從圖41可以看出,機器碼用十六進制數(shù)表示,但如果不通過指令表進行對照,難以看

4、出機器碼與指令對應(yīng)的關(guān)系,編寫、修改和維護困難,容易出錯,難以發(fā)現(xiàn)和排除錯誤。7 72 2匯編語言匯編語言為了解決機器語言難以編程和閱讀的難題,應(yīng)用匯編語言來表示機器語言,應(yīng)用匯編語言編寫程序的每一條指令與機器碼一一對應(yīng)。例如,圖41的流水燈機器碼的匯編程序為: MOV A, #0FEH ;對累加器A賦值,F(xiàn)EH=1111 1110B,最低位LED亮 START: RL A ;自定義代碼段START,對A進行不帶進位Cy的左循環(huán)移位 MOV P1,A ;將A的值送入P1口,點亮某個引腳的LED LCALL DELAY ;調(diào)用延時子程序 LJMP START ;跳轉(zhuǎn)回START段,實現(xiàn)流水燈循環(huán)

5、亮滅的效果 DELAY: MOV R0, #00H ;自定義延時代碼段,對寄存器R0賦值0,用于自減延時DELAY1:MOV R1, #00H ;R1賦值0,用于內(nèi)循環(huán)自減延時 DJNZ R1, $ ;(R1)1R1,(R1)0原地跳轉(zhuǎn),循環(huán)256次 DJNZ R0, DELAY1 ;(R0)1R0,(R0)0轉(zhuǎn)移到DELAY1,循環(huán)256次 RET ;返回主程序 END ;程序結(jié)束8 8用助記符表示的匯編語言比機器碼容易學習和使用。自MCS51單片機誕生之日起,匯編語言就伴隨著其它發(fā)展并獲得了廣泛應(yīng)用。由于單片機不能直接識別和執(zhí)行匯編語言編寫的程序,需要將匯編語言源程序轉(zhuǎn)換(翻譯)為二進制的

6、機器碼(目標程序),這一轉(zhuǎn)換過程稱為“匯編”,而用于轉(zhuǎn)換的工具稱為匯編程序,如圖42所示。9 9其中,源文件是匯編語言編寫的文件源文件是匯編語言編寫的文件,默認后綴名為ASM;匯編程序為Keil、IAR等專門的編譯工具,也稱為編譯器;目標程序是最終燒寫到單片機芯片的Hex或Bin文件。圖圖4-24-2 源程序、匯編程序、目標程序的關(guān)系源程序、匯編程序、目標程序的關(guān)系103 3C51C51語言語言匯編語言面向機器,便于理解和熟悉微處理器的內(nèi)部結(jié)構(gòu),存儲區(qū)域的特點和特殊功能寄存器的功能,指令執(zhí)行過程的基本工作原理,微處理器應(yīng)用系統(tǒng)電路設(shè)計等。但是,匯編語言開發(fā)周期長、設(shè)計成本高,也不易于移植。為此

7、,人們將高級語言引入微處理器領(lǐng)域。目前基本采用C語言,例如51單片機的C51,MSP430的C430等。C51易學易用,成熟穩(wěn)定,性能已經(jīng)接近匯編語言,優(yōu)化后的機器代碼長度也能控制在匯編語言的1.21.5倍左右,網(wǎng)上的各種資源豐富,獲得了市場和單片機愛好者的廣泛認可,成為單片機應(yīng)用系統(tǒng)設(shè)計的首選語言。101111當然,C51也并不能完全替代匯編語言。在對時間和空間要求較高的場合,匯編語言仍然是不可或缺的,例如,在典型的冒泡排序算法中,C51需要1033s,而匯編語言只需要376s,性能的差異依然不小。不少工程師為了保持單片機系統(tǒng)的最佳性能,采用C51與匯編進行混合編程的方法進行程序設(shè)計。另外,

8、即使是高級語言編寫的源程序,經(jīng)過程序的編譯鏈接,產(chǎn)生絕對目標代碼的Hex文件,對編譯的Hex文件進行反編譯后仍然是以匯編程序的形式出現(xiàn)的。12上面流水燈的Hex文件的反編譯結(jié)果如下:地址標號 匯編程序 指令地址 指令代碼 Q0000: MOV A, #0FEH ;0000 74 FE Q0002: RL A ;0002 23 MOV P1,A ;0003 F5 90 LCALL Q000B ;0005 12 00 0B LJMP Q0002 ;0008 02 00 02 Q000B: MOV R0, #00H ;000B 78 00 Q000D: MOV R1, #00H ;000D 79 0

9、0 DJNZ R1, $ ;000F D9 FE DJNZ R0, Q000D ;0011 D8 FA RET ;0013 22其中第四列為指令代碼,即機器碼(對應(yīng)圖4-1)。要真正掌握單片機技術(shù),應(yīng)該掌握匯編程序。C51請參閱第13章。12134 4.1.2 .1.2 匯編語言的特點匯編語言的特點(1)(1) 匯編語言比C51的學習和編程、調(diào)試的難度要大,因此多用 于編寫4KB以下、運算不太復(fù)雜的小程序。(2)(2) 匯編語言程序占用的存儲空間小,運行效率高。只有通過 匯編語言,才能寫出性能最優(yōu)的程序。(3)(3) 面向硬件,能夠直接管理和控制硬件設(shè)備,例如對I/O接口、 存儲器的訪問等。(

10、4)(4) 與單片機內(nèi)部結(jié)構(gòu)緊密結(jié)合,例如累加器A、寄存器R0等。 掌握匯編語言才能更好的理解內(nèi)部結(jié)構(gòu)和工作原理。(5)(5) 依賴于機器硬件,缺乏通用性,程序難以移植。(6)(6) 高級語言一般用十進制編寫,匯編語言多用十六進制來表 示二進制數(shù)。1314144.2 4.2 偽指令偽指令 第3章介紹的每條指令分別對應(yīng)單片機能夠執(zhí)行的一個機器碼。還有一類指令沒有對應(yīng)的機器碼,不生成目標程序,也不影響程序的執(zhí)行,僅用于對匯編過程進行某種控制或操作,這類指令稱為偽指令。常用的偽指令有8條。15151 1ORGORG ORG用于定義起始地址,也就是緊隨其后的程序段或數(shù)據(jù)塊將被設(shè)置在所規(guī)定的起始地址。O

11、RG為origin(源點)的縮寫。其格式為: ORG addr16 其中,addr16addr16表示程序存儲器中的一個16位地址,一般是一個十六進制數(shù),或者是定義好的標號。一個源程序中可以多次使用ORG指令,以表示不同程序段的起始位置。但是所規(guī)定的地址應(yīng)該按照順序從小到大,不能交叉或重疊。1616例例4141 ORG 1000HSTART:MOV A, 20H ORG 1500H NEXT:MOV R0, #30H當使用編譯器匯編完這段程序后,就會自動把“MOV A, 20H”這條指令(雙字節(jié)指令)放置在程序存儲器中的地址為1000H和1001H單元中。START這個標號所表示的地址就是10

12、00H,而NEXT所在行的指令首地址是1500H。17172 2ENDEND END用于表示程序結(jié)束。整個源程序中只能有一條END命令,且應(yīng)該位于程序的最后。如果END出現(xiàn)在源程序的中間,則后面的程序?qū)痪幾g器省略。 其格式為: END18183 3EQUEQUEQU用于賦值,equal(等于)的縮寫,與C語言的#define類似,相當于“=”。其格式為:常量名 EQU 操作數(shù)/符號其中,操作數(shù)可以是8位、16位二進制數(shù),也可以用十進制、十六進制表示。符號為其它的匯編符號。例例4242 X EQU 50;X等于50,十進制 Y EQU 1000H;Y等于1000H,十六進制BUTTON2 E

13、QU P1.0;BUTTON2等價于P1.0編譯器進行匯編時,程序中所有的常量X就具有50的值,Y、BUTTON2同理。19194 4DATADATADATA用于賦值。其格式為:變量名 DATA 操作數(shù)/表達式例例4343 X DATA 2000H;X等于2000H編譯器匯編時,程序中所有的變量X都用2000H代替。DATA的功能與EQU類似,但也存在以下區(qū)別:(1)(1)EQUEQU先定義才能使用,而DATA不受限制。也就是說EQU定義的是常量,DATA定義變量。(2)(2)EQUEQU可以把一個匯編符號賦給一個字符名,DATA不能。(3)(3)DATADATA可以將一個表達式的值賦給變量,

14、而EQU不能。(4)(4)DATADATA通常用于定義數(shù)據(jù)地址。20205 5DBDBDB用于從指定的地址單元開始,定義若干單字節(jié)內(nèi)存單元的內(nèi)容。其格式為:標號: DB 單字節(jié)操作數(shù)操作數(shù)可以是8位二進制、十進制、十六進制數(shù)值或ASCII碼。例例4444 ORG 2000HDB 3, 41H, 0F7H, BDB “123Ac”編譯器進行匯編后,存儲單元的內(nèi)容分別為:(2000H)=3 (2001H)=41H (2002H)=F7H(2003H)=42H (B) (2004H)=31H (1) (2005H)=32H (2)(2006H)=33H (3) (2007H)=41H (A) (20

15、08H)=63H (c)21216 6DWDWDW用于從指定的地址單元開始,定義若干雙字節(jié)存儲單元的內(nèi)容。其格式為:標號: DW 雙字節(jié)操作數(shù)雙字節(jié)操作數(shù)是16位二進制數(shù)值、十進制和十六進制數(shù)值,或ASCII碼,其中高8位存入低地址字節(jié),低8位存入高地址字節(jié)。如果不足16位,則高位用0填充。例例4545 ORG 2000HTAB: DW 1234H,100,69H編譯器進行匯編后,存儲單元的內(nèi)容分別為:(2000H)=12H (2001H)=34H (2002H)=00H(2003H)=64H (100)(2004H)=00H (2005H)=69H22227 7DSDSDS用于從指定的地址單

16、元開始,保留若干字節(jié)的存儲單元作為備用。其格式為:標號: DS 操作數(shù)例例4646 ORG 0050HDS 06HDB 5AH編譯器匯編后,從0050H開始保留6個字節(jié)的單元給程序備用,也就是占用了0050H0055H。而5AH存放在0056H存儲單元。要注意的是,DB、DW、DS偽指令都只對程序存儲器起作用,不能對數(shù)據(jù)存儲器的內(nèi)容進行賦值或初始化。23238 8BITBITBIT用于定義位常量,與EQU類似。有些編譯器不具備BIT命令時,可以用EQU來代替BIT。其格式為:常量名 BIT 操作數(shù)/符號例例4747 flag BIT 20H key BIT P1.1編譯器進行匯編后,位地址20

17、H賦值給flag,key作為P1.1使用。24244 4. .3 3 匯編語言程序的基本結(jié)構(gòu)形式匯編語言程序的基本結(jié)構(gòu)形式與高級語言一樣,匯編語言程序設(shè)計中廣泛應(yīng)用結(jié)構(gòu)化的程序設(shè)計方法。采用結(jié)構(gòu)化設(shè)計的程序。按照結(jié)構(gòu)化程序設(shè)計的方法,匯編語言程序一般有順序、分支、循環(huán)等幾種結(jié)構(gòu)。三種結(jié)構(gòu)的程序分別稱為順序程序、分支程序、循環(huán)程序,如圖4-3所示。圖圖4-34-3 順序程序、分支程序、循環(huán)程序順序程序、分支程序、循環(huán)程序(a) (a) 順序程序順序程序(b) (b) 分支程序分支程序(c) (c) 循環(huán)程序循環(huán)程序25254.3.1 4.3.1 順序程序順序程序 按照指令的順序逐條執(zhí)行指令,也稱

18、為簡單程序或直線程序。按指令的排列順序逐條執(zhí)行,直到全部指令執(zhí)行完畢。順序程序主要使用數(shù)據(jù)傳送指令和數(shù)據(jù)運算類指令。例例4848 對寄存器R1、R2、R3中存儲的數(shù)據(jù)進行相加,結(jié)果存儲到R4。MOV A, R1 ;R1的數(shù)據(jù)復(fù)制到累加器AADD A, R2 ;A與R2的數(shù)據(jù)相加,結(jié)果存儲在AADDC A, R3 ;A與R3的數(shù)據(jù)進行帶進位相加,結(jié)果存儲在AMOV R4, A ;將A的數(shù)據(jù)復(fù)制到R426264.3.2 4.3.2 分支程序分支程序 根據(jù)不同條件轉(zhuǎn)向不同的處理程序來改變程序執(zhí)行的順序,這種結(jié)構(gòu)的程序稱為分支程序。分支程序一般是利用條件轉(zhuǎn)移指令來進行判斷,通過轉(zhuǎn)移指令的組合,可以形成

19、單分支、雙分支、多路分支形式。常用的轉(zhuǎn)移指令有JZ、JNZ、CJNE、JC、JNC、JB、JNB、JBC、DJNZ,多用于正負數(shù)判斷、位單元狀態(tài)判斷、進借位判斷、是否為“0”的判斷、大小判斷等。27274.3.3 4.3.3 循環(huán)程序循環(huán)程序 在一個程序段要重復(fù)多次運行的情況下,可以采用循環(huán)方法設(shè)計程序。循環(huán)程序主要有5個部分:(1)(1) 初始化部分:設(shè)置循環(huán)初值,包括循環(huán)變量計數(shù)、數(shù)據(jù)指針初 值,為循環(huán)作準備。(2)(2) 循環(huán)處理部分:重復(fù)執(zhí)行的程序段,是循環(huán)程序的主體,稱為 循環(huán)體。循環(huán)體可以是單條指令,也可以是復(fù)雜的程序段。(3)(3) 循環(huán)修改。每循環(huán)一次,就要修改循環(huán)次數(shù)、數(shù)據(jù)及

20、地址指針 等。(4)(4) 循環(huán)控制部分:控制循環(huán)的次數(shù),為進行下一次循環(huán)修改計數(shù) 器和指針的值,并檢查循環(huán)次數(shù)是否達到退出循環(huán)的條件。(5)(5) 循環(huán)結(jié)果處理:分析和存儲結(jié)果。2828循環(huán)可以是單重循環(huán)和多重循環(huán)。如果在循環(huán)程序的循環(huán)體中不再包含循環(huán)程序,即為單重循環(huán);如果在循環(huán)體中還包含有循環(huán)程序,這種現(xiàn)象就稱為循環(huán)嵌套,這樣的程序就稱為多重循環(huán)程序。在多重循環(huán)中,內(nèi)外循環(huán)不得交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部。通常對循環(huán)初始化只執(zhí)行一次,而對循環(huán)處理、循環(huán)控制可以執(zhí)行多次。循環(huán)結(jié)構(gòu)可以分為圖44所示的兩種形式:計數(shù)控制、條件控制。2929圖圖4-44-4 計數(shù)控制結(jié)構(gòu)和條

21、件控制結(jié)構(gòu)計數(shù)控制結(jié)構(gòu)和條件控制結(jié)構(gòu)(a) (a) 計數(shù)控制結(jié)構(gòu)計數(shù)控制結(jié)構(gòu)(b) (b) 條件控制結(jié)構(gòu)條件控制結(jié)構(gòu)30304.3.4 4.3.4 位操作程序位操作程序 C、C+、Java、C#、VB等主流高級語言主要面向8位或8位以上的數(shù)據(jù)處理,而檢測和控制應(yīng)用系統(tǒng)中常常需要對1位信息進行處理,51單片機提供了用于位操作的指令,位操作的指令主要有MOV(傳送)、CLR(清0)、SETB(置1)、ANL(與)、ORL(或)、CPL(取反)、位單元狀態(tài)的判斷控制指令等。3131 例例4949 單片機應(yīng)用系統(tǒng)上電和復(fù)位后常常要求測試單片機外部擴展各部件是否能夠正常工作。編寫程序,測試外部擴展RAM

22、的地址為4000H的存儲單元是否損壞。MOV DPTR, #4000H ;設(shè)置要測試的外部RAM的地址MOV A, #55H ;55H作為測試數(shù)據(jù)MOV B, A ;(B)=55H,保存測試數(shù)據(jù)MOVX DPTR, A ;55H寫入外部RAM的4000H存儲單元中MOVX A, DPTR ;寫入數(shù)據(jù)55H后,再讀回數(shù)據(jù)AXRL A, B ;A、B各位進行異或,比較寫入和讀回 ;的數(shù)據(jù)是否一致JNZ BAD ;如果(A)(B),RAM可能已損壞,跳轉(zhuǎn) ;到BAD程序段3232位操作可以直接對P0、P1、P2、P3等端口的每個引腳進行單獨控制,例如SETB P1.0將引腳P1.0置高電平,而CPL

23、 P1.0可以將P1.0輸出的電平取反。位操作能夠?qū)?nèi)部RAM的20H2FH字節(jié)單元中的每個位單元,以及對特殊功能寄存器中能夠進行位尋址的位單元進行單獨控制。例例410410CLR 20H.3 ;對20 H.3 (位地址為03H)清零 MOV C, 40H ;將位地址為40H單元的內(nèi)容送入進位位CYSETB RS0 CLR RS1 ;選擇當前寄存器組為第一組(參見表22)33334 4. .4 4 匯編語言程序設(shè)計舉例匯編語言程序設(shè)計舉例匯編語言程序設(shè)計的一般步驟有:任務(wù)分析,確定算法,算法優(yōu)化,設(shè)計程序流程圖,分配字節(jié)單元和位單元及有關(guān)I/O端口,擴展部件的端口地址,編寫程序并加上注釋,仿真

24、調(diào)試,實物調(diào)試。在使用匯編語言進行程序設(shè)計的時候,要注意注意3 3個問題個問題:模模塊化設(shè)計塊化設(shè)計;循環(huán)程序循環(huán)程序;子程序子程序。模塊化設(shè)計就是將一個復(fù)雜的任務(wù)劃分為若干個模塊(程序段),以提高程序的可讀性、可靠性,使得程序?qū)哟胃鼮榍逦?。循環(huán)程序能夠大大減少對存儲空間的占用。子程序可以增加程序段的可重用性,簡化程序結(jié)構(gòu)。34344.4.1 4.4.1 順序程序設(shè)計順序程序設(shè)計 順序結(jié)構(gòu)程序是一種最簡單、最基本的程序,無分支,按照程序編寫的順序依次執(zhí)行。 例例411411 編寫程序,將外部RAM的8000H單元的內(nèi)容傳輸?shù)?FFFH單元。分析:51單片機外部擴展的存儲器或部件與單片機內(nèi)部寄存

25、器 或RAM之間的數(shù)據(jù)傳送,必須通過累加器A來實現(xiàn),外 部擴展的存儲器的存儲單元或部件相互之間的數(shù)據(jù)傳輸 也是如此。編程時,需要注意對16位地址指針DPTR的正 確設(shè)置。3535 ORG 0000H LJMP MAIN ;跳轉(zhuǎn)至主程序執(zhí)行, ;避開中斷服務(wù)程序入口地址 ORG 0030H MAIN:MOV DPTR, #8000H ;16位地址值8000HDPTR MOVX A, DPTR ;存儲單元(8000H)A MOV DPTR, #7FFFH ;地址指針DPTR指向7FFFH存儲單元 MOVX DPTR, A ;A中的內(nèi)容傳輸給7FFFH單元 SJMP $ END3636 例例4124

26、12 設(shè)某一變量的數(shù)據(jù)保存在片內(nèi)RAM的20H單元中,取值范圍為00H09H,編寫查表程序,查出變量的平方值,并存入片內(nèi)RAM的21H單元。 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV DPTR, #TAB ;平方值表的起始地址值DPTR MOV A, 20H ;需要求平方的值(20H)A MOVC A, A+DPTR ;(A)+(DPTR)組成平方值單元地址, ;單元內(nèi)容A MOV 21H, A ;查表得到的平方值21H SJMP $ ;無限循環(huán) TAB: DB 0,1,4,9,16,25,36,49,64,81 ;00H09H的十進制數(shù)平方值表 END3

27、737查表查表就是根據(jù)自變量自變量x x,在表格中找表格中找y y,使y=f(x)y=f(x)。x一般為連續(xù)變化的整數(shù),將對應(yīng)的y放置在一個線性表中,在需要的時候通過查表就能快速獲取結(jié)果。查表方法廣泛應(yīng)用于顯示、打印、數(shù)據(jù)轉(zhuǎn)換,能夠極大地加快程序執(zhí)行的速度。例412的程序中,數(shù)據(jù)指針DPTR的地址值為TAB,即表格中存儲數(shù)據(jù)0的單元地址值,指令SJMP $是一條空循環(huán)指令,單片機未作任何實質(zhì)性工作,處于等待狀態(tài),該指令在編寫有中斷服務(wù)程序的主程序時是一條經(jīng)常被使用的指令Q38384.4.2 4.4.2 分支程序設(shè)計分支程序設(shè)計 分支程序的結(jié)構(gòu)有兩種:雙分支結(jié)構(gòu)和多分支結(jié)構(gòu)(散轉(zhuǎn)分支結(jié)構(gòu))。圖圖

28、4-54-5 分支程序結(jié)構(gòu)分支程序結(jié)構(gòu)(a) (a) 雙分支結(jié)構(gòu)雙分支結(jié)構(gòu)(b) (b) 多分支結(jié)構(gòu)多分支結(jié)構(gòu)3939例例413413 設(shè)變量x以無符號數(shù)的形式存放在內(nèi)部RAM的30H單元,變量y與x有如下關(guān)系:根據(jù)x的取值求出y,并將其存入內(nèi)部RAM的31H單元。 0FH 0AH= 0AH =0AH 01H 0AH,Cy0; ;如果(A)0AH,則0FHA SJMP RESULT XIAOYU: MOV A, #01H ;因為(A)=x0AH,則01HA RESULT: MOV 31H, A ;31H(A) SJMP $ END注意有兩條SJMP RESULT,否則31H中內(nèi)容都會是0AH。

29、4141例413是用條件轉(zhuǎn)移指令實現(xiàn)分支,下面介紹利用間接轉(zhuǎn)移指令JMP來實現(xiàn)多分支程序轉(zhuǎn)移(稱為散轉(zhuǎn)程序),通常有兩種設(shè)計方法。(1) (1) 查轉(zhuǎn)移地址表,用轉(zhuǎn)移地址構(gòu)成散轉(zhuǎn)表,將表中的內(nèi)容作為轉(zhuǎn)移的目標地址。(2)(2) 查轉(zhuǎn)移指令表,用轉(zhuǎn)移到不同程序的轉(zhuǎn)移指令構(gòu)成散轉(zhuǎn)表,判斷條件后,轉(zhuǎn)到表中指令執(zhí)行。4242例例414414 試編寫根據(jù)R7的內(nèi)容轉(zhuǎn)向?qū)?yīng)的入口地址的程序,R7的內(nèi)容為0n(n127),處理程序的入口地址為PR0PRn。分析分析:將PR0PRn的入口地址值列在一個表格中,每一個地址為16位地址值,占兩個單元。假設(shè)PR0PRn入口地址表格的首地址為TAB,則PR0的高8位地址值在表格的首地址中,低8位地址值在首地址TAB+1的存儲單元中;而PRx在表中的偏移量為2x,因此將R7的內(nèi)容乘以2即得到PRx在表中的偏移地址,從偏移地址2x和2x+1兩個單元分別取出PRx的高8位地址和低8位地址送至DPTR寄存器,將A清0,用JMP A+DPTR指令即轉(zhuǎn)移到PRx入口地址。4343 利用轉(zhuǎn)移地址表實現(xiàn)程序的轉(zhuǎn)移 PR0 EQU 0110H PR1 EQU 0220H PR2 EQU 0330H

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論