匯編程序設(shè)計(jì)_第1頁
匯編程序設(shè)計(jì)_第2頁
匯編程序設(shè)計(jì)_第3頁
匯編程序設(shè)計(jì)_第4頁
匯編程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第四章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì) 所謂程序設(shè)計(jì),就是按照給定的任務(wù)要求,編寫出完整的計(jì)算機(jī)程序。要完成同樣的任務(wù),使用的方法或程序并不是唯一的。因此,程序設(shè)計(jì)的質(zhì)量將直接影響到計(jì)算機(jī)系統(tǒng)的工作效率、運(yùn)行可靠性。 前面我們學(xué)過了匯編語言形式的指令系統(tǒng),本章重點(diǎn)介紹匯編語言程序結(jié)構(gòu)以及如何利用匯編語言指令進(jìn)行程序設(shè)計(jì)的方法。 4.1 匯編語言程序設(shè)計(jì)概述4.1.1 匯編語言程序設(shè)計(jì)步驟 使用匯編語言設(shè)計(jì)一個(gè)程序大致上可分為以下幾個(gè)步驟。 (1) 分析題意,明確要求。 (2) 確定算法。 (3) 畫程序流程圖,用圖解來描述和說明解題步驟。圖4.1 常用的流程圖符號(hào) (4) 分配內(nèi)存工作單元,

2、確定程序與數(shù)據(jù)區(qū)的存放地址。 (5) 編寫源程序 (6) 程序優(yōu)化。 (7)上機(jī)調(diào)試、修改和最后確定源程序。 4.2.2 偽指令語句 偽指令并不是真正的指令,也不產(chǎn)生相應(yīng)的機(jī)器碼,它們只是在計(jì)算機(jī)將匯編語言轉(zhuǎn)換為機(jī)器碼時(shí),指導(dǎo)匯編過程,告訴匯編程序如何匯編。下面介紹一些MCS-51匯編程序常用的偽指令。 (1)匯編起始偽指令ORG 格式:標(biāo)號(hào): ORG 16位地址 功能:規(guī)定程序塊或數(shù)據(jù)塊存放的起始地址。如: ORG 8000H START: MOV A ,#30H 該指令規(guī)定第一條指令從地址8000H單元開始存放,即標(biāo)號(hào)START的值為8000H。 (2)匯編結(jié)束偽指令END 格式:標(biāo)號(hào):

3、END 表達(dá)式 功能:結(jié)束匯編。 例如: ORG 2000H START: MOV A ,# 00H END (END START) 表示標(biāo)號(hào)START開始的程序段結(jié)束。 (3)等值指令EQU 格式:字符名稱 EQU 項(xiàng) 例如,TEST EQU R0 MOV A,TEST (4)定義字節(jié)指令DB 格式:標(biāo)號(hào): DB 8位二進(jìn)制數(shù)表 DB命令是從指定的地址單元開始,定義若干個(gè)8位內(nèi)存單元的內(nèi)容。例如, ORG 1000H TAB; DB 23H,73, “6”, “B” TABl: DB 110B 以上偽指令經(jīng)匯編以后,將對(duì)從1000H開始的若干內(nèi)存單元賦值: (1000H)=23H (1001

4、H)=49H (1002H)=36H (1003H)=42H (1004H)=06H 其中36H和42H分別是字符6和B的ASCII碼,其余的十進(jìn)制數(shù)(73)和二進(jìn)制數(shù)(110B)也都換算為十六進(jìn)制數(shù)了。 (5)定義字命令 DW 格式:標(biāo)號(hào): DW 16位二進(jìn)制數(shù)表 例如, ORG 1000H TAB: DW 1234H , 0ABH , 10 匯編后: (1000H)=12H (1001H ) = 34H (1002H ) = 00H ( 1003H ) = ABH (1004H ) =00H (1005H) =0AH DB、DW偽指令都只對(duì)程序存儲(chǔ)器起作用,不能用來對(duì)數(shù)據(jù)存儲(chǔ)器的內(nèi)容進(jìn)行賦

5、值或進(jìn)行其它初始化的工作。 4.2 順序程序設(shè)計(jì) 順序結(jié)構(gòu)程序是一種最簡單、最基本的程序(也稱為簡單程序),它是一種無分支的直線形程序,按照程序編寫的順序依次執(zhí)行。 【例4-1】 兩個(gè)8位無符號(hào)數(shù)相加,和仍為8位。 假設(shè)兩個(gè)無符號(hào)數(shù)X1, X2分別存放于內(nèi)部RAM60H、61H單元中,求其和并將和送入62H單元。 程序如下:ORG0000H CLRC MOVR0 ,# 60H;設(shè)R0為數(shù)據(jù)指針MOVA ,R0;取X11NCR0 ADDCA ,R0;X1+X21NCR0 MOVR0,A;保存結(jié)果END 【例4-2】兩個(gè)無符號(hào)雙字節(jié)數(shù)相加。設(shè)被加數(shù)存放在內(nèi)部存儲(chǔ)器30H(高位字節(jié))、31H(低位字

6、節(jié))單元,加數(shù)存放在內(nèi)部存儲(chǔ)器40H(高位字節(jié))、41H(低位字節(jié))單元,和存入30H(高位字節(jié))、31H(低位字節(jié))單元。 程序如下: ORG0000H CLRC;將C清零 MOVR0 ,#31H;送被加數(shù)首址 MOVR1 ,#41H;送加數(shù)首址 MOVA ,R0;取被加數(shù)低字節(jié) ADDA ,R1;兩個(gè)低字節(jié)相加 MOVR0 ,A;低字節(jié)和存人被加數(shù)低字節(jié) DECR0;修改指針,指向被加數(shù)高字節(jié)DECR1 ;修改指針,指向加數(shù)高字節(jié)MOVA,R0;取被加數(shù)高字節(jié) ADDCA,R1;高字節(jié)相加 MOVR0 , A;存結(jié)果 END 【例4-3】編寫16位二進(jìn)制數(shù)求補(bǔ)程序 二進(jìn)制數(shù)的求補(bǔ)可歸結(jié)為“

7、求反加1”的過程,求反可用CPL指令實(shí)現(xiàn);加1時(shí)應(yīng)注意,加1只能加在低8位的最低位上。因?yàn)楝F(xiàn)在是16位數(shù),有兩個(gè)字節(jié),因此要考慮進(jìn)位問題,即低8位取反加1,高8位取反后應(yīng)加上低8位加1時(shí)可能產(chǎn)生的進(jìn)位,還要注意這里的加1不能用INC指令,因?yàn)镮NC指令不影響CY標(biāo)志。 程序如下: ORG0200H MOVA ,R0;低8位送ACPLA;取反ADDA ,#01H;加lMOVR2 ,A;存結(jié)果MOVA ,R1;高8位送A CPLA;取反ADDCA ,#00H;加進(jìn)位MOVR3 ,A;存結(jié)果(R1R0-R3R2)END 【例4-4】編程將20H單元中的8位無符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換成3位BCD碼,并存放在2

8、2H(百位)和21H(10位,個(gè)位)兩個(gè)單元中。 程序如下: ORG1000H MOVA ,20H;取數(shù)送AMOVB ,# 64H;除數(shù)100送B中DIVAB;商(百位數(shù)BCD碼)在A中,余數(shù)在B中MOV22H ,A;百位數(shù)送22HMOVA , B ;余數(shù)送A做被除數(shù)MOVB , #0AH ;除數(shù)10送B中DIVAB;十位數(shù)BCD碼在A中,個(gè)位數(shù)在B中 SWAPA;十位數(shù)BCD碼移至高4位 ORLA , B;并入個(gè)位數(shù)的BCD碼MOV21H , A;十位、個(gè)位BCD碼存人21H END 查表例4-5一變量放在內(nèi)部RAM 的20H,取值為00H-05H。編寫程序,求該變量的平方值,將結(jié)果放片內(nèi)2

9、1H ORG 1000HSTART:MOV DPTR, #2000H; or MOV DPTR, #TABLE MOV A, 20H MOVC A, A+DPTR MOV 21H, A SJMP $ ORG 2000HTABLE: DB 00, 01, 04, 09, 16, 25 END 圖4.2 分支程序結(jié)構(gòu) 圖4.2(a) 結(jié)構(gòu)使用條件轉(zhuǎn)移指令來實(shí)現(xiàn)分支,當(dāng)給出的條件成立時(shí),執(zhí)行程序段,否則執(zhí)行程序段。 圖4.2 (b) 結(jié)構(gòu)使用散轉(zhuǎn)指令JMP來實(shí)現(xiàn)多分支轉(zhuǎn)移,它首先將分支程序按序號(hào)的值來實(shí)現(xiàn)分支轉(zhuǎn)移。 4.3 分支程序設(shè)計(jì) 【例4-6】設(shè)補(bǔ)碼X放在內(nèi)部RAM30H單元中,函數(shù)Y與X有如

10、下的關(guān)系式: 試編寫程序,根據(jù)X的值求出Y,并放回原單元。 解 取出X后先做取值范圍的判斷,用累加器A狀態(tài)轉(zhuǎn)移指令判斷X是否為0,用位狀態(tài)轉(zhuǎn)移指令判斷X是大于0還是小于0。程序流程圖如圖4.3所示。 程序如下: MOV A,30HJZ ZER0JNB ACC.7,PLUSADD A,#5MOV 30H,APLUS: SJMP $ZERO: MOV 30H,#20HSJMP $END 開始結(jié)束A=0?A0?(30H) A(30H)+5 (30H)20H (30H)圖4.3 例4-5程序框圖 【例4-7】內(nèi)部RAM40H和41H單元中各有一無符號(hào)數(shù),比較其大小,將大數(shù)存放于內(nèi)部RAM60H單元,小

11、數(shù)存放于內(nèi)部RAM61H單元,如兩數(shù)相等,則分別送往這2個(gè)單元。 解 用比較不等轉(zhuǎn)移指令CJNE比較力兩個(gè)無符號(hào)書,先確定它們是否相等,若不相等時(shí)再根據(jù)借位標(biāo)志確定這兩個(gè)無符號(hào)書的大小。程序框圖如圖4.4所示。程序如下: Y開始A (41H)A與(61H)交換結(jié)束(40H) (60H)A (60H)N圖4.4 例4-6程序框圖(40H) A MOVA, 40H MOV61H, 41H CJNEA , 4 1 H , LOOP AJMPAGEQ LOOP: JNCAGEQ;A(41H)則無借位 XCHA, 61H;A(41H)有借位;A與(61H)交換AGEQ:MOV60H, A SJMP EN

12、D 【例4-8】某溫度控制系統(tǒng),采集的溫度值(Ta)放在累加器A中。此外,在內(nèi)部RAM54H單元存放控制溫度下限(T54),在55H單元存放控制溫度上限(T55)。若Ta T55,程序轉(zhuǎn)向JW(降溫處理程序);若TaT55,轉(zhuǎn)降溫處理程序 CJNEA,54H,LOOP2;TaT54,轉(zhuǎn)向LOOP2 AJMPFH;Ta=54,返回LOOP2:JCSW;若(CY)=1,表明Ta (R1) MOV A, R1 : A (R1) MOV R3, ANEXT: INC R1 DJNZ R2 ,LOOP MOV A, R3 MOV MAX, A 【例4-12】假設(shè)從內(nèi)存RAM的50H單元,連續(xù)存放一串字符

13、,以回車符(其ASCII碼為0DH)作為結(jié)束標(biāo)志,要求測出該字符串的長度。測試方法可采用將該字符串的每一個(gè)字符與回車符依次相比,若不相等,則將統(tǒng)計(jì)字符串長度的計(jì)數(shù)器加l,繼續(xù)比較;若比較相等,則表示該字符串結(jié)束,這時(shí)計(jì)數(shù)器中的值就是字節(jié)符串的長度。 程序如下: ORG 8000HCOUNT: MOV R2,# 0FFH MOV R0,# 4FH LOOP: INC R0 ;50H begin INC R2 ;0 begin CJNE R0, #0DH, LOOP SJMP 【例4-13】編制用軟件方法延時(shí)S的程序軟件延時(shí)時(shí)間與執(zhí)行指令的時(shí)間有關(guān)。如果使用6MHz晶振,一個(gè)機(jī)器周期為2s(=12

14、 /6M)。計(jì)算出執(zhí)行每一條指令以及一個(gè)循環(huán)所需要的時(shí)間,根據(jù)要求的延時(shí)時(shí)間確定循環(huán)次數(shù),如果單循環(huán)時(shí)間不夠長,可以采用多重循環(huán)。 程序如下: MOV R5, #05H ;1 機(jī)器周期DELY0: MOV R6, #0C8H ;1DELY1: MOV R7, #0F8H ;1 NOP ;1DELY2: DJNZ R7, DELY2 ;2.x 248=496 DJNZ R6, DELY1 ; DJNZ R5, DELY0 這是一個(gè)三重循環(huán)程序。前條指令的機(jī)器周期數(shù)為,后條指令的機(jī)器周期數(shù)為。執(zhí)行內(nèi)循環(huán)所用的機(jī)器周期數(shù)為2482=496,執(zhí)行中間循環(huán)所用的機(jī)器周期數(shù)(496+4)200=10000

15、0;執(zhí)行外循環(huán)所用的機(jī)器周期數(shù)為(100000+3)5=500015,再加上(執(zhí)行第一條指令)就是執(zhí)行整段程序所用的機(jī)器周期數(shù)。因此這段程序的延時(shí)時(shí)間位(500015+1)2s=1.000032s。 【例4-14】編寫無符號(hào)數(shù)排序程序。 假設(shè)在片內(nèi)RAM中,起始地址為40H的10個(gè)單元中存放有10個(gè)無符號(hào)數(shù)。試進(jìn)行升序排序。 解 數(shù)據(jù)排序常用方法是冒泡排序法。這種方法的過程類似水中氣泡上浮,故稱冒泡法。執(zhí)行時(shí)從前向后進(jìn)行相鄰數(shù)的比較,如數(shù)據(jù)的大小次序與要求的的順序不符就將這兩個(gè)數(shù)互換,否則不互換。對(duì)于升序排序通過這種相鄰數(shù)的互換,使小數(shù)向前移動(dòng),大數(shù)向后移動(dòng);從前向后進(jìn)行一次冒泡(相鄰數(shù)的互換

16、),就會(huì)把最大的數(shù)換到最后;再進(jìn)行一次冒泡就會(huì)把次大的數(shù)排在倒數(shù)第二的位置。依此類推,完成由小到大的排序。 編程中選用R7做比較次數(shù)計(jì)數(shù)器,初始值為09H,位地址00H作為冒泡過程中是否有數(shù)據(jù)互換的標(biāo)志位,若(00H) =0,表明無互換發(fā)生,已排序完畢。 (00H) =1,表明有互換發(fā)生。流程圖如圖4-11所示。 ORG0400H START:MOVR0,#40H;數(shù)據(jù)區(qū)首址送R0 MOVR7,#09H;各次冒泡比較次數(shù)送R7 CLR00H;互換標(biāo)志位清零LOOP:MOVA,R0;取前數(shù)送A中 MOV2BH,A;暫存到2BH單元中 INCR0;修改地址指針 MOV2AH,R0;取后數(shù)暫存到2A

17、H單元中 CLRC;清CY SUBBA,R0;前數(shù)減后數(shù) JCNEXT;前數(shù)小于后數(shù),則轉(zhuǎn)(不互換) MOVR0,2BH;前數(shù)大于后數(shù),兩數(shù)交換 DECR0 MOVR0,2AH INCR0;地址加1,準(zhǔn)備下一次比較 SETB00H;置互換標(biāo)志NEXT:DJNZR7,LOOP;未比較完,進(jìn)行下一次比較 JB00H,START;有交換,表示未排完序,進(jìn)行下一輪冒泡 END ;無交換,表示已排好序,結(jié)束 開始數(shù)據(jù)區(qū)受地址 R0比較次數(shù) R7置交換標(biāo)志取前一個(gè)操作數(shù)取后一個(gè)操作數(shù)前數(shù) 后數(shù)?前數(shù)和后數(shù)交換置交換標(biāo)志?本輪比較完畢?本輪有交換?結(jié)束YYNYN圖4.10 程序流程圖4.5 子程序設(shè)計(jì) 在匯

18、編語言源程序中使用子程序時(shí),一般要注意兩個(gè)問題:1.現(xiàn)場保護(hù)2.參數(shù)傳遞 A. 在主程序中保護(hù)現(xiàn)場: PUSH ACC PUSH PSW PUSH B PUSH R0 LCALL 。 POP R0 POP B POP PSW POP ACC RET B、在子程序中保護(hù)SUB1: PUSH PSW PUSH ACC PUSH B MOV PSW, #10H POP B POP ACC POP PSW RET 參數(shù)傳遞1-利用累加器和寄存器 編寫程序?qū)崿F(xiàn)c=a2+b2, a, b, c 存內(nèi)部RAM 30H-32H.START: MOV A, 30H ACALL SQR MOV R1, A MOV

19、 A, 31H ACALL SQR ADD A, R1 MOV 32H, A SJMP $SQR: MOV DPTR, #TAB MOVC A, A+DPTR RETTAB: DB 0, 1, 4, 9, 81參數(shù)傳遞1-利用存儲(chǔ)器傳 遞參數(shù)傳遞1-利用堆棧利用存儲(chǔ)器傳 遞: 在要傳遞的數(shù)據(jù)比較多時(shí),可以將數(shù)據(jù)事先寫入到程序存儲(chǔ)器或在主程序中寫入到數(shù)據(jù)存儲(chǔ)器,進(jìn)一步在子程序中讀出利用堆棧傳 遞: ,可以將數(shù)據(jù)主程序中壓入到堆棧,進(jìn)一步在子程序中彈出。也可以在子程序中壓入,再在返回后彈出。 【例4-16】將內(nèi)部數(shù)據(jù)存儲(chǔ)器某一單元中的一個(gè)字節(jié)的十六進(jìn)制數(shù)轉(zhuǎn)換成兩位ASCII碼,結(jié)果存放在內(nèi)部數(shù)據(jù)存

20、儲(chǔ)器的兩個(gè)連續(xù)單元中。 假設(shè)一個(gè)字節(jié)的十六進(jìn)制數(shù)在內(nèi)部數(shù)據(jù)存儲(chǔ)器40H單元,結(jié)果存于41H、42H單元中,用堆棧進(jìn)行參數(shù)傳遞。 MAIN:MOVSP,#55H MOVR1,#41H;R1為存結(jié)果指針 MOVA,40H;取要轉(zhuǎn)換的數(shù)據(jù) SWAPA;先轉(zhuǎn)換高位字節(jié) PUSHACC;壓棧 ACALLHEASC;調(diào)用低半字節(jié)轉(zhuǎn)換成 ASCII碼程序 POPACC; 要轉(zhuǎn)換的數(shù)據(jù)出棧 MOV R1 , A ;存高半字節(jié)轉(zhuǎn)換結(jié)果 INCR1 PUSH40H ACALLHEASC POPACC MOV R1, A;存低半字節(jié)轉(zhuǎn)換結(jié)果 END HEASC: MOVR0, SP DECR0 DECR0 XCHA

21、, R0;取被轉(zhuǎn)換數(shù)據(jù) ANDA, # 0FH;保留低半字節(jié) ADDA, #2;修改A ,下條到數(shù)據(jù)表差2字節(jié) MOVCA, A+PC;查表 XCHA, R0;結(jié)果送回堆棧 RET TAB:DB 30H,31H,32H,;ACALL 時(shí)時(shí) , SP=SP+2, 分別放入口地址分別放入口地址PC 15-8, PC 7-0, 若若LCALL, SP=SP+3 【例4-17】求兩個(gè)無符號(hào)數(shù)據(jù)塊中的最大值。數(shù)據(jù)塊的首地址分別為60H和70H,每個(gè)數(shù)據(jù)塊的第一個(gè)字節(jié)都存放數(shù)據(jù)塊的長度,結(jié)果存人5FH單元。 解 本例可采用分別求出兩個(gè)數(shù)據(jù)塊的最大值,然后比較其大小的方法,求最大值的過程可采用子程序。 子程序名稱:Q

溫馨提示

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

評(píng)論

0/150

提交評(píng)論