MCS51單片機(jī)匯編語言程序設(shè)計(jì).ppt_第1頁
MCS51單片機(jī)匯編語言程序設(shè)計(jì).ppt_第2頁
MCS51單片機(jī)匯編語言程序設(shè)計(jì).ppt_第3頁
MCS51單片機(jī)匯編語言程序設(shè)計(jì).ppt_第4頁
MCS51單片機(jī)匯編語言程序設(shè)計(jì).ppt_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第四章 MCS-51單片機(jī)匯編語言程序設(shè)計(jì),4.1 匯編語言程序設(shè)計(jì)概述 4.2 基本程序設(shè)計(jì) 4.3 查表程序設(shè)計(jì) 4.4 子程序設(shè)計(jì) 4.5 數(shù)值轉(zhuǎn)換 4.6 運(yùn)算類程序設(shè)計(jì),4.1 匯編語言程序設(shè)計(jì)概述,4.1.1 機(jī)器語言、匯編語言和高級(jí)語言 用于程序設(shè)計(jì)的語言基本上分為3種:機(jī)器語言、匯編語言和高級(jí)語言。 1.機(jī)器語言 二進(jìn)制代碼表示的指令、數(shù)字和符號(hào)簡(jiǎn)稱為機(jī)器語言。 不易懂,難記憶,易出錯(cuò)。,2匯編語言 英文助記符表示的指令稱為符號(hào)語言或匯編語言 將匯編語言程序轉(zhuǎn)換成為二進(jìn)制代碼表示的機(jī)器語言程序稱為匯編程序 經(jīng)匯編程序“匯編(翻譯)”得到的機(jī)器語言程序稱為目標(biāo)程序,原來的匯編語言

2、程序稱為源程序。,匯編語言特點(diǎn): 面向機(jī)器的語言,程序設(shè)計(jì)員須對(duì)MCS-51的硬件有相當(dāng)深入的了解。 助記符指令和機(jī)器指令一一對(duì)應(yīng),用匯編語言編寫的程序效率高,占用存儲(chǔ)空間小,運(yùn)行速度快,用匯編語言能編寫出最優(yōu)化的程序。 能直接管理和控制硬件設(shè)備(功能部件),它能處理中斷,也能直接訪問存儲(chǔ)器及I/O接口電路。 匯編語言和機(jī)器語言都脫離不開具體機(jī)器的硬件,均是面向“機(jī)器”的語言,缺乏通用性。,3高級(jí)語言 不受具體機(jī)器的限制,使用了許多數(shù)學(xué)公式和數(shù)學(xué)計(jì)算上的習(xí)慣用語,非常擅長(zhǎng)于科學(xué)計(jì)算。常用的如BASIC、FORTRAN以及C語言等。 高級(jí)語言優(yōu)點(diǎn):通用性強(qiáng),直觀、易懂、易學(xué),可讀性好。 使用C語

3、言(C51)、PL/M語言來進(jìn)行MCS-51的應(yīng)用程序設(shè)計(jì)。 對(duì)于程序的空間和時(shí)間要求很高的場(chǎng)合,匯編語言仍是必不可缺的。,4.1.2 匯編語言程序設(shè)計(jì)步驟 (1)分析問題,確定算法 (2)根據(jù)算法,畫出程序框圖 (3)分配內(nèi)存工作區(qū)及有關(guān)端口地址 (4)編寫程序 養(yǎng)成在程序的適當(dāng)位置上加上注釋的好習(xí)慣。 (5)上機(jī)調(diào)試 編寫完畢的程序,必須“匯編”成機(jī)器代碼,才能調(diào)試和運(yùn)行,調(diào)試與硬件有關(guān)程序還要借助于仿真開發(fā)工具并與硬件連接。,4.1.3 匯編語言源程序的匯編 匯編語言源程序 “翻譯”成機(jī)器代碼(指令代碼)的過程稱為“匯編”。匯編可分為手工匯編和機(jī)器匯編兩類: 手工匯編 人工查表翻譯指令。

4、相對(duì)轉(zhuǎn)移指令的偏移量的計(jì)算不但麻煩,且容易出錯(cuò)。 機(jī)器匯編 用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)ASCII碼文件,擴(kuò)展名為“.ASM”。然后在微計(jì)算機(jī)上運(yùn)行匯編程序,把匯編語言源程序翻譯成機(jī)器代碼。生成一個(gè)二進(jìn)制文件,擴(kuò)展名為“.OBJ”。 交叉匯編匯編后的機(jī)器代碼是在另一臺(tái)計(jì)算機(jī)(這里是單片機(jī))上運(yùn)行。,4.2 基本程序設(shè)計(jì),4.2.1 順序程序設(shè)計(jì),例1 兩個(gè)無符號(hào)雙字節(jié)數(shù)相加。 設(shè)被加數(shù)存放于內(nèi)部RAM的40H(高位字節(jié)), 41H(低位字節(jié)), 加數(shù)存放于50H(高位字節(jié)), 51H(低位字節(jié)), 和數(shù)存入 40H和41H單元中。,40H,41H,50H,51H,40H,4

5、1H,+,R0,R1,A,R0,程序如下: START:CLR C ; 將Cy清零 MOV R0,41H; 將被加數(shù)地址送數(shù)據(jù)指針R0 MOV R1,51H; 將加數(shù)地址送數(shù)據(jù)指針R1 AD1:MOV A,R0 ; 被加數(shù)低字節(jié)的內(nèi)容送入A ADD A,R1 ; 兩個(gè)低字節(jié)相加 MOV R0,A ; 低字節(jié)的和存入被加數(shù)低字節(jié)中 DEC R0 ; 指向被加數(shù)高位字節(jié) DEC R1 ; 指向加數(shù)高位字節(jié) MOV A,R0 ; 被加數(shù)高位字節(jié)送入A ADDC A,R1 ; 兩個(gè)高位字節(jié)帶Cy相加 MOV R0,A ; 高位字節(jié)的和送被加數(shù)高位字節(jié) RET,例2 將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。

6、設(shè)內(nèi)部RAM 40H#, 41H單元中分別存放著 8 位二進(jìn)制數(shù), 要求取出兩個(gè)單元中的低半字節(jié), 并成一個(gè)字節(jié)后, 存入50H單元中。,40H,41H,m1,n1,m2,n2,50H,n1,n2,START: MOV R1,#40H; 設(shè)置R1為數(shù)據(jù)指針 MOV A,R1 ; 取出第一個(gè)單元中的內(nèi)容 ANL A,#0FH ; 取第一個(gè)數(shù)的低半字節(jié) SWAP A ; 移至高半字節(jié) INC R1 ; 修改數(shù)據(jù)指針 XCH A,R1 ; 取第二個(gè)單元中的內(nèi)容 ANL A,#0FH ; 取第二個(gè)數(shù)的低半字節(jié) ORL A,R1 ; 拼字 MOV 50H,A ; 存放結(jié)果 RET,4.2.2 分支程序設(shè)

7、計(jì),分支結(jié)構(gòu)框圖 (a) 單分支流程; (b) 多分支流程,例3 x,y均為8位二進(jìn)制數(shù),設(shè)x存入R0,y存入R1,求解:,ORG 1000H COMP: CJNE R0,#00H,SUL1;R0中的數(shù)與00比較不等轉(zhuǎn)移 MOV R1,#00H ;相等,R1 0 SJMP SUL2 SUL1:JC NEG ;兩數(shù)不等,若(R0)0,則R101H SJMP SUL2 NEG:MOV R1,#0FFH;(R0)0, 則 R10FFH SUL2:RET,例 4 比較兩個(gè)無符號(hào)數(shù)的大小。 設(shè)外部 RAM 的存儲(chǔ)單元 ST1和 ST2中存放兩個(gè)不帶符號(hào)的二進(jìn)制數(shù), 找出其中的大數(shù)存入外部 RAM 中的

8、ST3單元中。,程序如下: ORG 1000H ST1 EQU 2000H ST2 EQU 2100H ST3 EQU 2200H START: CLR C ; 清零Cy MOV DPTR, ST1 ; 第一個(gè)數(shù)的指針 MOVX A, DPTR ; 取第一個(gè)數(shù) MOV R2, A ; 保存 MOV DPTR, ST2 ; 第二個(gè)數(shù)的指針 MOVX A, DPTR ; 取第二個(gè)數(shù) CLR C,SUBB A, R2; 兩數(shù)比較 JNC BIG1 ; 若第二個(gè)數(shù)大, 則轉(zhuǎn) XCH A, R2; 第一個(gè)數(shù)大 BIG0: MOV DPTR, ST3 MOVX DPTR, A ; 存大數(shù) RET BIG1

9、: MOVX A, DPTR; 第二個(gè)數(shù)大 SJMP BIG0 RET,4.2.3 循環(huán)程序設(shè)計(jì),一、 循環(huán)程序,先執(zhí)行后判斷,先判斷后執(zhí)行,循環(huán)程序一般由四個(gè)主要部分組成: (1) 初始化部分: 為循環(huán)程序做準(zhǔn)備, 如規(guī)定循環(huán)次數(shù)、 給各變量和地址指針預(yù)置初值。 (2) 處理部分: 為反復(fù)執(zhí)行的程序段, 是循環(huán)程序的實(shí)體, 也是循環(huán)程序的主體。 (3) 循環(huán)控制部分: 這部分的作用是修改循環(huán)變量和控制變量, 并判斷循環(huán)是否結(jié)束, 直到符合結(jié)束條件時(shí), 跳出循環(huán)為止。 (4) 結(jié)束部分: 這部分主要是對(duì)循環(huán)程序的結(jié)果進(jìn)行分析、 處理和存放。,例 5 工作單元清零。 工作單元清零工作常常放在程序

10、的初始化部分中。 設(shè)有50個(gè)工作單元, 其首址為外部存儲(chǔ)器8000H單元, 則其工作單元清零程序如下:,例6 設(shè)在內(nèi)部 RAM的BLOCK單元開始處有長(zhǎng)度為 LEN個(gè)的無符號(hào)數(shù)據(jù)塊, 試編一個(gè)求和程序, 并將和存入內(nèi)部 RAM的SUM單元(設(shè)和不超過 8 位)。,BLOCK EQU 20H LEN EQU 30H SUM EQU 40H START: CLR A ; 清累加器A MOV R2, LEN; 數(shù)據(jù)塊長(zhǎng)度送R2 MOV R1, BLOCK ; 數(shù)據(jù)塊首址送R1 LOOP: ADD A, R1 ; 循環(huán)加法 INC R1; 修改地址指針 DJNZ R2, LOOP ; 修改計(jì)數(shù)器并判斷

11、 MOV SUM, A; 存和 RET,二、 多重循環(huán),例7 10 秒延時(shí)程序。 延時(shí)程序與 MCS - 51 執(zhí)行指令的時(shí)間有關(guān), 如果使用 12 MHz晶振, 一個(gè)機(jī)器周期為 1 s, 計(jì)算出一條指令以至一個(gè)循環(huán)所需要的執(zhí)行時(shí)間, 給出相應(yīng)的循環(huán)次數(shù), 便能達(dá)到延時(shí)的目的。,10 秒延時(shí)程序如下: DELAY: MOV R5, 100 ; 1 DEL0: MOV R6, 100 ; 1 DEL1: MOV R7, 498 ; 1 NOP ; 1 DEL2: DJNZ R7, DEL2; 2x498=996 DJNZ R6, DEL1; 2 DJNZ R5, DEL0; 2 RET ;,10

12、00,上例程序中采用了多重循環(huán)程序, 即在一個(gè)循環(huán)體中又包含了其它的循環(huán)程序, 這種方式是實(shí)現(xiàn)延時(shí)程序的常用方法。 使用多重循環(huán)時(shí), 必須注意: (1) 循環(huán)嵌套, 必須層次分明, 不允許產(chǎn)生內(nèi)外層循環(huán)交叉。 (2) 外循環(huán)可以一層層向內(nèi)循環(huán)進(jìn)入, 結(jié)束時(shí)由里往外一層層退出。 (3) 內(nèi)循環(huán)可以直接轉(zhuǎn)入外循環(huán), 實(shí)現(xiàn)一個(gè)循環(huán)由多個(gè)條件控制的循環(huán)結(jié)構(gòu)方式。,例 8 在外部 RAM中, BLOCK開始的單元中有一無符號(hào)數(shù)據(jù)塊, 其個(gè)數(shù)為 LEN個(gè)字節(jié)。試將這些無符號(hào)數(shù)按遞減次序重新排列, 并存入原存儲(chǔ)區(qū)。,ORG 1000H START: MOV DPTR, BLOCK; 置地址指針 MOV P2

13、, DPH ; P2作地址指針高字節(jié) MOV R7, LEN ; 置外循環(huán)計(jì)數(shù)初值 DEC R7 ; 比較與交換 n-1次,LOOP0: CLR F0 ; 交換標(biāo)志清 0 MOV R0, DPL; MOV R1, DPL ; 置相鄰兩數(shù)地址指針低字節(jié) INC R1 MOV R6, R7 ; 置內(nèi)循環(huán)計(jì)數(shù)器初值 LOOP1: MOVX A, R0 ; 取數(shù) MOV B, A ; 暫存 MOVX A, R1 ; 取下一個(gè)數(shù) CJNE A, B, NEXT; 相鄰兩數(shù)比較, 不等轉(zhuǎn) SJMP NOCHA ; 相等不交換,NEXT: JC NOCHA; Cy =1, 則前者大于后者, 不必交換 SET

14、B F0 ; 否則, 置交換標(biāo)志 MOVX R0, A ; XCH A, B ; 兩數(shù)交換, 大者在前, 小者在后 MOVX R1, A ; NOCHA: INC R0 INC R1; 修改指針 DJNZ R6, LOOP1 ; 內(nèi)循環(huán)未完, 則繼續(xù) JNB F0, EXIT ; 若從未交換, 則結(jié)束 DJNZ R7, LOOP0; 外循環(huán)未完, 則繼續(xù) EXIT: RET,例 9 設(shè)某系統(tǒng)的模數(shù)轉(zhuǎn)換器是ADC0809, 它的轉(zhuǎn)換結(jié)束信號(hào) EOC連接到8031 的P1.7端, 當(dāng) EOC的狀態(tài)由低變高時(shí), 則結(jié)束循環(huán)等待, 并讀取轉(zhuǎn)換值, 其程序如下: START: MOV DPTR, add

15、r ; 0809端口地址送DPTR MOV A, 00H ; 啟動(dòng)0809轉(zhuǎn)換 MOVX DPTR, A LOOP: JNB P1.7, LOOP; 檢測(cè)P1.7狀態(tài), 判是否轉(zhuǎn)換結(jié)束 MOVXCA, DPTR; 讀取轉(zhuǎn)換結(jié)果,例10 在內(nèi)部 RAM中從 50H單元開始的連續(xù)單元依次存放了一串字符, 該字符串以回車符為結(jié)束標(biāo)志, 要求測(cè)試該字符串的長(zhǎng)度。,程序如下: START: MOV R2, 0FFH MOV R0, 4FH ; 數(shù)據(jù)指針R0置初值 LOOP: INC R0 INC R2 CJNE R0, 0DH, LOOP RET,4.2.4 散轉(zhuǎn)程序設(shè)計(jì),散轉(zhuǎn)程序是分支程序的一種, 它

16、可根據(jù)運(yùn)算結(jié)果或輸入數(shù)據(jù)將程序轉(zhuǎn)入不同的分支。MCS - 51 指令系統(tǒng)中有一條跳轉(zhuǎn)指令JMPA+DPTR, 用它可以很容易地實(shí)現(xiàn)散轉(zhuǎn)功能。該指令把累加器的 8 位無符號(hào)數(shù)與 16 位數(shù)據(jù)指針的內(nèi)容相加, 并把相加的結(jié)果裝入程序計(jì)數(shù)器PC, 控制程序轉(zhuǎn)向目標(biāo)地址去執(zhí)行。此指令的特點(diǎn)在于, 轉(zhuǎn)移的目標(biāo)地址不是在編程或匯編時(shí)預(yù)先確定的, 而是在程序運(yùn)行過程中動(dòng)態(tài)地確定的。目標(biāo)地址是以數(shù)據(jù)指針 DPTR的內(nèi)容為起始的 256 字節(jié)范圍內(nèi)的指定地址, 即由 DPTR的內(nèi)容決定分支轉(zhuǎn)移程序的首地址, 由累加器 A的內(nèi)容來動(dòng)態(tài)選擇其中的某一個(gè)分支轉(zhuǎn)移程序。,例 11 根據(jù)工作寄存器R0 內(nèi)容的不同, 使程

17、序轉(zhuǎn)入相應(yīng)的分支。 (R0)=0 對(duì)應(yīng)的分支程序標(biāo)號(hào)為PR0; (R0)=1 對(duì)應(yīng)的分支程序標(biāo)號(hào)為PR1; (R0)=N 對(duì)應(yīng)的分支程序標(biāo)號(hào)為PRN。,程序如下: LP0: MOV DPTR, TAB ; 取表頭地址 MOV A, R0 ADD A, R0 ; R0內(nèi)容乘以2 JNC LP1 ; 無進(jìn)位轉(zhuǎn)移 INC DPH ; 加進(jìn)位位 LP1: JMP A+DPTR; 跳至散轉(zhuǎn)表中相應(yīng)位置 TAB: AJMP PR0 AJMP PR1 AJMP PRN,本例程序僅適用于散轉(zhuǎn)表首地址 TAB和處理程序入口地址 PR0, PR1, , PRN在同一個(gè) 2 KB范圍的存儲(chǔ)區(qū)內(nèi)的情形。若超出 2 K

18、B范圍可在分支程序入口處安排一條長(zhǎng)跳轉(zhuǎn)指令, 可采用如下程序:,MOV DPTR, TAB MOV A, R0 MOV B, 03H ; 長(zhǎng)跳轉(zhuǎn)指令占 3 個(gè)字節(jié) MUL AB XCH A, B,ADD A, DPH MOV DPH, A XCH A, B JMP A+DPTR; 跳至散轉(zhuǎn)表中相應(yīng)的位置 TAB: LJMP PR0; 跳至不同的分支 LJMP PR1 LJMP PRN,4.3 查表程序設(shè)計(jì),查表程序是一種常用程序, 它廣泛使用于 LED顯示控制、 打印機(jī)打印控制、數(shù)據(jù)補(bǔ)償、數(shù)值計(jì)算、轉(zhuǎn)換等功能程序中, 這類程序具有簡(jiǎn)單、執(zhí)行速度快等特點(diǎn)。 所謂查表法, 就是預(yù)先將滿足一定精度要

19、求的表示變量與函數(shù)值之間關(guān)系的一張表求出, 然后把這張表存于單片機(jī)的程序存儲(chǔ)器中, 這時(shí)自變量值為單元地址, 相應(yīng)的函數(shù)值為該地址單元中的內(nèi)容。查表, 就是根據(jù)變量 X在表格中查找對(duì)應(yīng)的函數(shù)值 Y, 使 Y=f(X)。,MCS - 51指令系統(tǒng)中, 有兩條查表指令: MOVC A, A+PC MOVC A, A+DPTR,例 12 一個(gè)十六進(jìn)制數(shù)存放在內(nèi)部 RAM 的 HEX單元的低 4 位中, 將其轉(zhuǎn)換成ASCII碼并送回 HEX單元。 十六進(jìn)制 09的ASCII碼為 30H39H, AF的ASCII碼為41H46H, ASCII碼表格的首地址為ASCTAB。編程如下:,ORG 1000H

20、HEXASC: MOV A, HEX ANL A, 0FH ADD A, 3; 修改指針 MOVC A, A+PC MOV HEX, A RET,ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H DB 46H 在這個(gè)程序中, 查表指令MOVC A, A+PC到表格首地址有兩條指令, 占用 3 個(gè)字節(jié)地址空間, 故修改指針應(yīng)加 3。,例 13 設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置, 需對(duì) 96 路輸入進(jìn)行控制, 每路有一個(gè)額定的最大值, 是雙字節(jié)數(shù)。當(dāng)檢測(cè)量大于該路對(duì)應(yīng)的最大值時(shí),

21、 就越限報(bào)警。假設(shè)R2 為保存檢測(cè)路數(shù)的寄存器, 其對(duì)應(yīng)的最大額定值存放于 31H和 32H單元中。 查找最大額定值的程序如下:,FMAX: MOV A, R2 ADD A, R2 ; 表中一個(gè)額定值為2個(gè)字節(jié) MOV 31H, A MOV DPTR, TAB ; 表首址,MOVC A, A+DPTR; 查表讀取第一個(gè)字節(jié) XCH A, 31H ; 第一個(gè)字節(jié)內(nèi)容存入31H INC DPTR MOVC A, A+DPTR; 查表讀取第二個(gè)字節(jié) MOV 32H, A ; 第二字節(jié)的內(nèi)容存入32H TAB: DW 1230H, 1450H, . DW 2230H, 2440H, . DW 3120

22、H, 3300H, .,例 14 在一個(gè)溫度檢測(cè)系統(tǒng)中, 溫度模擬信號(hào)由 10 位A/D輸入。將A/D結(jié)果轉(zhuǎn)換為對(duì)應(yīng)溫度值, 可采用查表方法實(shí)現(xiàn)。 先由實(shí)驗(yàn)測(cè)試出整個(gè)溫度量程范圍內(nèi)的A/D轉(zhuǎn)換結(jié)果, 把A/D轉(zhuǎn)換結(jié)果000H3FFH所對(duì)應(yīng)的溫度值組織為一個(gè)表存儲(chǔ)在程序存儲(chǔ)器中, 那么就可以根據(jù)檢測(cè)到的模擬量的 A/D轉(zhuǎn)換值查找出相應(yīng)的溫度值。 設(shè)測(cè)得的A/D轉(zhuǎn)換結(jié)果已存入 20H#, 21H單元中(高位字節(jié)在20H中, 低位字節(jié)在21H中), 查表得到的溫度值存放在22H#,23H單元(高位字節(jié)在 22H中, 低位字節(jié)在23H中)。,程序如下: FTMP: MOV DPTR, TAB ; DP

23、TR表首地址 MOVA, 21H ; (20H)(21H)2 CLRC RLCA MOV21H, A MOVA, 20H RLCA MOV20H, A MOVA, 21H ; 表首地址+偏移量 ADDC A, DPL MOVDPL, A,MOVA, 20H ADDC A, DPH MOVDPH, A CLR A MOVC A, A+DPTR; 查表得溫度值高位字節(jié) MOV22H, A CLRA INCDPTR MOVC A, A+DPTR; 查表得溫度值低位字節(jié) MOV23H, A RET TAB: DW ,4.4 子程序設(shè)計(jì),一、子程序設(shè)計(jì)原則和應(yīng)注意的問題 子程序是一種能完成某一特定任務(wù)的

24、程序段。其資源要為所有調(diào)用程序共享。因此,子程序在結(jié)構(gòu)上應(yīng)具有獨(dú)立性和通用性,在編寫子程序時(shí)應(yīng)注意以下問題: 1子程序的第一條指令的地址稱為子程序的入口地址。該指令前通常有標(biāo)號(hào)。 2主程序調(diào)用子程序 兩條子程序調(diào)用指令: (1)絕對(duì)調(diào)用指令:ACALL addr11,(2)長(zhǎng)調(diào)用指令:LCALL addr16 3注意設(shè)置堆棧指針和現(xiàn)場(chǎng)保護(hù) 4最后一條指令必須是RET指令 5子程序可以嵌套,即子程序可以調(diào)用子程序 6在子程序調(diào)用時(shí),還要注意參數(shù)傳遞的問題 二、 子程序的基本結(jié)構(gòu) MAIN: ;MAIN為主程序或調(diào)用程序標(biāo)號(hào) LCALL SUB ;調(diào)用子程序SUB ,SUB: PUSH PSW;現(xiàn)

25、場(chǎng)保護(hù) PUSH ACC; 子程序處理程序段 POP ACC;現(xiàn)場(chǎng)恢復(fù) POP PSW; RET;最后一條指令必須為RET,例15 把內(nèi)部RAM某一單元中一個(gè)字節(jié)的十六進(jìn)制數(shù)轉(zhuǎn)換成兩位ASCII碼, 結(jié)果存放在內(nèi)部RAM的連續(xù)兩個(gè)單元中。 假設(shè)一個(gè)字節(jié)的十六進(jìn)制數(shù)在內(nèi)部RAM 40H單元, 而結(jié)果存入50H, 51H單元, 可以用堆棧進(jìn)行參數(shù)傳遞, 程序如下:,MAIN: MOV R1, 50H ; R1 為存結(jié)果的指針 MOV A, 40H ; A為需轉(zhuǎn)換的十六進(jìn)制數(shù) SWAP A ; 先轉(zhuǎn)換高位半字 PUSH ACC ; 壓棧 LCALL HEASC ; 調(diào)用將低半字節(jié)的內(nèi)容轉(zhuǎn)換; 成AS

26、CII碼子程序HEASC POP ACC MOV R1, A ; 存高半字節(jié)轉(zhuǎn)換結(jié)果 INC R1 PUSH 40H LCALL HEASC POP ACC MOV R1, A ; 存低半字節(jié)轉(zhuǎn)換結(jié)果 END,HEASC: MOV R0, SP DEC R0 DEC R0 ; R0 指向十六進(jìn)制數(shù)參數(shù)地址 XCH A, R0 ; 取被轉(zhuǎn)換參數(shù) ANL A, 0FH ; 保留低半字節(jié) ADD A, 2 ; 修改 A值 MOVC A, A+PC ; 查表 XCH A, R0; 結(jié)果送回堆棧 RET TAB: DB 30H, 31H, 32H, ,4.5 數(shù)制轉(zhuǎn)換,例 16 將一個(gè)字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成

27、 3 位非壓縮型BCD碼。 設(shè)一個(gè)字節(jié)二進(jìn)制數(shù)在內(nèi)部RAM 40H單元, 轉(zhuǎn)換結(jié)果放入內(nèi)部 RAM 50H#, 51H, 52H單元中(高位在前), 程序如下:,HEXBCD: MOV A, 40H MOV B, 100 DIV AB MOV 50H, A MOV A, 10 XCH A, B DIV AB MOV 51H, A MOV 52H, B RET,例 17 設(shè) 4 位BCD碼依次存放在內(nèi)存 RAM中 40H43H單元的低4 位, 高 4 位都為 0, 要求將其轉(zhuǎn)換為二進(jìn)制數(shù), 結(jié)果存入 R2R3 中。 一個(gè)十進(jìn)制數(shù)可表示為: Dn10n +Dn-110n-1 + + D0100 =

28、(Dn10+Dn-1)10+Dn-2)10+)+D0 當(dāng)n=3時(shí), 上式可表示為: (D310+D2)10+D1)10+D0,BCDHEX: MOV R0, 40H ; R0指向最高位地址 MOV R1, 03 ; 計(jì)數(shù)值送R1 MOV R2, 0 ; 存放結(jié)果的高位清零 MOV A, R0 MOV R3, A LOOP: MOV A, R3 MOV B, 10 MUL AB MOV R3, A ; (R3)10 的低 8 位送R3 MOV A, B XCH A, R2 ; (R3)10的高 8 位暫存R2 MOV B, 10,MUL AB ADD A, R2 MOV R2, A ; R210

29、+( R310)高 8 位送R2 INC R0 ; 取下一個(gè) BCD數(shù) MOV A, R3 ADD A, R0 MOV R3, A MOV A, R2 ADDC A, 0 ; 加低字節(jié)來的進(jìn)位 MOV R2, A DJNZ R1, LOOP RET,4.6 運(yùn)算類程序設(shè)計(jì),一、 加、 減法程序,例 18 將40H開始存放的 10 個(gè)字節(jié)的數(shù)與50H開始存放的10 個(gè)字節(jié)的數(shù)相減(低位在前,假設(shè)被減數(shù)大于減數(shù))。 設(shè)被減數(shù)指針為 R0, 減數(shù)指針為 R1, 差數(shù)放回被減數(shù)單元, R5 存放字節(jié)個(gè)數(shù), 則程序如下:,SUB: MOV R0, 40H MOV R1, 50H MOV R5, 10 C

30、LR C SUB1: MOV A, R0 SUBB A, R1 MOV R0, A INC R0 INC R1 DJNZ R5, SUB1 RET,二、 乘法運(yùn)算程序 在計(jì)算機(jī)中, 常將乘法采用移位和加法來實(shí)現(xiàn)。 例19 將(R2R3)和(R6R7)中雙字節(jié)無符號(hào)數(shù)相乘, 結(jié)果存入 R4R5R6R7。 此乘法可以采用部分積右移的方法來實(shí)現(xiàn), 其程序框圖如圖 所示。 程序如下:,NMUL: MOV R4, 0 ; 初始化 MOV R5, 0 CLR C MOV R0, 16,NMUL1: MOV A, R4 ; CyR4R5R6R7右移一位 RRC A MOV R4, A MOV A, R5 R

31、RC A MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC MOV R7, A JNC NMUL2; C為移出乘數(shù)的最低位 MOV A, R5 ; (R4R5)+(R6F7)(R4R5),ADD A, R3 MOV R5, A MOV A, R4 ADDC A, R2 MOV R4, A NMUL2: DJNZR0, NMUL1; 循環(huán)16位 MOV A, R4; 最后結(jié)果再移一位 RRC A MOV R4, A MOV A, R5 RRC A MOV R5, A MOV A, R6,RRC A MOV R6, A MOV A, R7 RRC A MOV R7, A RET,例 20 假定被乘數(shù)在(R4R3)中, 乘數(shù)放在R2中, 乘積放在R7R6和R5中。 MCS - 51 中有 8 位數(shù)的乘法指令MUL, 用它來實(shí)現(xiàn)多字節(jié)乘法時(shí), 可表示為 (R4R3)(R2) =(R4)28+(R3)(R2) =(R4)(R2)28+(R3)(R2) 其中(R4)(R2)和(R3)(R2)都是可直接用MUL指令來實(shí)現(xiàn), 而乘以28意味著左移 8 位。由此可編寫如下程序:,NMUL1: MOV A, R2 MOV B, R3 MUL AB ; (R3)(R2) MOV R5, A ; 積的低位送

溫馨提示

  • 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)論