工學第四章-匯編語言程序設計課件_第1頁
工學第四章-匯編語言程序設計課件_第2頁
工學第四章-匯編語言程序設計課件_第3頁
工學第四章-匯編語言程序設計課件_第4頁
工學第四章-匯編語言程序設計課件_第5頁
已閱讀5頁,還剩63頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

匯編語言程序設計本章內容SingleChipMicrocomputer§4-0概述§4-2運算程序設計§4-3數據的拆拼和轉換§4-1循環程序設計§4-5查表程序§4-6散轉程序設計§4-7I/O端口控制程序§4-8子程序調用時的參數傳遞第

匯編語言程序設計本章內容SingleCh概述最早人們只能用機器語言(二進制)編寫程序;為了方便記憶,人們開始用助記符形式的匯編語言編寫程序,稱為低級語言。然后再用匯編系統將其翻譯成機器語言,該過程稱為匯編;為了用更接近人的語言編寫程序,程序設計師們發明了高級語言,如:BASIC、FORTRAN、PASCAL、然后再用編譯系統將其翻譯成機器語言,該過程稱為編譯;機器只能識別機器語言。所以必須用編譯系統將高級語言編寫的源程序編譯成機器語言,用匯編系統將用匯編語言編寫的源程序匯編成機器語言;由低級或高級語言構成的程序稱為源程序,由機器語言構成的程序稱作目標程序;一、設計語言概述最早人們只能用機器語言(二進制)編寫程序;一、設計語

源程序目標程序

低級語言機器語言匯編高級語言機器語言編譯源二、程序設計方法一、程序設計

利用計算機能夠接受的語言把解決問題的方法和步驟描述出來,也就是編制計算機的程序,人們常說的軟件設計。對于單片機應用程序,我們可以把它看成是操作系統和應用軟件的集合。二、程序設計步驟

用匯編語言編寫一個程序的過程大致可分為以下幾個步驟:1、分析問題,明確所要解決問題的具體要求。二、程序設計方法一、程序設計利用計算機能夠接

2、確定算法。根據實際問題的要求和指令系統的特點,決定所要采用的計算公式和計算方法,這就是常說的算法。算法是進行程序設計的依據,它決定了程序的正確性和程序的質量。

3、制定程序框圖。根據算法,制定出運算步驟的順序,再把運算過程畫成流程圖。

4、確定數據格式,分配工作單元,將程序框圖進一步細化。

5、根據流程圖和指令系統,編寫出匯編語言源程序。

6、程序測試。由于單片機沒有自開發功能,因而必須借助仿真器,以單步、斷點、連續方式調試程序,直到完全正確為止。特別地,對于有硬件的應用系統,必須將軟件和硬件結合起來調試,直到軟件、硬件能協調一致,渾然一體為止。2、確定算法。根據實際問題的要求和指令系統的

7、程序優化。這一環節很容易被廣大設計人員所忽略。它是指從程序結構上對程序加以調整,精減一些冗余指令,以加快程序的執行速度,節省程序存儲空間,從而提高系統的可靠性。7、程序優化。這一環節很容易被廣大設計人員所§4-1循環程序設計一、循環程序結構開始N結束Y循環結束控制修改控制變量循環工作部分置初值

在單片機應用程序設計中,循環程序的使用非常廣泛。單循環的結構如下圖所示:

其主體為循環體,由循環工作部分和修改控制變量構成。同其他語言一樣,循環程序可以實現嵌套,構成多重循環。但切不可形成交叉。只能將整個循環程序作為外循環的循環體。§4-1循環程序設計一、循環程序結構開始N結束Y循環結二、循環程序設計舉例例1、延時程序設計DELAY: MOV R7,#200 ;1個機器周期DE1: MOV R6,#123 ;1 NOP ;1DE2: DJNZ R6,DE2 ;2 DJNZ R7,DE1 ;2 RET ;2如晶體振蕩器頻率為12MHz,則其延時時間為:1+(1+1+2*123+2)*200+2=50.003ms(機器周期1μs)這是一個50ms的精確延時程序。DELAY.ASM二、循環程序設計舉例例1、延時程序設計DELAY: MOV

在RAM中,從50H開始連續存放N個單字節無符號數,N存放在R2中,試編程求這N個數的和,結果放在R4R3中。程序清單如下:NSUM: MOV R0,#50HMOV R3,#00H;清零MOV R4,#00HLOOP: MOV A,R3 ADD A,@R0 MOV R3,A CLR A ADDCA,R4 MOV R4,A INC R0 DJNZ R2,LOOP RET例2、數據求和在RAM中,從50H開始連續存放N個單字節無§4-2運算程序設計一、多字節加法

例4-3-1設有兩個4字節的二進制數2F5BA7C3H和14DF35B8H,分別放在以40H和50H為起始地址的單元中(低位在低地址),試編程求這個數之和,結果放在以40H為起始地址的單元中。 ORG 0000H LJMP JAFA ORG 0100HJAFA:MOVR0,#40H MOV R1,#50H MOV R2,#04H LCALLJASUBLJMP $

以上為主程序JASUB:CLR CJASUB1:MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZR2,JASUB1 RET ENDADDC A,RnADDC A,directADDC A,@RiADDC A,#data§4-2運算程序設計一、多字節加法例4-

本程序適合于N個字節的兩數求和,但并不嚴密,當最后一次加法有進位時并沒有相應處理,實際應用時應根據實際情況稍作修改。本程序適合于N個字節的兩數求和,但并不嚴密,例2:有兩組BCD碼分別存放在23H、22H單元和33H、32H單元,求它們的和并送入43H、42H單元中去。(高位在前,低位在后)分析:·········32H33H42HA22H23H43H···00111000011001010001000110000111BCD碼83HBCD碼11H多字節BCD碼加法例2:有兩組BCD碼分別存放在23H、22H單元和33H、3例2:有兩組BCD碼(如:1183H和5678H),分別存放在23H、22H單元和33H、32H單元,求它們的和,并送入43H、42H單元中去。(高位在前,低位在后)解:流程圖(框圖)如何?請同學們自己繪制流程圖。

開始(22H)A(32H)+AA十進制調整(33H)+AAA(43H)結束A(42H)(23H)A

十進制調整例2:有兩組BCD碼(如:1183H和5678H),分別存ORG0000HMOVA,22HADDA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,ASJMP$END

此條加法指令可否改用帶進位的(ADDC)?開始(22H)A(32H)+AA十進制調整(33H)+AAA(43H)結束A(42H)(23H)A

十進制調整開始(22H)A(32H)+AA十進制調整(33H)+ORG2000HCLRCMOVA,22HADDCA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,AEND·········32H33H42HA22H23H43H···100000110101011000010001011110001000001101111000+111110110110000100010001010101100110011101101000PCPCPCPCPCPCPCPCPC1111101101100001PC01101000PC01100111·········32H33H42HA22H23H43H··多字節BCD碼加法(P53)

與多字節加法程序類似,但需在加法指令后加一條十進制加法調整指令。主程序與前面相同。DADD:CLR CJAD1: MOV A,@R0 ADDC A,@R1 DA A MOV @R0,A INC R0 INC R1 DJNZ R2,JAD1 RET ORG 0000H LJMP JABCD ORG 0100HJABCD:MOV R0,#40H MOV R1,#50H MOV R2,#04H LCALLDADD LJMP $以上為主程序BCDADD.ASM多字節BCD碼加法(P53)與多字節加法程序二、多字節減法 多字節減法程序和多字節加法程序類似,只需將加法指令換為減法指令即可。例:在43H~40H依次存放被減數443ADD7BH;在53H~50H中依次存放減數14DF35B8H,試編程求二者之差二、多字節減法 多字節減法程序和多字節加法程序類似,只需將

ORG 0000H LJMP JIAN ORG 0100HJIAN:MOV R0,#40H MOV R1,#50H MOV R2,#04H LCALLJIANSUB LJMP $

以上為主程序JIANSUB:CLR CJIAN1:MOV A,@R0 SUBB A,@R1 MOV @R0,A INC R0 INC R1 DJNZR2,JIAN1 RET END此程序也可以推廣到N個字節的情況。 ORG 0000HJIANSUB:CLR C四、多字節數乘法

MCS-51系列單片機指令系統僅能提供8位乘法指令若需進行8位以上的乘法運算,則需通過編程實現。設(R4)(R3)中為十六位被乘數,R2中為8位乘數,其積存放在R7R6R5中。由于(R4)(R3)*(R2)=[(R4)*256+(R3)]*(R2) =(R4)*(R2)*256+(R3)*R2R4R3BAR6R5R7BA+R2×(R4)*(R2)*256(R3)*(R2)四、多字節數乘法MCS-51系列單片機指令系CHENFA: MOV A,R2

MOV B,R3 MUL AB ;(R3)*(R2) MOV R5,A MOV R6,B MOV A,R2 MOV B,R4 MUL AB ;(R2)*(R4) ADD A,R6 MOV R6,A MOV A,B ADDC A,#00H;加進位位 MOV R7,A RETCHENFA: MOV A,R2五、多字節除法

51指令系統提供一條8位的除法指令,但要想用于多位除法運算則較為困難。因此,在進行多字節除法運算時,多采用手工算法相同的思路。五、多字節除法51指令系統提供一條8位的除法§4-3數據的拆拼和轉換

在實際應用中,經常會遇到實際需要的數據格式同得到的數據格式不完全相符的情況,如采集到的數據、運算的結果、輸出的數據等,這就需要對其進行適當的轉換,以符合實際情況的要求。這就是通常所說的數據拆拼和轉換。一、數據的拆拼BBCD:MOV A,7CH ANL A,#0FH MOV R5,A MOV A,7CH

ANL A,#0F0H SWAP A MOV R6,A RET例:轉換前7CH中為壓縮BCD碼XY程序清單:0Y0X

轉換后R6R5中為非壓縮BCD碼§4-3數據的拆拼和轉換在實際應用中,經常例4-4-2拆拼前(20H)=X7X6X5X4X3X2X1X0 拆拼后(21H)=X0X1X2X3X4X5X6X7DESORT:MOVA,20H MOV R6,A MOV R7,#08HRESO:CLR C MOV A,R6 RLC A MOV R6,A MOV A,21H RRC A MOV 21H,ADJNZ R7,RESO RET A5A00A2A1A4A3A60000000A7A7A400A1A0A3A2A5A7000000A6A6例4-4-2拆拼前(20H)=X7X6X5X4X補充內容例1:將20H單元的兩個壓縮BCD碼拆開變成ASCII碼,存入21H、22H單元。(假設20H中的BCD碼為00110100)什么是BCD碼?什么是ASCII碼?BCD碼與ASCII碼關系·········20H21H22HAB0011壓縮BCD碼001100110100低四位ASII碼高四位ASII碼壓縮BCD碼拆開變成ASCII碼補充內容例1:將20H單元的兩個壓縮BCD碼拆開變成ASCI二進制與ASCII碼的相互關系為:數字0~9對應的ASCII碼為30H~39H,即加30H字母A~F對應的ASCII碼為41H~46H,即加37H二進制與ASCII碼的相互關系為:方法1:將BCD碼除以10H,恰好是將BCD碼分別移到了A、B的低4位。然后再各自與30H相或,即成為ASCII碼。方法2:利用半字節交換指令來實現。方法1:將BCD碼除以10H,恰好是將BCD碼分別移到了A、ORG0000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV22H,BORLA,#30HMOV21H,ASJMP$

開始(20H)A10HBA/B(A中為高4位BCD碼,B中為低4位BCD碼)B+30HBB(22H)A+30HAA(21H)結束簡單程序例1---方法1源程序如下:·········20H21H22HAB00110100PCPCPC0011010000010000PC0011000000000100PC00110100PCPCPC0011PCORG0000H開始(20H)A10HBAORG0000HMOVR0,#20HMOVA,#30HXCHDA,@R0MOV22H,AMOVA,@R0SWAPAORLA,#30HMOV21H,ASJMP$簡單程序例1---方法2

開始#20HR0#30HAA的低4位(20H)的低4位A(22H)(20H)AA的低4位A的高4位A(21H)結束A+30HAPCPCPCPCPCPCPCPCPC源程序如下:·········20H21H22HAR000110010000000110100000001000011010000110000001100000011PC0011

二、數據的轉換

在計算機內部,任何數據都是以二進制的形式存儲,但是,當我們在作I/O操作時,往往需要其它形式的數據格式,如ASCII碼、BCD碼、八進制數等,這就需要做一些數據格式的互換操作。1、ASCII碼到二進制數的相互轉換二進制與ASCII碼的相互關系為:數字0~9對應的ASCII碼為30H~39H,即加30H字母A~F對應的ASCII碼為41H~46H,即加37H(1)ASCII到二進制的轉換通過以上介紹的二者之間的關系,不難畫出流程圖:二、數據的轉換在計算機內部,任何數據都是以二開始取操作數清進位標志減30H差>9?轉換正確結束減07HY轉換正確NASCTOHEX: MOV A,R2 CLR C SUBB A,#30H MOV R2,ACJNEA,#0AH,NEXTNEXT:JC TOK SUBB A,#07H MOV R2,ATOK:

RET例4-4-3轉換前R2為ASCII碼,轉換后R2為二進制開始取操作數清進位標志減30H差>9?轉換正確結束減07HY(2)二進制到ASCII碼當二進制數<0AH時,加30H即得相應的ASCII,當二進制數介于0AH、0FH之間(包括0AH、0FH),則加37H即得到相應的ASCII。(2)二進制到ASCII碼當二進制數<0AH時,加30H即得2、BCD碼與二進制的相互轉換(1)BCD到二進制的轉換3615=3*103+6*102+1*10+5=[(3*10+6)*10+1]*10+5由壓縮BCD碼到非壓縮BCD碼的轉換較為簡單,在前面我們已經涉及,在此不再重復。例:如下圖所示15H36H41H40H壓縮BCD碼3H6H1H5H43H42H41H40H非壓縮BCD碼1FH0EHR3R2二進制數2、BCD碼與二進制的相互轉換(1)BCD到二進制的轉換36高位BCD碼的地址->(R0)計數初值3->(R7)初值送結果單元0->(R3)((R0))->(R2)(R3R2)*10->(R3R2)(R0)-1->(R0)(R3R2)+((R0))+(Cy)->(R3R2)(R7)-1=0?結束YN3615=3*103+6*102+1*10+5=[(3*10+6)*10+1]*10+5R3R23H6H1H5H43H42H41H40HR0高位BCD碼的地址->(R0)計數初值3->(R7)初值送

MOV R0,#43H ;指向高位 MOV R3,#00H ;結果單元清零 MOV A,@R0 MOV R2,A ;轉換初值送R2ML10: MOV A,R2 MOV B,#0AH MUL AB ;R2乘10 MOV R2,A ;暫存R2*10低位 MOV A,B XCH A,R3 ;暫存R2*10高位 MOV B,#0AH MUL AB ;R3*10 ADD A,R3 ;R3*10低位加 MOV R3,A ;為什么不處理BBCDHEX: MOV R7,#03H ;計數初值 MOV R0,#43H ;指向高位BCDHEX: MOV

MOV A,@R0 ADD A,R2 ;結果與低單元相加 MOV R2,A MOV A,R3 ADDC A,#00H ;加低位進位位 MOV R3,A ;保存結果 DJNZ R7,ML10 RET

由于二位壓縮BCD碼的表示范圍為0~9999,其對應二進制為0~270H,不會超過兩個字節,因而不必考慮R3*10的高位。JAFA: DEC R0 ;指向下一位 MOV A,@R0由于二位壓縮BCD碼的例:如下圖所示(2)二進制到BCD的轉換15H36HR3R2二進制數3H8H4H5H43H42H41H40H非壓縮BCD碼1H44H

如上圖所示,雙字節二進制數的表示范圍為0~65535,因而需要5個BCD碼位來表示。從二進制到BCD碼,我們采用連減的辦法,其原理如下:待轉換的二進制數-104夠減,萬位加1,再減不夠減,恢復余數,再減103以此類推,直到得到個位為止。例:如下圖所示(2)二進制到BCD的轉換15H36HR3104=2710H 103=03E8H 102=0064H 10=0AHBBCD:MOV R0,#44H ;數據指針 MOV R7,#04H ;計數初值 MOV DPTR,#PWTAB MOV R6,#00H ;偏移量BBC1: MOV A,R6 MOVCA,@A+DPTR MOV R4,A ;查冪值表低位 INC R6 MOV A,R6 MOVCA,@A+DPTR MOV R5,A ;查冪值高位 INC R6 MOV @R0,#00H104=2710H 103=03E8H 102=0064H

MOV A,R2 SUBB A,R4 ;減低位 MOV R2,A MOV A,R3 SUBB A,R5 ;減高位 MOV R3,A JC BBC3 ;不夠減則恢復余數 INC @R0 ;夠減則結果單元加1 SJMP BBC2BBC3: MOV A,R2 ADD A,R4 ;恢復余數低位 MOV R2,A MOV A,R3 ADDC A,R5 ;恢復余數高位 MOV R3,ABBC2: CLR C MOV A,R2BBC2: CLR C

DJNZ R7,BBC1 ;未減完則繼續 MOV A,R2 MOV @R0,A ;保存個位 RETPWTAB:DB 10H,27H ;10000 DB 0E8H,03H ;1000 DB 64H,00H ;100 DB 0AH,00H ;10

DEC R0 ;指向下一單元 DJNZ R7,BBC1 ;未減完則繼續 DEC R0 ;§4-5查表程序

查表程序中一種常用的非數值運算程序,應用非常廣泛。使用查表程序可以完成數據的補償、計算、轉換等各種功能,具有程序簡單、執行速度快、精度高等優點,而這正是單片機在測控場合或智能化儀表中所需要的。§4-5查表程序 查表程序中一種常用的非數值運算程序,應一、以DPTR為基地址的查表程序MOVC A,@A+DPTR1、其操作步驟如下:初始化DPTR:將表格的首地址放入DPTR中,作為基地址。

初始化ACC:A中應該放所要查詢的數據在表格中的順序號。執行結果:在執行該指令后,A中存放的是在表格中查到的數據。一、以DPTR為基地址的查表程序MOVC 注意事項在查詢表格時,若所要查詢的數據是雙字節的,則在初始化A中的數應為順序號的2倍,且應執行兩次本指令。對于單字節表格而言,表項的個數應不大于256個,若大于256時,則應適當修改DPTR的值。表格的存放位置。注意事項在查詢表格時,若所要查詢的數據是雙字節的,則在初始化二、以PC為基地址的查表指令MOVC A,@A+PC表格存放地址=PC+偏移量+X(表項)二、以PC為基地址的查表指令MOVC A,@A+PC1、操作步驟(1)將待查表的項數送給ACC。(2)疊加偏移量,表頭和當前PC的地址偏移量加到表項上。(3)執行結果。1、操作步驟(1)將待查表的項數送給ACC。2、注意事項(1)對于雙字節表格,其處理方法與以DPTR為基地址的情況相同。(2)對于單字節表格而言,其項數應不大于256。(3)對于雙字節表格而言,其項數應不大于128。2、注意事項(1)對于雙字節表格,其處理方法與以DPTR為三、兩種方式的比較1、PC僅能對所謂本地表格操作,即表格項數不得大于256,且偏移量可能隨程序的變化而變化,計算較為麻煩,其優點是少用寄存器。2、DPTR使用起來非常靈活,表項數不受限制,且表格可以放在64K的任意地方。三、兩種方式的比較1、PC僅能對所謂本地表格操作,即表格項數例:

在一個溫度測量裝置中,測出的電壓與溫度為非線性關系。設測得的電壓為X,用10位二進制數表示。現要求采用查表法實現線性化處理。VTT1V1非線形V1=KT1例: 在一個溫度測量裝置中,測出的電壓與溫度為非線性關系。設分析10位二進制位的表示范圍為0~1023,因而有1024個電壓值,從而可以建立一個表格,其項數為1024個。存放溫度值Y的單元地址=表首地址+(X*2)設測得的電壓值已存放在20H,21H中,(20H為高字節),查表后的溫度值存放在22H,23H中,(22H為高字節)。分析10位二進制位的表示范圍為0~1023,因而有10例:程序清單LTB2: MOV DPTR,#TAB2

MOV A,21H;(20H21H)*2 CLR C RLC A;低八位*2 MOV 21H,A;

MOV A,20H;表首+(20H21H)*2 RLC A;高八位*2+CY MOV 20H,A MOV A,21H ADD A,DPL MOV DPL,A MOV A,20H ADDC A,DPH;為什么帶進位加 MOV DPH,A;完成地址計算測得的電壓值存放(20H21H)中(20H為高字節),查表后的溫度值存放在(22H23H)中(22H為高字節)例:程序清單LTB2: MOV DPTR,#TAB2測得的例:程序清單(續) CLR A ;查表

為什么清A?? MOVC A,@A+DPTR MOV 22H,A INC DPTR CLR A MOVC A,@A+DPTR MOV 23H,A RETTAB2: DW ………….. ;溫度表值 DW …………..例:程序清單(續) CLR A ;查§4-6散轉程序設計 在程序設計中,不外有三種情況:順序、循環和條件分支程序。其中順序程序設計最為簡單,而循環程序設計在前面已經學習過。分支程序(如下圖所示)又可分為兩大類:字節條件和位條件,即CJNE和JC、JB、JZ類指令。位條件轉移指令很容易實現簡單條件轉移,當要實現多分支轉移時,可以通過CJNE來實現,這就是所謂散轉程序設計,但實現起來則較為麻煩。(A)=0?YYY(A)=1?N(A)=2?NN§4-6散轉程序設計 在程序設計中,不外有三種情況:順序例: 測試P1口輸入的100個數中0~9各數的概率分布程序(A)=0?YYY(A)=1?N(A)=2?NN操作0操作1操作2終點例: 測試P1口輸入的100個數中0~9各數的概率分布程序( MOV40H,#100MOVP1,#0FFH;準備輸入READ:MOVA,P1CHK0:CJNEA,#0,CHK1 INC30H DJNZ40H,READ SJMPEENDCHK1:CJNEA,#1,CHK2 INC31H DJNZ40H,READ SJMPEENDCHK2:CJNEA,#2,CHK3 INC32H DJNZ40H,READ SJMPEENDCHK3:CJNEA,#3,CHK4 INC33H DJNZ40H,READ SJMPEENDCHK4:CJNEA,#4,CHK5 INC34H DJNZ40H,READ SJMPEENDCHK5:CJNEA,#5,CHK6 INC35H DJNZ40H,READ SJMPEEND程序清單 MOV40H,#100CHK3:CJNECHK6:CJNEA,#6,CHK7 INC36H DJNZ40H,READ SJMPEENDCHK7:CJNEA,#7,CHK8 INC37H DJNZ40H,READ SJMPEENDCHK8:CJNEA,#8,CHK9 INC38H DJNZ40H,READ SJMPEENDCHK9:INC39H DJNZ40H,READEEND:SJMP$

利用條件轉移類指令來實現分支,程序較為簡單,容易實現,但應特別注意的是:在分析問題時,一定要邏輯嚴密,充分判斷出各種可能出現的條件標志。CHK6:CJNEA,#6,CHK7CHK9:I二、利用轉移指令來實現的程序散轉JMP @A+DPTR其執行過程可以分為三步:(1)將轉移表首地址送入DPTR作為基地址。(2)將條件標志單元內容裝入A中作為變址,在裝入前,還應根據轉移表項內容作相應變化。(3)實現轉移。我們可以根據轉移表的不同來分為三種散轉程序:二、利用轉移指令來實現的程序散轉JMP @A+DPTR1、采用轉移指令表的散轉程序設計 這類散轉程序的核心部分——轉移表部分由無條件轉移指令AJMP或LJMP構成。 其轉移范圍分別為64K或2KBytes。1、采用轉移指令表的散轉程序設計 這類散轉程序的核心部分——例:要求根據R7的內容轉向各個操作程序。

即(R7)=0,轉向OPR0 即(R7)=1,轉向OPR1 即(R7)=2,轉向OPR2 …………… 即(R7)=n,轉向OPRn 例:要求根據R7的內容轉向各個操作程序。

即(R程序清單JUMP1: MOV DPTR,#JPTAB1 MOV A,R7 ADD A,R7 ;(R7)*2(A) JNC NOAD ;判斷是否有進位 INC DPH ;有加到高字節地址NOAD: JMP @A+DPTRJPTAB1: AJMP OPR0 AJMP OPR1 …………….. AJMP OPRn程序清單JUMP1: MOV DPTR,#JPTAB1

注意事項(1)在本例中,由于AJMP指令的指令長度為2個字節,因而在散轉時采用自加的方法使變址實現乘2;若改用LJMP指令,由于其指令長度為3字節,因而應使變址乘3來修下正。當修正產生進位時,要將進位加到DPH中。 (2)由于R7是單字節,因而散轉點不能大于256個。為了克服此局限性,我們考慮:通過修改DPTR的辦法來增加散轉點,使這最大散轉點N可達到N<=(最大存儲容量—散轉表首地址)/3。注意事項(1)在本例中,由于AJMP指令的指令長度為2個例:要求根據R6R7中的數據轉向對應的操作程序JUMP2: MOV DPTR,#JPTAB2 MOV A,R6 MOV B,#03H ;(R6)*3(BA) MUL AB ADD A,DPH MOV DPH,A例:要求根據R6R7中的數據轉向對應的操作程序JUMP2:例續 MOV A,R7 MOV B,#03H MUL AB XCH A,B ADD A,DPH MOV DPH,A; XCH A,B;恢復低位 JMP @A+DPTRJPTAB2: LJMP OPR0 LJMP OPR1 …………….. LJMP OPRn例續 MOV A,R72、采用轉向地址偏移量表散轉程序 本方法的關鍵在于建立一個轉向地址偏移量表,需要程序員認真計算,否則會產生錯誤。2、采用轉向地址偏移量表散轉程序 本方法的關鍵在于建立一個轉例:要求按R7的內容轉向5個操作程序。JUMP3: MOV A,R7 MOV DPTR,#TAB3 MOVCA,@A+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論