第4章程序設(shè)計_第1頁
第4章程序設(shè)計_第2頁
第4章程序設(shè)計_第3頁
第4章程序設(shè)計_第4頁
第4章程序設(shè)計_第5頁
已閱讀5頁,還剩57頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 雖然單片機的每雖然單片機的每條指令能使計算機完成一條指令能使計算機完成一 種特定的操作。但要完成某一特定的任務(wù)還種特定的操作。但要完成某一特定的任務(wù)還 需要將這些指令按工作要求有序組合為一段需要將這些指令按工作要求有序組合為一段 完整的程序。程序?qū)嶋H上是一系列計算機指完整的程序。程序?qū)嶋H上是一系列計算機指 令的有序集合。我們把利用計算機的指令系令的有序集合。我們把利用計算機的指令系 統(tǒng)來合理地編寫出解決某個問題的程序的過統(tǒng)來合理地編寫出解決某個問題的程序的過 程,稱之為程序設(shè)計。程,稱之為程序設(shè)計。 1.1.任務(wù)分析(硬件、軟件系統(tǒng)分析)任務(wù)分析(硬件、軟件系統(tǒng)分析) 2.2.確定算法和工作

2、步驟;確定算法和工作步驟; 3.3.程序總體設(shè)計和流程圖繪制程序總體設(shè)計和流程圖繪制 關(guān)于流程圖符號:關(guān)于流程圖符號: 開始、結(jié)束開始、結(jié)束-圓角矩形圓角矩形 工作任務(wù)工作任務(wù)-矩形矩形 判斷分支判斷分支-菱形菱形 程序流向程序流向- 程序連接程序連接- 開始結(jié)束 4. 4. 分配內(nèi)存,確定程序與數(shù)據(jù)區(qū)存放地址;分配內(nèi)存,確定程序與數(shù)據(jù)區(qū)存放地址; 5. 5. 編寫源程序;編寫源程序; 6. 6. 調(diào)試、修改,最終確定程序。調(diào)試、修改,最終確定程序。 1. 1. 模塊化設(shè)計(按功能分:顯示、打印、輸入、模塊化設(shè)計(按功能分:顯示、打印、輸入、 發(fā)送等)發(fā)送等) 2. 2. 盡量采用循環(huán)及子程序

3、結(jié)構(gòu)(節(jié)省內(nèi)存)盡量采用循環(huán)及子程序結(jié)構(gòu)(節(jié)省內(nèi)存) 1.1. 匯編語言源程序由以下兩種指令構(gòu)成匯編語言源程序由以下兩種指令構(gòu)成 匯編語句(指令語句)匯編語句(指令語句) 偽指令(指示性語句)偽指令(指示性語句) 2.2. 匯編語句的格式:匯編語句的格式: 標號標號:操作碼操作碼操作數(shù)操作數(shù);注釋;注釋 數(shù)據(jù)表示形式:數(shù)據(jù)表示形式: 二進制(二進制(b b)、十六進制)、十六進制(h)(h)、十進制、十進制(d(d或省略或省略) )、 asciiascii碼(以單引號標識)碼(以單引號標識) 3.3.偽指令:控制匯編用的特殊指令,這些指令不屬偽指令:控制匯編用的特殊指令,這些指令不屬 于指令系

4、統(tǒng),不產(chǎn)生機器代碼。于指令系統(tǒng),不產(chǎn)生機器代碼。 分支程序可根據(jù)要求分支程序可根據(jù)要求無條件無條件或或條件地條件地改變程序執(zhí)行流改變程序執(zhí)行流 向。編寫分支程序主要在于正確使用向。編寫分支程序主要在于正確使用轉(zhuǎn)移指令轉(zhuǎn)移指令。分支。分支 程序有:單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)(散程序有:單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)(散 轉(zhuǎn))轉(zhuǎn)) 條件成立? 下條指令 程序段a 單分支結(jié)構(gòu) y n 條件成立? 程序段a yn 程序段a 雙分支結(jié)構(gòu) 分支程序可根據(jù)要求無條件或條件地改變程序執(zhí)行流分支程序可根據(jù)要求無條件或條件地改變程序執(zhí)行流 向。編寫分支程序主要在于正確使用轉(zhuǎn)移指令。分支向。編寫分支程序

5、主要在于正確使用轉(zhuǎn)移指令。分支 程序有:單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)(散程序有:單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)(散 轉(zhuǎn))轉(zhuǎn)) k=? 程序段n n 0 程序段1 多分支結(jié)構(gòu) 程序段0 1 :兩個帶符號數(shù)分別存在內(nèi)部兩個帶符號數(shù)分別存在內(nèi)部ram 30h和和31h單元中,試比較它們的大小,將較大的單元中,試比較它們的大小,將較大的 數(shù)存入數(shù)存入32h單元中。單元中。 x xy y為正為正: : ov0,則,則xy ov=1,則,則xy x xy y為負為負: : ov0,則,則xy ov1,則,則xy x-y0? y ov = 1? n y y n 開始 置初值 32h y 32hx

6、ov = 1? y x=y? n n org0100h mov a,30h;取初值;取初值 clrc subb a,31h;xy jzdz1;x=y? jc ebb jbov,eb1;xy0 0, ov=1,xy ajmp dz1;xy0 0, ov=0,xy ebb:jb ov,dz1;xy0 0, ov=1,xy eb1:mova,31h;xy ajmp js0 dz1:mova,30h;xy js0:mov32h,a end 例例:設(shè)變量:設(shè)變量x x以補碼形式存放在片內(nèi)以補碼形式存放在片內(nèi)ram 30hram 30h單元單元 中,變量中,變量y y與與x x的關(guān)系是:的關(guān)系是: 編程根

7、據(jù)編程根據(jù)x x的值求的值求y y值并放回原單元。值并放回原單元。 0, 5 0,20 0, xx xh xx y a=? y=x+5 0 y=20hy=x 0 取x 即(30h) a 開始 存y 即y 30h 結(jié)束 org 0000horg 0000h start:mov a,30hstart:mov a,30h jz next ;x=0, jz next ;x=0,轉(zhuǎn)移轉(zhuǎn)移 anl a,#80h ;anl a,#80h ;保留符號位保留符號位 jz ed ;x0,jz ed ;x0,轉(zhuǎn)移轉(zhuǎn)移 mov a,#05h ;x0,mov a,#05h ;x0,不轉(zhuǎn)移不轉(zhuǎn)移 add a,30hadd

8、 a,30h mov 30h,a mov 30h,a sjmp ed sjmp ed next:mov 30h,#20h next:mov 30h,#20h ed:sjmp $ ed:sjmp $ startstart:mov dptrmov dptr,#tab#tab mov a mov a,r7r7 add a,r7 add a,r7 ;r7r72 2a a mov r3,a ; mov r3,a ;暫存暫存r3r3 movc a,a+dptr movc a,a+dptr ;取高位地址;取高位地址 xch a xch a ,r3r3 inc a inc a movc a movc a,a+

9、dptr a+dptr ;取低位地址取低位地址 mov dplmov dpl,a a mov dph mov dph,r3 r3 ;轉(zhuǎn)移地址送入;轉(zhuǎn)移地址送入dptrdptr clr a clr a jmp a+dptr jmp a+dptr tab: tab: dwdw p0 p0 dwdw p1 p1 dw dw pn pn p0高位 p0低位 tab p1高位 p1低位 tab+2 循環(huán)程序一般由:循環(huán)程序一般由: 初始化部分初始化部分 循環(huán)體部分循環(huán)體部分-處理部分、修改部分、控制部分處理部分、修改部分、控制部分 結(jié)束部分結(jié)束部分 其結(jié)構(gòu)一般有兩種:其結(jié)構(gòu)一般有兩種: 先進入處理部分,

10、再控制循環(huán)先進入處理部分,再控制循環(huán) 至少執(zhí)行一次循環(huán)體至少執(zhí)行一次循環(huán)體 先控制循環(huán),再進入處理部分先控制循環(huán),再進入處理部分 循環(huán)體是否執(zhí)行,取決于判斷結(jié)果。循環(huán)體是否執(zhí)行,取決于判斷結(jié)果。 開始 設(shè)置循環(huán)初值 循環(huán)處理 循環(huán)修改 結(jié)束處理 結(jié)束 循環(huán)結(jié)束? 開始 設(shè)置循環(huán)初值 循環(huán)處理 循環(huán)修改 結(jié)束處理 結(jié)束 循環(huán)結(jié)束? n y y n 循環(huán)控制的一般方法:循環(huán)控制的一般方法: v 循環(huán)次數(shù)已知循環(huán)次數(shù)已知 利用循環(huán)次數(shù)控制利用循環(huán)次數(shù)控制 v 循環(huán)次數(shù)未知循環(huán)次數(shù)未知 利用關(guān)鍵字控制利用關(guān)鍵字控制 v 利用利用“邏輯尺邏輯尺” 根據(jù)根據(jù)“邏輯尺邏輯尺”的內(nèi)容,進行控制。的內(nèi)容,進行控

11、制。 入口條件:內(nèi)部入口條件:內(nèi)部ram 30hram 30h開始的存儲區(qū)有若干個數(shù)據(jù),開始的存儲區(qū)有若干個數(shù)據(jù), 最后一個數(shù)據(jù)為字符最后一個數(shù)據(jù)為字符ffhffh,結(jié)果存入,結(jié)果存入40h40h單元。單元。 orgorg 0100h 0100h mainmain:mov r1mov r1,#30h#30h;r1r1作為地址指針作為地址指針 clrclra a;累加器;累加器a a作為計數(shù)器作為計數(shù)器 looploop:cjnecjner1r1,#0ffh#0ffh,nextnext;與數(shù)據(jù);與數(shù)據(jù)ffff比較,不等轉(zhuǎn)移比較,不等轉(zhuǎn)移 sjmpsjmpjsh1jsh1;找到結(jié)束符號,結(jié)束循環(huán);

12、找到結(jié)束符號,結(jié)束循環(huán) nextnext:inc inc a a;計數(shù)器加;計數(shù)器加1 1 inc incr1r1;指針加;指針加l l sjmp l00p sjmp l00p;循環(huán);循環(huán) jshljshl:incinca a ;再加入;再加入l l個字符個字符 movmov40h40h,a a;存結(jié)果;存結(jié)果 endend 10.1s延時程序(晶振為延時程序(晶振為12m) org 0100h mov r2,#200 loop: movr3,#250 djnzr3,$ djnzr2,loop ret 由于采用由于采用12m晶振,機器周期為晶振,機器周期為1s,djnz的指令的指令 周 期 為

13、周 期 為 2 , 整 個 程 序 的 執(zhí) 行 時 間 為, 整 個 程 序 的 執(zhí) 行 時 間 為 25020021s100000s0.1s org0100h movr1,#10 loop1:movr2,#200 loop: mov r3,#250 djnzr3,$ djnzr2,loop djnzr1,loop1 ret 例: 50ms50ms延時子程序。設(shè)晶振頻率為延時子程序。設(shè)晶振頻率為12mhz12mhz,則機,則機 器周期為器周期為1us1us。 del: mov r7,#200 ;1mcdel: mov r7,#200 ;1mc del1:mov r6,#123 ;1mcdel1

14、:mov r6,#123 ;1mc nop ;1mc nop ;1mc djnz r6,$ ;2mc djnz r6,$ ;2mc djnz r7,del1 ;2mc djnz r7,del1 ;2mc ret ;2mc ret ;2mc 延時時間:延時時間:t=1+200(1+1+2*123)+2+2 50000us=50ms 4.2.1 代碼轉(zhuǎn)換類程序設(shè)計代碼轉(zhuǎn)換類程序設(shè)計 4.2.2 查表程序設(shè)計查表程序設(shè)計 4.2.3 定點數(shù)運算子程序定點數(shù)運算子程序 4.2.4 浮點數(shù)運算子程序浮點數(shù)運算子程序 子程序設(shè)計時注意事項:子程序設(shè)計時注意事項: 1. 1. 給子程序賦一個名字。實際為入口

15、地址代號。給子程序賦一個名字。實際為入口地址代號。 2. 2. 要能正確傳遞參數(shù):要能正確傳遞參數(shù): 入口條件:子程序中要處理的數(shù)據(jù)如何給予。入口條件:子程序中要處理的數(shù)據(jù)如何給予。 出口條件:子程序處理結(jié)果如何存放。出口條件:子程序處理結(jié)果如何存放。 (寄存器、存儲器、堆棧方式)(寄存器、存儲器、堆棧方式) 3. 3. 保護與恢復現(xiàn)場:保護與恢復現(xiàn)場: 保護現(xiàn)場:保護現(xiàn)場:壓棧指令壓棧指令pushpush 恢復現(xiàn)場:恢復現(xiàn)場:彈出指令彈出指令poppop 4. 4. 子程序可以嵌套子程序可以嵌套 1單字節(jié)十六進制數(shù)轉(zhuǎn)換成雙字節(jié)單字節(jié)十六進制數(shù)轉(zhuǎn)換成雙字節(jié)ascii碼碼 表4-1 十六進制數(shù)與

16、ascii碼之間的關(guān)系 十 六 進制數(shù) 十 六 進制數(shù) 十 六 進制數(shù) 十 六 進制數(shù) 0 30h 4 34h 8 38h c 43h 1 31h 5 35h 9 39h d 44h 2 32h 6 36h a 41h e 45h 3 33h 7 37h b 42h f 46h 入口條件:入口條件:待轉(zhuǎn)換的單字節(jié)十六進制數(shù)在寄存器待轉(zhuǎn)換的單字節(jié)十六進制數(shù)在寄存器r2中。中。 出口:高四位的出口:高四位的ascii碼在碼在a中,低四位的中,低四位的ascii碼在碼在b中。中。 orgorg0100h0100h movmova a,r2r2 movmovb b,a a ;暫存待轉(zhuǎn)換的單字節(jié)十六進制

17、數(shù);暫存待轉(zhuǎn)換的單字節(jié)十六進制數(shù) lcalllcall ms1 ms1 ;轉(zhuǎn)換低四位;轉(zhuǎn)換低四位 xchxcha a,b b;存放低四位的;存放低四位的asciiascii碼碼 swapswapa a ;準備轉(zhuǎn)換高四位;準備轉(zhuǎn)換高四位 lcalllcall ms1 ms1 ;轉(zhuǎn)換高四位;轉(zhuǎn)換高四位 sjmpsjmp$ $ ms1ms1: anlanla a,#0fh#0fh;將累加器的低四位轉(zhuǎn)換成;將累加器的低四位轉(zhuǎn)換成 ascii ascii 碼碼 addadda a,#90h#90h dada a a addcaddca a,#40h#40h da da a a retret 將多位十六進

18、制數(shù)轉(zhuǎn)換成將多位十六進制數(shù)轉(zhuǎn)換成asciiascii碼,設(shè)碼,設(shè)r0r0指向十六進制數(shù)低位,指向十六進制數(shù)低位, r2r2存放字節(jié)數(shù),轉(zhuǎn)換后存放字節(jié)數(shù),轉(zhuǎn)換后r1r1指向指向asciiascii碼高位。碼高位。 htasc: mov a,r0 ;htasc: mov a,r0 ;取十六進制數(shù)取十六進制數(shù) anl a,#0fh ;anl a,#0fh ;取低四位取低四位 add a,#15 ;add a,#15 ;偏移修正偏移修正 movc a,a+pc ;movc a,a+pc ;查表得查表得asciiascii碼碼 mov r1,a ;mov r1,a ;保存保存 inc r1inc r1

19、mov a,r0 ; mov a,r0 ;取十六進制數(shù)高四位取十六進制數(shù)高四位 swap a ;swap a ; anl a,#0f0h anl a,#0f0h add a,#06h ; add a,#06h ;偏移修正偏移修正 movc a,a+pc ;movc a,a+pc ;查表查表 mov r1,a ;mov r1,a ;保存保存 inc r0 ;inc r0 ;指向下一單元指向下一單元 inc r1inc r1 djnz r2,htasc djnz r2,htasc ret ret asctab:db 30h,31h,32h,33h,34h,35h,36h,37hasctab:db

20、30h,31h,32h,33h,34h,35h,36h,37h db 38h,39h,41h,42h,43h,44h,45h,46h db 38h,39h,41h,42h,43h,44h,45h,46h 入口條件:待轉(zhuǎn)換的入口條件:待轉(zhuǎn)換的 ascii 碼在碼在r2中。中。 出口:轉(zhuǎn)換后的十六進制數(shù)在出口:轉(zhuǎn)換后的十六進制數(shù)在r3中。中。 org 0100h mov a,r2 subb a,#30h clr c jnb acc.4,m1 subb a,#7 m1:mov r3,a sjmp $ end 入口條件:入口條件:待轉(zhuǎn)換的單字節(jié)十六進制整數(shù)在待轉(zhuǎn)換的單字節(jié)十六進制整數(shù)在r2中。中。 出

21、口:轉(zhuǎn)換后的碼整數(shù)(十位和個位)在出口:轉(zhuǎn)換后的碼整數(shù)(十位和個位)在r5中,中, 百位在百位在r3中。中。 mov a,r2 hbcd:mov b,#100;分離出百位,存放在;分離出百位,存放在 r3中中 divab mov r3,a mov a,#10;余數(shù)繼續(xù)分離十位和個位;余數(shù)繼續(xù)分離十位和個位 xch a,b divab swap a orla,b ;將十位和個位拼裝成碼;將十位和個位拼裝成碼 mov r5,a sjmp $ end 4雙字節(jié)十六進制整數(shù)轉(zhuǎn)換成雙字節(jié)碼整數(shù)雙字節(jié)十六進制整數(shù)轉(zhuǎn)換成雙字節(jié)碼整數(shù) movr6,a mova,r5;碼帶進位自身相加,相當于乘;碼帶進位自身相

22、加,相當于乘 addca,r5 daa ;十進制調(diào)整;十進制調(diào)整 movr5,a mova,r4 addc a,r4 daa movr4,a mova,r3 addca,r3 movr3,a;雙字節(jié)十六進制數(shù)的萬位數(shù)不超過,不用調(diào)整雙字節(jié)十六進制數(shù)的萬位數(shù)不超過,不用調(diào)整 djnzr2,hb3;判斷;判斷16位處理完?位處理完? sjmp$ end 5雙字節(jié)碼整數(shù)轉(zhuǎn)換成雙字節(jié)十六進制整數(shù)雙字節(jié)碼整數(shù)轉(zhuǎn)換成雙字節(jié)十六進制整數(shù) 入口條件:入口條件:待轉(zhuǎn)換的雙字節(jié)碼整數(shù)在待轉(zhuǎn)換的雙字節(jié)碼整數(shù)在r2、r3中。中。 出口:出口:轉(zhuǎn)換后的雙字節(jié)十六進制整數(shù)仍在轉(zhuǎn)換后的雙字節(jié)十六進制整數(shù)仍在r2、r3中。中

23、。 org 0100h bh2: : mov a,r3;將低字節(jié)轉(zhuǎn)換成十六進制;將低字節(jié)轉(zhuǎn)換成十六進制 lcall bcd1 mov r3,a mov a,r2;將高字節(jié)轉(zhuǎn)換成十六進制;將高字節(jié)轉(zhuǎn)換成十六進制 lcall bcd1 mov b,#100;擴大一百倍;擴大一百倍 mul ab add a,r3;和低字節(jié)按十六進制相加;和低字節(jié)按十六進制相加 mov r3,a clr a addca,b mov r2,a sjmp $ bcd1:movb,#10h;分離十位和個位;分離十位和個位 div ab mov r4,b ;暫存?zhèn)€位;暫存?zhèn)€位 mov b,#10;將十位轉(zhuǎn)換成十六進制;將十位

24、轉(zhuǎn)換成十六進制 mul ab add a,r4;十六進制加上個位;十六進制加上個位 ret end movc a,a+dptr movc a,a+pc 1查表求查表求ascii碼碼 入口條件:入口條件:r0低四位有一個十六進制數(shù)低四位有一個十六進制數(shù) (0f)。)。 出口:將查表找出的相應(yīng)出口:將查表找出的相應(yīng)ascii碼并送回碼并送回r0 中。中。 org0100h mova,r0 anla,#0fh;屏蔽高;屏蔽高4位位 adda,#03h;查表指令;查表指令pc值與表格值與表格 pc值相差值相差3字節(jié)字節(jié) movca,a+pc;查表;查表 movr0,a;存結(jié)果;存結(jié)果 sjmp$ as

25、ctab:db 0,1,2,3,4,5,6,7 db 8,9,a,b,c,d,e,f 1多字節(jié)碼加法多字節(jié)碼加法 入口條件:入口條件:字節(jié)數(shù)在字節(jié)數(shù)在r7中,被加數(shù)在中,被加數(shù)在30h起始單元起始單元 中,加數(shù)在中,加數(shù)在40h起始單元中。起始單元中。 出口:出口:和在和在30h起始單元中,最高位進位在起始單元中,最高位進位在cy中。中。 org 0100h mov r7,#03h mov r0,#30h mov r1,#40h mov a,r7 ;取字節(jié)數(shù)至;取字節(jié)數(shù)至 r2 中中 mov r2,a add a,r0;初始化數(shù)據(jù)指針;初始化數(shù)據(jù)指針 movr0,a mova,r2 add a

26、,r1 movr1,a clr c bb1:dec r0;調(diào)整數(shù)據(jù)指針;調(diào)整數(shù)據(jù)指針 dec r1 mov a,r0 addc a,r1 ;按字節(jié)相加;按字節(jié)相加 daa;十進制調(diào)整;十進制調(diào)整 mov r0,a;和存回;和存回 r0 中中 djnz r2,bb1;處理完所有字節(jié);處理完所有字節(jié) end 入口條件:入口條件:字節(jié)數(shù)在字節(jié)數(shù)在 r7 中,被減數(shù)在中,被減數(shù)在r0 中,減數(shù)在中,減數(shù)在 r1 中。中。 出口:出口:差在差在 r0 中,最高位借位在中,最高位借位在cy中。中。 org 0100horg 0100h bcdbbcdb:lcall mn1 lcall mn1 ;減數(shù);減數(shù)

27、 r1 r1 十進制取補十進制取補 lcall bcda lcall bcda ;按多字節(jié)碼加法處理;按多字節(jié)碼加法處理 cpl ccpl c;將補碼加法的進位標志轉(zhuǎn)換成借位標志將補碼加法的進位標志轉(zhuǎn)換成借位標志 mov f0mov f0,c c lcall mn1 lcall mn1 ;恢復減數(shù);恢復減數(shù) r1 r1 的原始值的原始值 mov cmov c,f0f0;恢復借位標志;恢復借位標志 retret mn1mn1:movmova a,r0 r0 ;r1 r1 十進制取補子程序入口十進制取補子程序入口 xchxch a a,r1r1;交換指針;交換指針 xchxch a a,r0r0

28、lcall lcallnegneg;通過;通過 r0 r0 實現(xiàn)實現(xiàn) r1 r1 取補取補 movmov a a,r0r0 xch xch a a,r1 r1 ;換回指針;換回指針 xchxch a a,r0r0 ret ret bcdabcda:mov mov a a,r7 r7 ;取字節(jié)數(shù)至;取字節(jié)數(shù)至 r2 r2 中中 movmov r2r2,a a add add a a,r0 r0 ;初始化數(shù)據(jù)指針;初始化數(shù)據(jù)指針 movmov r0r0,a a mov mov a a,r2r2 addadd a a,r1r1 mov mov r1r1,a a clr clr c c bcd1bcd

29、1:decdecr0r0;調(diào)整數(shù)據(jù)指針;調(diào)整數(shù)據(jù)指針 decdecr1r1 mov mova a,r0r0 addc addca a,r1 r1 ;按字節(jié)相加;按字節(jié)相加 dada a a;十進制調(diào)整;十進制調(diào)整 movmovr0r0,a a;和存回;和存回 r0 r0 中中 djnzdjnzr2r2,bcd1bcd1;處理完所有字節(jié);處理完所有字節(jié) retret negneg:movmova a,r7r7;bcdbcd碼取補子程序碼取補子程序 decdeca a movmovr2r2,a a movmova a,r0r0 movr3,a neg0: clr c mova,#99h subba

30、,r0 ;按字節(jié)十進制取補;按字節(jié)十進制取補 movr0,a;存回;存回 r0 中中 incr0 ;調(diào)整數(shù)據(jù)指針;調(diào)整數(shù)據(jù)指針 djnzr2,neg0 ;處理完(;處理完( r2 )字節(jié))字節(jié) mova,#9ah ;最低字節(jié)單獨取補;最低字節(jié)單獨取補 subb a,r0 movr0,a mova,r3 ;恢復指針;恢復指針 mov r0,a ret 4雙字節(jié)二進制無符號數(shù)乘法子程序雙字節(jié)二進制無符號數(shù)乘法子程序 入口條件:被乘數(shù)在入口條件:被乘數(shù)在r2、r3 中,乘數(shù)在中,乘數(shù)在r6、r7中。中。 出口:乘積在出口:乘積在 r2 、 r3 、 r4 、 r5 中。中。 org 0100h mu

31、ld:mov a,r3;計算;計算 r3 乘乘 r7 movb,r7 mulab movr4,b ;暫存部分積;暫存部分積 movr5,a mova,r3;計算;計算 r3 乘乘 r6 movb,r6 mulab adda,r4;累加部分積;累加部分積 movr4,a clra addca,b movr3,a mova,r2 ;計算;計算 r2 乘乘 r7 movb,r7 mulab adda,r4;累加部分積;累加部分積 movr4,a mova,r3 addca,b movr3,a clra rlca xcha,r2 ;計算;計算 r2 乘乘 r6 movb,r6 mulab adda,r

32、3 ;累加部分積;累加部分積 movr3,a mova,r2 addca,b movr2,a ret 6雙字節(jié)二進制無符號數(shù)除法子程序雙字節(jié)二進制無符號數(shù)除法子程序 入口條件:被除數(shù)在入口條件:被除數(shù)在 r2 、 r3 、 r4 、 r5 中,除中,除 數(shù)在數(shù)在 r6 、 r7 中。中。 出口:出口: ov=0 時,雙字節(jié)商在時,雙字節(jié)商在 r2 、 r3 中,中, ov=1 時溢出。時溢出。 org 0100h divd: clr c;比較被除數(shù)和除數(shù);比較被除數(shù)和除數(shù) mov a,r3 subb a,r7 mov a,r2 subb a,r6 jc dvd1 setb ov ;溢出;溢出

33、ret dvd1:mov b,#10h;計算雙字節(jié)商;計算雙字節(jié)商 dvd2:clrc;部分商和余數(shù)同時左移一位;部分商和余數(shù)同時左移一位 mova,r5 rlca movr5,a mova,r4 rlca movr4,a mova,r3 rlca movr3,a xcha,r2 rlca xcha,r2 movf0,c ;保存溢出位;保存溢出位 clrc subba,r7;計算(;計算( r2r3 r6r7 ) movr1,a mova,r2 subba,r6 anlc,/f0;結(jié)果判斷;結(jié)果判斷 jc dvd3 movr2,a;夠減,存放新的余數(shù);夠減,存放新的余數(shù) mova,r1 mov

34、r3,a incr5;商的低位置一;商的低位置一 dvd3:djnz b,dvd2 ;計算完十六位商(;計算完十六位商( r4r5 ) mova,r4;將商移到;將商移到 r2r3 中中 movr2,a mova,r5 movr3,a clrov;設(shè)立成功標志;設(shè)立成功標志 ret 1浮點數(shù)的表示浮點數(shù)的表示 (1)二進制浮點操作數(shù))二進制浮點操作數(shù) 用三個字節(jié)表示,第一個字節(jié)的最高位為數(shù)用三個字節(jié)表示,第一個字節(jié)的最高位為數(shù) 符,其余七位為階碼(補碼形式),第二字符,其余七位為階碼(補碼形式),第二字 節(jié)為尾數(shù)的高字節(jié),第三字節(jié)為尾數(shù)的低字節(jié)為尾數(shù)的高字節(jié),第三字節(jié)為尾數(shù)的低字 節(jié),尾數(shù)用雙

35、字節(jié)純小數(shù)(原碼)來表示。節(jié),尾數(shù)用雙字節(jié)純小數(shù)(原碼)來表示。 當尾數(shù)的最高位為時,便稱為規(guī)格化浮點當尾數(shù)的最高位為時,便稱為規(guī)格化浮點 數(shù),簡稱操作數(shù)數(shù),簡稱操作數(shù) (2 2)十進制浮點操作數(shù))十進制浮點操作數(shù) 用三個字節(jié)表示,第一個字節(jié)的最高位為數(shù)符,用用三個字節(jié)表示,第一個字節(jié)的最高位為數(shù)符,用 來表示正負數(shù)(來表示正負數(shù)(0 0表示正數(shù),表示正數(shù),1 1表示負數(shù))其余七位表示負數(shù))其余七位 為階碼(二進制補碼形式),第二字節(jié)為尾數(shù)的高為階碼(二進制補碼形式),第二字節(jié)為尾數(shù)的高 字節(jié),第三字節(jié)為尾數(shù)的低字節(jié),尾數(shù)用雙字節(jié)字節(jié),第三字節(jié)為尾數(shù)的低字節(jié),尾數(shù)用雙字節(jié) bcdbcd碼純小數(shù)

36、(原碼)來表示。當十進制數(shù)的絕對碼純小數(shù)(原碼)來表示。當十進制數(shù)的絕對 值大于時,階碼就等于整數(shù)部分的位數(shù)。值大于時,階碼就等于整數(shù)部分的位數(shù)。 例如:例如:156.6 156.6 的階碼是的階碼是03h03h,156.6 156.6 的階碼是的階碼是 83h 83h ; 當十進制數(shù)的絕對值小于當十進制數(shù)的絕對值小于 1 1 時,階碼就等于時,階碼就等于 80h 80h 減去小數(shù)點后面零的個數(shù)。減去小數(shù)點后面零的個數(shù)。 例如例如 :0.003620.00362的階碼是的階碼是 7eh 7eh ,0.00362 0.00362 的階的階 碼是碼是 0feh 0feh 。 例如:有一個十進制浮點

37、操作數(shù)存放在例如:有一個十進制浮點操作數(shù)存放在30h30h、31h31h、 32h32h中,數(shù)值是中,數(shù)值是0.073150.07315,即,即0.7315 0.7315 乘以乘以10 10 的的 1 1 次方,則階碼為次方,則階碼為7fh7fh,若加上數(shù)符(,若加上數(shù)符(30h30h) =0ffh=0ffh,31h=73h31h=73h,(,(32h32h)=15h =15h 。 (3)運算精度)運算精度 單次定點運算精度為結(jié)果最低位的當量值;單次定點運算精度為結(jié)果最低位的當量值; 單次二進制浮點算術(shù)運算的精度優(yōu)于十萬分單次二進制浮點算術(shù)運算的精度優(yōu)于十萬分 之三;單次二進制浮點超越函數(shù)運算

38、的精度之三;單次二進制浮點超越函數(shù)運算的精度 優(yōu)于萬分之一;優(yōu)于萬分之一;bcd碼浮點數(shù)本身的精度比碼浮點數(shù)本身的精度比 較低(萬分之一到千分之一),不宜作為運較低(萬分之一到千分之一),不宜作為運 算的操作數(shù),僅用于輸入或輸出時的數(shù)制轉(zhuǎn)算的操作數(shù),僅用于輸入或輸出時的數(shù)制轉(zhuǎn) 換。不管那種數(shù)據(jù)格式,隨著連續(xù)運算的次換。不管那種數(shù)據(jù)格式,隨著連續(xù)運算的次 數(shù)增加,精度都會下降。數(shù)增加,精度都會下降。 2浮點數(shù)加減法子程序浮點數(shù)加減法子程序 入口條件:被加數(shù)在入口條件:被加數(shù)在 r0 中,加數(shù)在中,加數(shù)在 r1 中。被減數(shù)在中。被減數(shù)在 r0 中,減數(shù)在中,減數(shù)在 r1 中。中。 當當f0=0時,

39、程序作浮點數(shù)加法運算;當時,程序作浮點數(shù)加法運算;當f0=1 時,程序作浮點數(shù)減法運算。時,程序作浮點數(shù)減法運算。 出口:出口: ov=0 時,和(差)仍在時,和(差)仍在 r0 中,中, ov=1 時,溢出。時,溢出。 org0100h fadd:clrf0 ;設(shè)立加法標志;設(shè)立加法標志 sjmpas ;計算代數(shù)和;計算代數(shù)和 fsub:setbf0 ;設(shè)立減法標志;設(shè)立減法標志 as: lcallmvr1 ;計算代數(shù)和。先將計算代數(shù)和。先將 r1 傳送到第二工作區(qū)傳送到第二工作區(qū) mov c,f0 ;用加減標志來校正第二操作數(shù)的有效符號用加減標志來校正第二操作數(shù)的有效符號 rrca xrl

40、a,r1 movc,acc.7 asn:mov 1eh,c ;將第二操作數(shù)的有效符號存入位將第二操作數(shù)的有效符號存入位 1eh 中中 xrla,r0 ;與第一操作數(shù)的符號比較;與第一操作數(shù)的符號比較 rlca movf0,c ;保存比較結(jié)果;保存比較結(jié)果 lcallmvr0;將;將 r0 傳送到第一工作區(qū)中傳送到第一工作區(qū)中 lcallas1 ;在工作寄存器中完成代數(shù)運算;在工作寄存器中完成代數(shù)運算 mov0:incr0 ;將結(jié)果傳回到;將結(jié)果傳回到 r0 中的子程序入口中的子程序入口 incr0 mov a,r4 ;傳回尾數(shù)的低字節(jié);傳回尾數(shù)的低字節(jié) mov r0,a decr0 mov a

41、,r3 ;傳回尾數(shù)的高字節(jié);傳回尾數(shù)的高字節(jié) mov r0,a decr0 mova,r2 ;取結(jié)果的階碼;取結(jié)果的階碼 movc,1fh ;取結(jié)果的數(shù)符;取結(jié)果的數(shù)符 movacc.7,c ;拼入階碼中;拼入階碼中 movr0,a clracc.7 ;不考慮數(shù)符;不考慮數(shù)符 clrov ;清除溢出標志;清除溢出標志 cjne a,#3fh,mv01 ;階碼是否上溢?;階碼是否上溢? setb ov ;設(shè)立溢出標志;設(shè)立溢出標志 mv01:mova,r0 ;取出帶數(shù)符的階碼;取出帶數(shù)符的階碼 ret mvr0:mova,r0 ;將;將 r0 傳送到第一工作區(qū)中的子程序傳送到第一工作區(qū)中的子程序

42、 mov c,acc.7 ;將數(shù)符保存在位;將數(shù)符保存在位 1fh 中中 mov 1fh,c mov c,acc.6 ;將階碼擴充為補碼;將階碼擴充為補碼 mov acc.7,c mov r2,a ;存放在;存放在 r2 中中 inc r0 mov a,r0 ;將尾數(shù)高字節(jié)存放在;將尾數(shù)高字節(jié)存放在 r3 中中 mov r3,a inc r0 mov a,r0 ;將尾數(shù)低字節(jié)存放在;將尾數(shù)低字節(jié)存放在 r4 中中 mov r4,a dec r0 ;恢復數(shù)據(jù)指針;恢復數(shù)據(jù)指針 dec r0 ret mvr1: mov a,r1 ;將將 r1 傳送到第二工作區(qū)中的子程序傳送到第二工作區(qū)中的子程序

43、mov c,acc.7 ;將數(shù)符保存在位;將數(shù)符保存在位 1eh 中中 mov 1eh,c mov c,acc.6 ;將階碼擴充為補碼;將階碼擴充為補碼 mov acc.7,c mov r5,a ;存放在;存放在 r5 中中 inc r1 mov a,r1 ;將尾數(shù)高字節(jié)存放在;將尾數(shù)高字節(jié)存放在 r6 中中 mov r6,a inc r1 mov a,r1 ;將尾數(shù)低字節(jié)存放在;將尾數(shù)低字節(jié)存放在 r7 中中 mov r7,a dec r1 ;恢復數(shù)據(jù)指針;恢復數(shù)據(jù)指針 dec r1 ret as1: mov a,r6 ;讀取第二操作數(shù)尾數(shù)高字節(jié);讀取第二操作數(shù)尾數(shù)高字節(jié) orl a,r7

44、jz as2 ;第二操作數(shù)為零,不必運算;第二操作數(shù)為零,不必運算 mov a,r3 ;讀取第一操作數(shù)尾數(shù)高字節(jié);讀取第一操作數(shù)尾數(shù)高字節(jié) orl a,r4 jnz eq mov a,r6 ;第一操作數(shù)為零,結(jié)果以第二;第一操作數(shù)為零,結(jié)果以第二 操操 作數(shù)為準作數(shù)為準 mov r3,a mov a,r7 movr4,a mov a,r5 mov r2,a mov c,1eh mov 1fh,c as2: ret eq: mov a,r2 ;對階,比較兩個操作數(shù)的階碼;對階,比較兩個操作數(shù)的階碼 xrl a,r5 jz as4 ;階碼相同,對階結(jié)束;階碼相同,對階結(jié)束 jb acc.7,eq3 ;階符互異;階符互異 mov a,r2 ;階符相同,比較大小;階符相同,比較大小 clr c subb a,r5 jc eq4 eq2: clrc

溫馨提示

  • 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

提交評論