




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第4 4章章 匯編語言程序設(shè)計匯編語言程序設(shè)計4. 1 概概 述述4. 2 簡單程序簡單程序4. 3 分支程序分支程序4. 4 循環(huán)程序循環(huán)程序4. 6 子程序的設(shè)計及調(diào)用子程序的設(shè)計及調(diào)用 4. 7 程序設(shè)計舉例程序設(shè)計舉例4. 5 查表程序查表程序下頁下頁 一、匯編語言和高級語言相比具有下列優(yōu)點:一、匯編語言和高級語言相比具有下列優(yōu)點:占用的內(nèi)存單元和占用的內(nèi)存單元和cpu資源少資源少執(zhí)行速度快執(zhí)行速度快有效的利用計算機的專有特性。有效的利用計算機的專有特性。適合實時控制適合實時控制上頁上頁下頁下頁回目錄回目錄 pc主機 打印機 鍵盤、顯示終端 仿真器 用戶系統(tǒng) rs-232c 通用編程
2、器 圖 單片機基本開發(fā)環(huán)境 二、匯編語言程序設(shè)計的步驟:二、匯編語言程序設(shè)計的步驟:建立數(shù)學(xué)模型建立數(shù)學(xué)模型確定算法確定算法制定流程圖制定流程圖確定數(shù)據(jù)結(jié)構(gòu)確定數(shù)據(jù)結(jié)構(gòu)寫出源程序?qū)懗鲈闯绦蛏蠙C調(diào)試上機調(diào)試三、匯編語言程序的結(jié)構(gòu)三、匯編語言程序的結(jié)構(gòu)定義有關(guān)變量字符名定義有關(guān)變量字符名定義程序的起始地址定義程序的起始地址程序主體程序主體匯編結(jié)束標(biāo)志匯編結(jié)束標(biāo)志上頁上頁下頁下頁回目錄回目錄開始開始問題定義問題定義軟件結(jié)構(gòu)設(shè)計軟件結(jié)構(gòu)設(shè)計建立數(shù)學(xué)模型建立數(shù)學(xué)模型畫出程序流程圖畫出程序流程圖編寫程序編寫程序匯匯 編編在線仿真調(diào)試在線仿真調(diào)試程序錯否?程序錯否?修改程序修改程序結(jié)結(jié) 束束 始始固化固化n
3、y圖圖10-8 10-8 單片機軟件研制過程單片機軟件研制過程軟件任務(wù)分析軟件任務(wù)分析1、軟件任務(wù)分析和硬件電路設(shè)計結(jié)合進(jìn)行、軟件任務(wù)分析和硬件電路設(shè)計結(jié)合進(jìn)行2、軟件任務(wù)分析:、軟件任務(wù)分析: 執(zhí)行軟件執(zhí)行軟件: 監(jiān)控軟件監(jiān)控軟件:單片機應(yīng)用系統(tǒng)程序設(shè)計是在系統(tǒng)裸機條件下開單片機應(yīng)用系統(tǒng)程序設(shè)計是在系統(tǒng)裸機條件下開發(fā)的,而且隨應(yīng)用系統(tǒng)的不同而不同。發(fā)的,而且隨應(yīng)用系統(tǒng)的不同而不同。完成各種實質(zhì)性功能,如測量、計算、完成各種實質(zhì)性功能,如測量、計算、顯示、打印、輸出控制、通訊等;設(shè)計顯示、打印、輸出控制、通訊等;設(shè)計偏重算法效率。進(jìn)行功能定義、接口定偏重算法效率。進(jìn)行功能定義、接口定義、數(shù)據(jù)結(jié)
4、構(gòu)、數(shù)據(jù)類型等定義義、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型等定義 。專門用來協(xié)調(diào)各執(zhí)行模塊和操作者的關(guān)專門用來協(xié)調(diào)各執(zhí)行模塊和操作者的關(guān)系。著眼全局,邏輯嚴(yán)密。根據(jù)系統(tǒng)功系。著眼全局,邏輯嚴(yán)密。根據(jù)系統(tǒng)功能和鍵盤設(shè)置選擇監(jiān)控程序結(jié)構(gòu)。能和鍵盤設(shè)置選擇監(jiān)控程序結(jié)構(gòu)。數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)規(guī)劃數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)規(guī)劃數(shù)據(jù)類型:數(shù)據(jù)類型:邏輯型邏輯型數(shù)值型:數(shù)值型: 定點型定點型 浮點型浮點型數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)存放格式問題。數(shù)據(jù)存放格式問題。大多采用線性結(jié)構(gòu)。大多采用線性結(jié)構(gòu)。資源劃分資源劃分系統(tǒng)資源主要包括系統(tǒng)資源主要包括rom、ram、t/c、中斷源等。、中斷源等。主要工作是進(jìn)行主要工作是進(jìn)行ram資源的分配。資
5、源的分配。 片外片外ram:容量大,存放批量大的數(shù)據(jù)。:容量大,存放批量大的數(shù)據(jù)。 片內(nèi)片內(nèi)ram:認(rèn)真考慮:認(rèn)真考慮。00h1fh:工作積存器區(qū)。主程序用:工作積存器區(qū)。主程序用0區(qū),中斷、子程序用區(qū),中斷、子程序用1區(qū)、區(qū)、2區(qū)、區(qū)、3區(qū)。區(qū)。20h2fh:位尋址區(qū),存放各種軟件標(biāo):位尋址區(qū),存放各種軟件標(biāo)志、邏輯變量、位輸入信息、位輸出信息志、邏輯變量、位輸入信息、位輸出信息副本、狀態(tài)變量、邏輯運算中間結(jié)果等。副本、狀態(tài)變量、邏輯運算中間結(jié)果等。保留保留12個字節(jié)備用,剩下作其它用途。個字節(jié)備用,剩下作其它用途。30h7fh(30hffh):堆??臻g、數(shù):堆??臻g、數(shù)據(jù)緩沖區(qū)、各種參數(shù)、
6、指針、中間結(jié)果等。據(jù)緩沖區(qū)、各種參數(shù)、指針、中間結(jié)果等。列出列出ram資資源詳細(xì)源詳細(xì)分配清分配清單,作單,作為編程為編程依據(jù)。依據(jù)。;字節(jié)定義區(qū);字節(jié)定義區(qū)x equ30hy equ31hz equ32h ;40h4fh,沒有使用,沒有使用 siobuf equ 50h ;50h5fh, 串行通信緩沖區(qū)串行通信緩沖區(qū)16字節(jié)字節(jié) ;0e0h0ffh 32字節(jié)堆棧空間字節(jié)堆??臻g;位變量、位標(biāo)志變量定義;位變量、位標(biāo)志變量定義timout bit 00hover bit01hkeyf bit02h編程及調(diào)試編程及調(diào)試軟件設(shè)計方法軟件設(shè)計方法:自上而下自上而下自下而上自下而上基本過程:基本過程:
7、用編輯軟件編輯源程序、編譯軟件生成目標(biāo)代碼、程序用編輯軟件編輯源程序、編譯軟件生成目標(biāo)代碼、程序測試、仿真運行、代碼固化、樣機試用、產(chǎn)品定型測試、仿真運行、代碼固化、樣機試用、產(chǎn)品定型磨刀不誤砍柴功磨刀不誤砍柴功:前期調(diào)研細(xì)致、軟硬件論證充分、指標(biāo)吃準(zhǔn)、數(shù)據(jù)格式前期調(diào)研細(xì)致、軟硬件論證充分、指標(biāo)吃準(zhǔn)、數(shù)據(jù)格式定好、模塊功能和接口條件落實、操作規(guī)范要和用戶談定好、模塊功能和接口條件落實、操作規(guī)范要和用戶談妥、最后才開始設(shè)計程序設(shè)計、焊妥、最后才開始設(shè)計程序設(shè)計、焊pcb板、調(diào)試樣機。板、調(diào)試樣機。mcs-51單片機匯編程序一般格式內(nèi)存變量定義org 0000hljmp main中斷向量地址區(qū) o
8、rg 0030hmain:mov sp,#xxh;設(shè)置堆棧cpu資源和內(nèi)部變量初始化外部擴展功能部件初始化監(jiān)控主程序(死循環(huán)程序)子程序區(qū)中斷服務(wù)子程序區(qū)項表區(qū)(db xxh,xxh,end例例1:內(nèi)部內(nèi)部ram從從data1單元有一數(shù)據(jù)塊,存放若干無符號數(shù),單元有一數(shù)據(jù)塊,存放若干無符號數(shù), 第一單元為數(shù)據(jù)塊長度,求這些無符號數(shù)之和。第一單元為數(shù)據(jù)塊長度,求這些無符號數(shù)之和。; 首址送首址送r0 ;長度送;長度送r1;檢查長度是否為零;檢查長度是否為零;為零則結(jié)束;為零則結(jié)束;不為零則開始運算;不為零則開始運算;加一個數(shù);加一個數(shù);長度減;長度減1不為零則轉(zhuǎn)移不為零則轉(zhuǎn)移;存和;存和起始地址
9、起始地址程序主體程序主體匯編結(jié)束標(biāo)志匯編結(jié)束標(biāo)志標(biāo)號標(biāo)號注釋注釋上頁上頁下頁下頁回目錄回目錄mov r1, data1 cjne r1, #0 , nextorg 0000h 0000h start:mov r0,#data1here: sjmp $ next: clr aloop: inc r0 add a,r0 djne r1, loop mov sum , a sjmp heredata1 data 20hsum data 1fh end 上頁上頁下頁下頁回目錄回目錄四、評價程序質(zhì)量的標(biāo)準(zhǔn):四、評價程序質(zhì)量的標(biāo)準(zhǔn): 程序的執(zhí)行時間程序的執(zhí)行時間 程序所占用的內(nèi)存字節(jié)數(shù)目程序所占用的內(nèi)存字
10、節(jié)數(shù)目 程序的邏輯性、可讀性程序的邏輯性、可讀性 程序的兼容性、可擴展性程序的兼容性、可擴展性 程序的可靠性程序的可靠性時時 間間空空 間間概概念念將一個字節(jié)內(nèi)的壓縮將一個字節(jié)內(nèi)的壓縮bcd碼拆開并變成碼拆開并變成ascii碼,碼, 存入兩個存入兩個ram單元。單元。bcd碼放在內(nèi)部碼放在內(nèi)部ram的的20h, 轉(zhuǎn)換后高半字節(jié)放到轉(zhuǎn)換后高半字節(jié)放到21h,低字節(jié)放,低字節(jié)放22h。 bcdh bcdlbcdh bcdl0011001100110011romrom21h21h22h22h20h20hbcd碼碼09對應(yīng)的對應(yīng)的ascii碼為碼為30h39h轉(zhuǎn)換時,將轉(zhuǎn)換時,將20h中的中的bcd碼
11、拆開,碼拆開,高四位置為高四位置為“0011”即可。即可。bcdhbcdhbcdlbcdl上頁上頁下頁下頁回目錄回目錄ascii碼碼附錄附錄1:ascii碼字符表碼字符表0011 bcdh0011 bcdh0000 00000000 0000bcdh bcdlbcdh bcdlbcdlbcdl0000000000110011bcdh bcdlbcdh bcdlromrom21h21h22h22h20h20h00000000 bcdhbcdh00110011a上頁上頁下頁下頁回目錄回目錄org 0000hajmp mainorg 0030hmain:mov a,20hanl a,#0fhorl
12、a,#30hmov 22h,amov a,20hswap aanl a,#0fhorl a,#30hmov 21h,ahere:sjmp hereend采用除采用除10h取余法將兩個取余法將兩個bcd數(shù)拆開數(shù)拆開bcdh bcdlbcdh bcdla0001 00000001 00000000 bcdh0000 bcdh0000 bcdl0000 bcdlbabdiv ab上頁上頁下頁下頁回目錄回目錄orl , #30h ab0011 bcdh0011 bcdh0011 bcdl0011 bcdl mov a, 20h mov b,#10h div ab orl b, #30h mov 22h
13、, b orl a, #30h org 0000h mov 21h, a sjmp $ end;取取bcd碼至碼至a; 完成轉(zhuǎn)換完成轉(zhuǎn)換;存存ascii碼碼;完成轉(zhuǎn)換完成轉(zhuǎn)換;存存ascii碼碼;除除10h取余,使取余,使bcdh a 、bcdl bbcdh bcdlbcdh bcdla0001 00000001 00000000 bcdh0000 bcdh0000 bcdl0000 bcdlbabdiv ab0011001100110011bcdh bcdlbcdh bcdlromrom21h21h22h22h20h20h上頁上頁下頁下頁回目錄回目錄 以上程序用了以上程序用了7條指令,條指令
14、, 16個內(nèi)存字節(jié),個內(nèi)存字節(jié), 執(zhí)行時間為執(zhí)行時間為13個機器周期。個機器周期。雙字節(jié)求補雙字節(jié)求補設(shè):兩個字節(jié)原碼數(shù)存在設(shè):兩個字節(jié)原碼數(shù)存在r1、r0中中求補后結(jié)果,存在求補后結(jié)果,存在r3、r2中。中。求補采用求補采用“模模 - 原碼原碼”的方法的方法上頁上頁下頁下頁回目錄回目錄即用即用“0”去減去減“原碼原碼”r0r1原碼原碼-)r2r300h00h存在借位存在借位同樣的功能,有不同的編程同樣的功能,有不同的編程思路,出現(xiàn)不同的效果,影思路,出現(xiàn)不同的效果,影響程序的實時性及存儲空間響程序的實時性及存儲空間大小。大小。 clr c clr a subb a, r0 mov r2, a
15、 clr a subb a, r1 org 0000h mov r3 , a sjmp $ end ;cy 0; a 0;低字節(jié)求補低字節(jié)求補;送送r2;a清零清零;高字節(jié)求補高字節(jié)求補;送送r31111 11111111 1111r00000 00000000 00001111 11111111 1111r10000 00000000 0000r30000 00010000 0001r2cy 0 00000 00010000 0001 1 10000 00000000 0000 0 00000 00000000 0000a上頁上頁下頁下頁回目錄回目錄 將內(nèi)部將內(nèi)部ram的的20h單元中的單元
16、中的8位無符號二進(jìn)制數(shù),轉(zhuǎn)換為位無符號二進(jìn)制數(shù),轉(zhuǎn)換為3位位bcd碼,并將結(jié)果存放在碼,并將結(jié)果存放在bai(百位)、(百位)、shi(十位)、(十位)、ge(個位)單元中。(個位)單元中。例例4-4:編程思路:編程思路: 可將被轉(zhuǎn)換數(shù)除以可將被轉(zhuǎn)換數(shù)除以100,得百位數(shù);余數(shù)除以,得百位數(shù);余數(shù)除以10得十位數(shù);最后余數(shù)即為個位數(shù)。得十位數(shù);最后余數(shù)即為個位數(shù)。編程如下:編程如下:例如例如:255(十進(jìn)制)除以(十進(jìn)制)除以100,得,得 2(百位數(shù))(百位數(shù)) 余數(shù)除以余數(shù)除以10,得,得5(十位數(shù))(十位數(shù)) 最后余數(shù)最后余數(shù)5即為個位數(shù)即為個位數(shù)上頁上頁下頁下頁回目錄回目錄 bcd e
17、qu 20h bai equ 21h shi equ 22h ge equ 23h org 0000h ajmp main org 0030hmain: mov sp,#60h mov a,bcd mov b,#100 div ab mov bai,a mov a,b mov b,#10 div ab mov shi,a mov ge,b nop ljmp $ end ;除;除100,得百位,得百位;余數(shù)除;余數(shù)除10,得十,得十位、個位位、個位碼制轉(zhuǎn)換程序:碼制轉(zhuǎn)換程序:hex ascii碼;碼;bin ascii碼碼4.3 分支程序分支程序 當(dāng)執(zhí)行完某一條指令時,為完成某些功能,根據(jù)某當(dāng)執(zhí)
18、行完某一條指令時,為完成某些功能,根據(jù)某些條件判斷,使程序或順序執(zhí)行,或轉(zhuǎn)移到其它指令處些條件判斷,使程序或順序執(zhí)行,或轉(zhuǎn)移到其它指令處執(zhí)行,這就是分支程序。執(zhí)行,這就是分支程序。這是一個這是一個簡單分支程序簡單分支程序,可以使兩數(shù)相減,若,可以使兩數(shù)相減,若cy=1,則被減數(shù)小于減數(shù)。用則被減數(shù)小于減數(shù)。用jc指令進(jìn)行判斷。指令進(jìn)行判斷。 設(shè)內(nèi)部設(shè)內(nèi)部ram30h,31h存放兩個無符號數(shù),試比較存放兩個無符號數(shù),試比較 兩數(shù)的大小,較小的數(shù)存入兩數(shù)的大小,較小的數(shù)存入30h單元,較大的數(shù)單元,較大的數(shù) 存入存入31h單元。單元。程序的流程圖如下:程序的流程圖如下:上頁上頁下頁下頁回目錄回目錄
19、;做減法比較兩數(shù)做減法比較兩數(shù)clr c mov a,30h subb a, 31h jc next mov a,30h xch a,31horg 0000h mov 30h,a next :nopsjmp $end;cy 0;若(若(30h)小,)小,則轉(zhuǎn)移則轉(zhuǎn)移;交換兩數(shù)交換兩數(shù)(30h)-(31h)cy=1?交換兩數(shù)交換兩數(shù)endstart y n流程圖:流程圖:上頁上頁下頁下頁回目錄回目錄多重分支程序舉例多重分支程序舉例:設(shè)片內(nèi):設(shè)片內(nèi)30h單元存放的是一元二次方程單元存放的是一元二次方程ax2+bx+c =0 根的判別式根的判別式= b2 4ac的值。的值。試根據(jù)試根據(jù)30h單元的值
20、,編寫程序,判斷方程根的三種情況,單元的值,編寫程序,判斷方程根的三種情況,存入片內(nèi)存入片內(nèi)31h內(nèi)。內(nèi)。在在31h中存放中存放“0”代表無實根,代表無實根, 存放存放“1”代表有相同的實根,代表有相同的實根, 存放存放“2”代表兩個不同的實根。代表兩個不同的實根。為有符號數(shù),有三種情況,即小于零,等于零、大于為有符號數(shù),有三種情況,即小于零,等于零、大于零??梢杂脙蓚€條件轉(zhuǎn)移指令來判斷,零??梢杂脙蓚€條件轉(zhuǎn)移指令來判斷, 首先判斷符號位,用指令首先判斷符號位,用指令jnb acc.7, rel判斷,判斷, 若若acc.7 = 1,則一定為負(fù)數(shù);此時,則一定為負(fù)數(shù);此時0 若若acc.7 =
21、0,則,則0。此時再用指令。此時再用指令jnz rel 判斷判斷 若若0,則,則 0,否則,否則= 0上頁上頁下頁下頁回目錄回目錄0= 0 0上頁上頁下頁下頁回目錄回目錄流程圖:流程圖:aacc.7=0?endstart n y(a)= 0?31h031h2 y n31h1 0= 0 0程序:程序: org 0000hstart:mov a,30hjnb acc.7,yesmov 31h,#0sjmp finishyes: jnz towmov 31h,#1sjmp finishtow: mov 31h,#2finish:sjmp $end;值送值送a; 0 轉(zhuǎn)轉(zhuǎn)yes; 0轉(zhuǎn)轉(zhuǎn) tow;有兩
22、個不同實根有兩個不同實根上頁上頁下頁下頁回目錄回目錄4.3.3 n路分支程序路分支程序根據(jù)前面程序運行結(jié)果,可以有根據(jù)前面程序運行結(jié)果,可以有n種選擇,并轉(zhuǎn)向其種選擇,并轉(zhuǎn)向其中任一處程序。中任一處程序。例例4-10 128路分支程序:根據(jù)路分支程序:根據(jù)r3值轉(zhuǎn)向值轉(zhuǎn)向128個目的地址。個目的地址。編程方法:編程方法:順序程序順序程序 mov a,r3 cjne a,#00h,fz1 ajmp fz00fz1: cjne a,#01h,fz2 ajmp fz01 fz2: cjne a,#02h,fz3 ajmp fz02fz3: . 煩瑣,程序太長。煩瑣,程序太長。如作如作10000個分支
23、個分支程序程序.使用使用 jmp a+dptr指令實現(xiàn)指令實現(xiàn):jmp128:mov a,r3clr csubb a,#128jnc errormov a ,r3mov b,#3mul abmov dptr,#prgtaladd a,dplmov dpl,amov a,dphaddc a,bmov dph,aclrajmp a+dptrprgtal:ljmp rout00ljmp rout01.ljmp rout127;入口條件檢查入口條件檢查 ;分支跳轉(zhuǎn)分支跳轉(zhuǎn);ljmp指令占指令占3字節(jié)字節(jié)例例4-10:128分支程序分支程序jmp256jmp256:low128low128:prgtbl
24、prgtbl:movmovmovmovclrclrrlcrlcjncjncincincmovmovincincmovcmovcpushpushmovmovmovcmovcpushpushretretdwdwdwdw a a,r3r3dptrdptr,#prgtbl#prgtblc ca alow128low128dphdphtemptemp,a aa aa a,a+dptra+dptraccacca a,temptempa a,a+dptra+dptraccaccrout00rout00rout01rout01;??;取n n值值;dptrdptr指向分支地址表首址指向分支地址表首址;( (a
25、a) ) 2 2;是前;是前128128個分支程序,則轉(zhuǎn)個分支程序,則轉(zhuǎn)移移;否基址加;否基址加256256;暫存;暫存a a;指向地址低;指向地址低8 8位位;查表,讀分支地址低;查表,讀分支地址低8 8位位;地址低;地址低8 8位入棧位入棧;恢復(fù);恢復(fù)a a,指向地址高,指向地址高8 8位位;查表,讀分支地址高;查表,讀分支地址高8 8位位;地址高;地址高8 8位入棧位入棧;分支地址彈入;分支地址彈入pcpc實現(xiàn)轉(zhuǎn)移實現(xiàn)轉(zhuǎn)移; 256256個分支程序首地址個分支程序首地址; 占用占用512512個單元個單元例例4-11:256分支程序分支程序分支程序應(yīng)用場所:分支程序應(yīng)用場所:1、鍵盤按鍵
26、處理程序、鍵盤按鍵處理程序 根據(jù)所按功能鍵轉(zhuǎn)到相應(yīng)的功能子程序根據(jù)所按功能鍵轉(zhuǎn)到相應(yīng)的功能子程序2、通信協(xié)議處理程序、通信協(xié)議處理程序例:某鍵盤如下:例:某鍵盤如下:通通信信編號編號設(shè)置設(shè)置采樣采樣時間時間設(shè)置設(shè)置 + -確確認(rèn)認(rèn) mov a,b clrc subb a,#3 jc foun retfoun:mov a,b rl a add a,b mov dptr,#keyf jmp a+dptrkeyf:ljmp tongxin ljmp bianhao ljmp caiyang;鍵編號鍵編號4.4 循環(huán)程序循環(huán)程序循環(huán)程序:一些有規(guī)可循而又反復(fù)處理的問題循環(huán)程序:一些有規(guī)可循而又反復(fù)處理
27、的問題利用比較轉(zhuǎn)移指令利用比較轉(zhuǎn)移指令cjne、減、減1不為不為“0”轉(zhuǎn)移指令轉(zhuǎn)移指令djnz等實現(xiàn)等實現(xiàn)例例4-13:在內(nèi)部在內(nèi)部ram 30h4fh 連續(xù)連續(xù)32個單元中存放了個單元中存放了 單字節(jié)無符號數(shù),求單字節(jié)無符號數(shù),求32個無符號數(shù)之和,個無符號數(shù)之和, 并存入內(nèi)部并存入內(nèi)部ram 51h,50h中。中。編程編程思路思路:這是重復(fù)相加問題,這是重復(fù)相加問題,要設(shè)置一些工作單元要設(shè)置一些工作單元 設(shè):設(shè):r0 做加數(shù)地址指針,做加數(shù)地址指針,r7 做循環(huán)次數(shù)計數(shù)器,做循環(huán)次數(shù)計數(shù)器,r3 做和數(shù)的高字節(jié)寄存器。做和數(shù)的高字節(jié)寄存器。a 做和數(shù)的低字節(jié)寄存器做和數(shù)的低字節(jié)寄存器程序的
28、流程圖如下:程序的流程圖如下:上頁上頁下頁下頁回目錄回目錄地址指針地址指針循環(huán)次數(shù)計數(shù)器循環(huán)次數(shù)計數(shù)器 流程圖:流程圖:31r7 #0r3(30h)a #31hr0cy=0?endstart (r7)-1=0? 51h(r3)50h (a) y n(a)+(r0)a(r0+1)r0(r3)+1r3上頁上頁下頁下頁回目錄回目錄ny 程序:程序:;r7作循環(huán)次數(shù)計數(shù)器作循環(huán)次數(shù)計數(shù)器;r3作和數(shù)高字節(jié)寄存器作和數(shù)高字節(jié)寄存器;取被加數(shù)取被加數(shù);r0作加數(shù)地址指針作加數(shù)地址指針;cy=0,和,和256,則轉(zhuǎn)則轉(zhuǎn);作加法作加法;cy=1,加到高字節(jié),加到高字節(jié);修改修改r0指針指針;未完,重復(fù)加未完,
29、重復(fù)加;存和數(shù)存和數(shù)初始化部分初始化部分循環(huán)體部分循環(huán)體部分結(jié)束部分結(jié)束部分 org 0000hstart:mov r7,#31mov r3,#0mov a,30hmov r0,#31hloop:add a, r0jnc nextinc r3next :inc r0djnz r7,loopmov 51h,r3mov 50h,asjmp $end上頁上頁下頁下頁回目錄回目錄循環(huán)執(zhí)行循環(huán)執(zhí)行直到直到r7=0循環(huán)循環(huán)控制控制例例4-14:從從外部外部ram block單元開始有一無符號數(shù)數(shù)據(jù)塊,單元開始有一無符號數(shù)數(shù)據(jù)塊,數(shù)據(jù)塊長度存入數(shù)據(jù)塊長度存入len單元,單元,求出其中最大數(shù)存入求出其中最大數(shù)
30、存入max單元。單元。為了方便進(jìn)行比較,為了方便進(jìn)行比較,我們使用我們使用cy標(biāo)志來判斷兩數(shù)的大小,標(biāo)志來判斷兩數(shù)的大小,使用使用b寄存器作比較與交換的寄存器,寄存器作比較與交換的寄存器,使用使用dptr作外部作外部ram地址指針地址指針。解:解:這是一個基本搜索問題這是一個基本搜索問題,采用兩兩比較法。取兩者較采用兩兩比較法。取兩者較 大的數(shù)再與下一個數(shù)進(jìn)行比較,若數(shù)據(jù)塊長度大的數(shù)再與下一個數(shù)進(jìn)行比較,若數(shù)據(jù)塊長度len=n則則應(yīng)比較應(yīng)比較n-1次,最后較大的數(shù)就是數(shù)據(jù)塊中的最大數(shù)。次,最后較大的數(shù)就是數(shù)據(jù)塊中的最大數(shù)。程序的流程圖如下:程序的流程圖如下:上頁上頁下頁下頁回目錄回目錄流程圖:
31、流程圖:dptr#block lenlen-1a(dptr)cy=0?endstart y nlen-1=0? max最大數(shù)最大數(shù) y ncy0 b(a) dptr+1 a(dptr) a(a)-(b)若(若(a)(b)則則a(b)+(a)上頁上頁下頁下頁回目錄回目錄a中中 的數(shù)較大的數(shù)較大較大數(shù)較大數(shù)交換至交換至a恢復(fù)恢復(fù)較大數(shù)較大數(shù)初始化初始化工作單元工作單元編程編程:;定義數(shù)據(jù)塊首址定義數(shù)據(jù)塊首址;定義最大數(shù)暫存單元定義最大數(shù)暫存單元;定義長度計數(shù)單元定義長度計數(shù)單元上頁上頁下頁下頁回目錄回目錄fmax: mov dptr,#blockorg 0000hblock data 0100hm
32、ax data 31hlen data 30hsjmp next1next: add a, bnext1: djnz len, loopmov max, asjmp $end dec lenmovx a,dptrloop: clr cmov b, ainc dptrmovx a,dptrsubb a, bjnc nextmov a, b;數(shù)據(jù)塊首址送數(shù)據(jù)塊首址送dptr;長度減長度減1;取數(shù)至取數(shù)至a;0cy;修改指針修改指針;暫存于暫存于b;取下一數(shù)取下一數(shù);大者送大者送a;若(若(a)(b)則恢復(fù))則恢復(fù)a;未完繼續(xù)比較未完繼續(xù)比較;存最大數(shù)存最大數(shù);*若用若用ret指令結(jié)尾則指令結(jié)尾則
33、該程序可作子程序調(diào)用該程序可作子程序調(diào)用;作減法比較作減法比較ret例例4-15:從外部從外部ram block單元開始有一數(shù)據(jù)塊,單元開始有一數(shù)據(jù)塊, 數(shù)據(jù)塊長度存入數(shù)據(jù)塊長度存入len單元,單元,試統(tǒng)計其中試統(tǒng)計其中正數(shù)正數(shù)、負(fù)數(shù)負(fù)數(shù)和和零零的個數(shù)的個數(shù),分別存入分別存入pcount、mcount、zcount單元。單元。解:解:這是一個多重分支的單循環(huán)問題。數(shù)據(jù)塊中是帶符號數(shù)這是一個多重分支的單循環(huán)問題。數(shù)據(jù)塊中是帶符號數(shù)先用先用jb acc.7,rel 指令判斷符號位。指令判斷符號位。程序的流程圖如下:程序的流程圖如下:若若acc.7=1,則該數(shù)一定是負(fù)數(shù),則該數(shù)一定是負(fù)數(shù),mcoun
34、t單元加單元加1;若若acc.7=0,則該數(shù)可能是正數(shù),也可能是零;,則該數(shù)可能是正數(shù),也可能是零;用用jnz rel 判斷判斷a是否為零是否為零若若a0,則一定是正數(shù),則一定是正數(shù),pcount單元加單元加1;若既不為正也不為負(fù),則一定是零,若既不為正也不為負(fù),則一定是零,zcount單元加單元加1;上頁上頁下頁下頁回目錄回目錄流程圖:流程圖:dptr#block pcount0mcount0 zcount0acc.7=0?endstart y n(a)=0? dptr+1 y n a(dptr)zcount+1mcount+1len-1=0?pcount+1 y n上頁上頁下頁下頁回目錄回
35、目錄程序:程序:org 0200hblock data 2000hlen data 30hpcount data 31hmcount data 32hzcount data 33h;定義數(shù)據(jù)塊首址定義數(shù)據(jù)塊首址;定義長度計數(shù)單元定義長度計數(shù)單元;定義正計數(shù)單元定義正計數(shù)單元;定義負(fù)計數(shù)單元定義負(fù)計數(shù)單元;定義零計數(shù)單元定義零計數(shù)單元上頁上頁下頁下頁回目錄回目錄;數(shù)據(jù)塊首址送數(shù)據(jù)塊首址送dptr;計數(shù)單元清零計數(shù)單元清零;若若acc.7=1 轉(zhuǎn)負(fù)計數(shù)轉(zhuǎn)負(fù)計數(shù);取數(shù)取數(shù);若(若(a)0,轉(zhuǎn)正計數(shù),轉(zhuǎn)正計數(shù);若(若(a)=0,則零的個數(shù)加,則零的個數(shù)加1;負(fù)計數(shù)單元加負(fù)計數(shù)單元加1;正計數(shù)單元加正計
36、數(shù)單元加1;修正指針修正指針;未完繼續(xù)未完繼續(xù)next: inc dptr djnz len,loopsjmp $endstart:mov dptr,#block mov pcount,#0loop: movx a,dptrjb acc.7,mconjnz pconinc zcountajmp nextmcon: inc mcount mov mcount,#0 mov zcount,#0ajmp nextpcon:inc pcount上頁上頁下頁下頁回目錄回目錄4.5 查表程序查表程序上頁上頁下頁下頁回目錄回目錄對于復(fù)雜參數(shù)的計算如對于復(fù)雜參數(shù)的計算如:非線性參數(shù)非線性參數(shù)對數(shù)、指數(shù)、三角函
37、數(shù)對數(shù)、指數(shù)、三角函數(shù)微分、積分等微分、積分等用匯編編程十分困難用匯編編程十分困難甚至無法建立數(shù)學(xué)模型甚至無法建立數(shù)學(xué)模型用用查表查表的方法簡單容易的方法簡單容易查表查表:把事先計算或測得的數(shù)據(jù)按一定順序編制:把事先計算或測得的數(shù)據(jù)按一定順序編制成表格,存放在程序存儲器中。查表程序的任務(wù)成表格,存放在程序存儲器中。查表程序的任務(wù)就是根據(jù)被測數(shù)據(jù),查出最終所需要的結(jié)果。就是根據(jù)被測數(shù)據(jù),查出最終所需要的結(jié)果。例例4-20:一個十六進(jìn)制數(shù)放在一個十六進(jìn)制數(shù)放在hex單元的低四位單元的低四位, 將其轉(zhuǎn)換成將其轉(zhuǎn)換成ascii碼碼 查表程序:查表程序:編程編程思路思路十六進(jìn)制十六進(jìn)制 09 的的asc
38、ii碼為碼為 30h39h, af 的的ascii碼為碼為 41h46h, 查表指令:查表指令: movc a,a+dptrmovc a,a+pc表格定義:用偽指令表格定義:用偽指令 db 或或 dw 把表格的數(shù)據(jù)存把表格的數(shù)據(jù)存入入rom上頁上頁下頁下頁回目錄回目錄來獲得數(shù)據(jù)來獲得數(shù)據(jù)ascii碼表格的首址為碼表格的首址為asciitab不連續(xù)的不連續(xù)的asctab:db 30h,31h,32h,33hdb 34h,35h,36h,37hdb 38h,39h,41h,42hdb 43h,44h,45h,46h end上頁上頁下頁下頁回目錄回目錄編程編程1: 0 1 2 3 4 5 6 7 8
39、 9 a b c d e fajmp $ org 0000hhex equ 30hhexasc: mov a,hexmov dptr,#asctabmovc a,a+dptrmov hex,aanl a,#0fh編程編程2: org 0000hhex equ 30hhexasc: mov a,hexanl a,#0fhadd a,movc a,a+pcmov hex,aajmp $asctab:db 30h,31h,32h,33hdb 34h,35h,36h,37hdb 38h,39h,41h,42hdb 43h,44h,45h,46hend;變址調(diào)整變址調(diào)整;2字節(jié)字節(jié);2字節(jié)字節(jié)pcpc#
40、4上頁上頁下頁下頁回目錄回目錄;變址調(diào)整變址調(diào)整4.6 子程序的設(shè)計及調(diào)用子程序的設(shè)計及調(diào)用一、子程序的概念一、子程序的概念把能完成某種基本操作并具有相同操作的程序段單獨把能完成某種基本操作并具有相同操作的程序段單獨 編成子程序。編成子程序。如:函數(shù)、如:函數(shù)、 運算、代碼轉(zhuǎn)換、延時等運算、代碼轉(zhuǎn)換、延時等子程序調(diào)用子程序調(diào)用 acall、lcall子程序返回子程序返回 ret使用使用子程子程序的序的優(yōu)點優(yōu)點 不必重復(fù)書寫同樣的程序,提高編程效率不必重復(fù)書寫同樣的程序,提高編程效率 程序的邏輯結(jié)構(gòu)簡單,便于閱讀程序的邏輯結(jié)構(gòu)簡單,便于閱讀 縮短了源程序和目標(biāo)程序的長度,節(jié)省了存儲器空間縮短了源
41、程序和目標(biāo)程序的長度,節(jié)省了存儲器空間 使程序模塊化、通用化、便于交流共享資源使程序模塊化、通用化、便于交流共享資源 便于按某種功能調(diào)試便于按某種功能調(diào)試上頁上頁下頁下頁回目錄回目錄操作操作二、調(diào)用子程序的要點二、調(diào)用子程序的要點 子程序的子程序的名字:名字:子程序開頭的標(biāo)號段,也是其子程序開頭的標(biāo)號段,也是其入口地址入口地址, 供主程序調(diào)用。供主程序調(diào)用。例如:調(diào)用延時子程序例如:調(diào)用延時子程序主程序指令:主程序指令: lcall delay 子程序返回子程序返回: 結(jié)尾必須使用一條從子程序返回指結(jié)尾必須使用一條從子程序返回指令令ret,它具有恢復(fù)斷點的功能,它具有恢復(fù)斷點的功能retret
42、; pc15pc158 (sp) ,8 (sp) ,(spsp) (spsp) -1-1; pc7pc70 (sp) ,0 (sp) ,(spsp) (spsp) -1-1主程序主程序lcall斷點斷點子程序子程序ret1、子程序的結(jié)構(gòu)、子程序的結(jié)構(gòu)上頁上頁下頁下頁回目錄回目錄子程序:子程序: delay:mov r7,#100djnz r7,$ret子程序名稱子程序名稱2、參數(shù)傳遞、參數(shù)傳遞子程序入口條件:子程序入口條件: 在調(diào)用一個子程序時,主程序應(yīng)先把有關(guān)參數(shù)放到在調(diào)用一個子程序時,主程序應(yīng)先把有關(guān)參數(shù)放到某些約定的位置,子程序運行時,可以從約定的位置得某些約定的位置,子程序運行時,可以
43、從約定的位置得到有關(guān)參數(shù)。到有關(guān)參數(shù)。子程序出口條件:子程序出口條件:子程序結(jié)束前,也應(yīng)把處理結(jié)果送到約定位置子程序結(jié)束前,也應(yīng)把處理結(jié)果送到約定位置參數(shù)傳遞的方法:參數(shù)傳遞的方法: 子程序無須傳遞參數(shù)子程序無須傳遞參數(shù) 這類子程序中所需要的參數(shù)是子程序賦予,這類子程序中所需要的參數(shù)是子程序賦予,不需要主程序給出不需要主程序給出上頁上頁下頁下頁回目錄回目錄主程序:主程序:.lcall dely.子程序:子程序:不需主程序提供入口參數(shù),從子程序開始到子程序返回,不需主程序提供入口參數(shù),從子程序開始到子程序返回,大約為大約為20ms例例4-23 調(diào)用延時子程序調(diào)用延時子程序delydely: mo
44、v r7, #100dly0: mov r6, #98nopdly1: djnz r6, dly1djnz r7, dly0ret子程序開始的標(biāo)號子程序開始的標(biāo)號子程序返回指令子程序返回指令調(diào)用子程序調(diào)用子程序上頁上頁下頁下頁回目錄回目錄982=196s1s1s設(shè):主頻為設(shè):主頻為12mhz2s(196+2+2) 100 +3 =20003s = 20.003ms2s1s+3 用用累加器累加器和和工作寄存器工作寄存器傳遞參數(shù)傳遞參數(shù)入口參數(shù):入口參數(shù):放在累加器放在累加器a和工作寄存器中和工作寄存器中r0 r7中中出口參數(shù):出口參數(shù):放在累加器放在累加器a和工作寄存器中和工作寄存器中r0 r7
45、中中例例4-24 雙字節(jié)求補子程序雙字節(jié)求補子程序cpld解:解:采用采用“取反加取反加1”的方法,十六位數(shù)取反加的方法,十六位數(shù)取反加1, 不僅低字節(jié)要加不僅低字節(jié)要加1,高字節(jié)要加低字節(jié)的進(jìn)位。,高字節(jié)要加低字節(jié)的進(jìn)位。 故采用故采用add指令,不采用指令,不采用inc指令。指令。 inc指令不影響指令不影響cy位位上頁上頁下頁下頁回目錄回目錄入口參數(shù):(入口參數(shù):(r7r6)=16位數(shù)位數(shù)出口參數(shù):(出口參數(shù):(r7r6)=求補后的求補后的16位數(shù)位數(shù) cpld: mov a,r6cpl a add a,#1 mov r6,a mov a,r7 cpl a addc a,#0 mov r
46、7,a ret上頁上頁下頁下頁回目錄回目錄cy+ cy r0 r0 r0 通過操作數(shù)通過操作數(shù)地址地址傳遞參數(shù)傳遞參數(shù)入口參數(shù):(入口參數(shù):(r0)=求補數(shù)低字節(jié)指針求補數(shù)低字節(jié)指針,(r7)=n-1出口參數(shù):(出口參數(shù):(r0)=求補后高字節(jié)指針求補后高字節(jié)指針例例4-25 n字節(jié)求補子程序字節(jié)求補子程序cplncpln: mov a,r0cpl aadd a,#1mov r0,amov a,r0cpl aaddc a,#0mov r0,aretnext: inc r0djnz r7, next上頁上頁下頁下頁回目錄回目錄內(nèi)部內(nèi)部ram字節(jié)字節(jié)1字節(jié)字節(jié)2字節(jié)字節(jié)3字節(jié)字節(jié)n r0 r0地址
47、 通過通過堆棧堆棧傳遞參數(shù)傳遞參數(shù)例例4-26 在在hex單元存放兩個十六進(jìn)制數(shù),將它們分別單元存放兩個十六進(jìn)制數(shù),將它們分別 轉(zhuǎn)換成轉(zhuǎn)換成ascii碼并存入碼并存入asc和和asc+1單元單元解:解: 由于要進(jìn)行兩次轉(zhuǎn)換,故可調(diào)用查表子程序完成由于要進(jìn)行兩次轉(zhuǎn)換,故可調(diào)用查表子程序完成main:.push hex lcall hascpop ascmov a, hexswap apush acclcall hascpop asc+1.;轉(zhuǎn)子轉(zhuǎn)子;壓入壓入 被轉(zhuǎn)換數(shù)被轉(zhuǎn)換數(shù);asclasc;取被轉(zhuǎn)換數(shù)取被轉(zhuǎn)換數(shù);處理高四位處理高四位;壓入壓入;轉(zhuǎn)子程序轉(zhuǎn)子程序;ascasc+1主程序主程序*p
48、ch*pcl hexspsp+1sp+2sp+3棧底棧底*pc 斷點地址斷點地址上頁上頁下頁下頁回目錄回目錄盡量少用盡量少用movc a,a+pc hasc: dec spdec sppop accanl a,#0fhadd a,#5push accinc spinc spretasctab: db 0 1 2 7 db 8 9 a f;彈出彈出;修改修改sp指向指向hex;屏蔽高四位屏蔽高四位;變址調(diào)整變址調(diào)整;查表查表;結(jié)果入棧結(jié)果入棧;修改修改sp指向斷點位置指向斷點位置;子程序子程序上頁上頁下頁下頁回目錄回目錄*pch*pcl hexspsp+1sp+2sp+3棧底棧底ahexresu
49、ltresultsp+1sp+2sp+3pc hex spspspsp .push hex lcall hascpop ascmov a, hexswap apush acclcall hascpop asc+1.movc a,a+pchasc: dec spdec sppop accanl a,#0fhadd a,#5push accinc spinc spretasctab: db 0 1 2 7 db 8 9 a f60h61h62h63h64h hex *pcl *pchpc斷點斷點sp0000 hexl ascaascspspspsp主程序主程序子程序子程序上頁上頁下頁下頁回目錄回目
50、錄3、現(xiàn)場保護(hù)、現(xiàn)場保護(hù) 如果子程序使用的寄存器與主程序使用的寄存器如果子程序使用的寄存器與主程序使用的寄存器 有沖突,在轉(zhuǎn)入子程序前,特別是進(jìn)行中斷服務(wù)有沖突,在轉(zhuǎn)入子程序前,特別是進(jìn)行中斷服務(wù) 子程序時,要進(jìn)行現(xiàn)場保護(hù)。子程序時,要進(jìn)行現(xiàn)場保護(hù)。內(nèi)部內(nèi)部 ram 內(nèi)容,內(nèi)容, 各工作寄存器內(nèi)容,各工作寄存器內(nèi)容, 主程序正在使用主程序正在使用 累加器累加器 a 、b dptr psw 將要保護(hù)的單元將要保護(hù)的單元壓入堆棧壓入堆棧。 還可以用還可以用 rs1 rs0 來選擇其他通來選擇其他通 用寄存器組,以便保護(hù)主程序現(xiàn)場。用寄存器組,以便保護(hù)主程序現(xiàn)場。上頁上頁下頁下頁回目錄回目錄例如:某
51、子程序的現(xiàn)場保護(hù)例如:某子程序的現(xiàn)場保護(hù)bcdcb: push accpush pswpush dplpush dph.pop dphpop dplpop pswpop accret推入與彈出應(yīng)按照推入與彈出應(yīng)按照“先進(jìn)后出先進(jìn)后出”,或,或“后進(jìn)先出后進(jìn)先出”的順的順序序; 保護(hù)現(xiàn)場保護(hù)現(xiàn)場; 子程序功子程序功能語句能語句; 恢復(fù)現(xiàn)場恢復(fù)現(xiàn)場;上頁上頁下頁下頁回目錄回目錄三、子程序的調(diào)用及嵌套三、子程序的調(diào)用及嵌套1、子程序的調(diào)用、子程序的調(diào)用上頁上頁下頁下頁回目錄回目錄2、子程序的嵌套、子程序的嵌套 子程序中可調(diào)用其他子程序子程序中可調(diào)用其他子程序匯編語言子程序,可否自己調(diào)用自己?匯編語言
52、子程序,可否自己調(diào)用自己?常見常見mcs-51子程序:子程序:1、算術(shù)運算子程序、算術(shù)運算子程序多字節(jié)多字節(jié)bcd碼加法、減法、求補、移位;雙字節(jié)碼加法、減法、求補、移位;雙字節(jié)二進(jìn)制無符號數(shù)乘法、平方、除法、開平方;平均值二進(jìn)制無符號數(shù)乘法、平方、除法、開平方;平均值2、代碼轉(zhuǎn)換子程序、代碼轉(zhuǎn)換子程序單字節(jié)單字節(jié)hex數(shù)轉(zhuǎn)雙字節(jié)數(shù)轉(zhuǎn)雙字節(jié)ascii碼、碼、ascii碼轉(zhuǎn)碼轉(zhuǎn)hex;單字節(jié)單字節(jié)hex數(shù)轉(zhuǎn)數(shù)轉(zhuǎn)bcd碼等碼等3、查找、查找單字節(jié)單字節(jié)hex無(有)符號數(shù)據(jù)塊極值;查表;排無(有)符號數(shù)據(jù)塊極值;查表;排序;序;4.7 程序設(shè)計舉例程序設(shè)計舉例 多字節(jié)無符號數(shù)減法子程序多字節(jié)無符號
53、數(shù)減法子程序nsub(r0)=被減數(shù)低字節(jié)指針(被減數(shù)低字節(jié)指針(r1)=減數(shù)低字節(jié)指針減數(shù)低字節(jié)指針(r7)= 字節(jié)數(shù)字節(jié)數(shù)n(r0)=差數(shù)高字節(jié)地址指針差數(shù)高字節(jié)地址指針的若被減數(shù)大于減數(shù),則差為正數(shù);若被減數(shù)小于的若被減數(shù)大于減數(shù),則差為正數(shù);若被減數(shù)小于 減數(shù),則差為補碼數(shù)(負(fù)數(shù)),且差數(shù)為減數(shù),則差為補碼數(shù)(負(fù)數(shù)),且差數(shù)為n字節(jié)字節(jié)上頁上頁下頁下頁回目錄回目錄流程圖:流程圖:0cy (r0)-(r1)-cy(r0)retnsub(r7)-1=0?修改地址指針修改地址指針(r0)+1r0,r1+1r1 nnsub: clr cloop: mov a,r0 mov r0, asubb
54、a, r1inc r0inc r1djnz r7, loopdec r0ret程序:程序:上頁上頁下頁下頁回目錄回目錄 雙字節(jié)無符號數(shù)快速乘法子程序雙字節(jié)無符號數(shù)快速乘法子程序muld(r7r6)= 被乘數(shù)被乘數(shù)ab(r5r4)= 乘數(shù)乘數(shù)cd(r0)= 有定義的內(nèi)部有定義的內(nèi)部ram地址地址(r0)= 乘積的高字節(jié)地址指針乘積的高字節(jié)地址指針于兩個雙字節(jié)無符號數(shù)相乘,用于兩個雙字節(jié)無符號數(shù)相乘,用8位乘法指令來完成位乘法指令來完成需要四次,每次的乘積為需要四次,每次的乘積為16位,會產(chǎn)生位,會產(chǎn)生4個部分積,共需個部分積,共需要要8個單元存放,然后再按個單元存放,然后再按“位權(quán)位權(quán)”相加,和
55、即為所求之相加,和即為所求之積。這樣所占存儲單元太多,應(yīng)該采用邊乘邊加的方法。積。這樣所占存儲單元太多,應(yīng)該采用邊乘邊加的方法。用用r3、r2、r1作暫存器或工作單元。作暫存器或工作單元。上頁上頁下頁下頁回目錄回目錄 r6 r7 r4 r5 編程思路與手乘法相似:編程思路與手乘法相似:被乘數(shù)被乘數(shù)乘數(shù)乘數(shù)上頁上頁下頁下頁回目錄回目錄 r6 r4 r7 r5 相乘過程相乘過程上頁上頁下頁下頁回目錄回目錄muld:mov a, r6mov b, r4mul abmov r0, amov r3, bmov a, r7mov b, r4mul abadd a, r3mov r3, amov a, ba
56、ddc a, #0mov r2, amov a, r6mov b, r5mul abadd a, r3 程序程序;bd;存積存積70, bdl(r0);adl+bdh;暫存,暫存,adl+bdhr3;ad; adha;bcl+adl+cy; adh+cya;bc;暫存,暫存, adh+cyr2;上頁上頁下頁下頁回目錄回目錄inc r0mov r0, amov r1, #0mov a,r2addc a, bmov r2, ajnc lastinc r1last: mov a, r7mov b, r5mul abadd a, r2inc r0mov r0, amov a, baddc a, r1i
57、nc r0mov r0, aret;用用r1記錄記錄cy;bch+adh+cy;存積存積158, bcl+ adl+bdh(r0+1);暫存,暫存, bch+adh+cyr2;cy=0, 則轉(zhuǎn)則轉(zhuǎn)last;r0+1;cy=1,則(則(r1)=1; ac; acl+bch+adh+cy ;(r0+3);r0+2; ach+cy ;存積存積2316, acl+bch+adh+cy (r0+2);存積存積3124, ach+cy (r0+3)上頁上頁下頁下頁回目錄回目錄 多字節(jié)十進(jìn)制加法子程序多字節(jié)十進(jìn)制加法子程序bcdadd(r0)= 被加數(shù)低字節(jié)指針(被加數(shù)低字節(jié)指針(r1)= 加數(shù)低字節(jié)指針加
58、數(shù)低字節(jié)指針(r7)= 字節(jié)數(shù)字節(jié)數(shù)n(r0)= 和數(shù)高字節(jié)地址指針和數(shù)高字節(jié)地址指針兩數(shù)相加,和數(shù)為兩數(shù)相加,和數(shù)為n+1字節(jié)。若字節(jié)。若cy=0,則(,則(n+1)字節(jié))字節(jié) 為為0;若;若cy=1,則(,則(n+1)字節(jié)為)字節(jié)為1上頁上頁下頁下頁回目錄回目錄bcdadd: clr caddl: mov a, r0addc a, r1da amov r0, ainc r0inc r1djnz r7, addlclr amov acc.0, cmov r0, aret程序:程序:上頁上頁回目錄回目錄過過 “9” 補補 “6”cy 空調(diào)機制冷時,若排出的空氣溫度比吸入的空氣空調(diào)機制冷時,若排
59、出的空氣溫度比吸入的空氣 溫度低溫度低8則認(rèn)為工作正常,否則便認(rèn)為是故障,則認(rèn)為工作正常,否則便認(rèn)為是故障, 并設(shè)置故障標(biāo)志。并設(shè)置故障標(biāo)志。為了可靠的監(jiān)控空調(diào)機的工作情況,做兩次減法:為了可靠的監(jiān)控空調(diào)機的工作情況,做兩次減法:第一次(第一次(40h)-(41h),若),若cy=1 ,則肯定有故障;,則肯定有故障;第二次兩個溫度的差值減去第二次兩個溫度的差值減去8 ,若,若cy=1 ,則肯定,則肯定有故障有故障程序的流程圖如下:程序的流程圖如下:上頁上頁下頁下頁回目錄回目錄首先定義一些工作單元首先定義一些工作單元內(nèi)部內(nèi)部ram40h41h42h吸入溫度值吸入溫度值排出溫度值排出溫度值故障標(biāo)志
60、故障標(biāo)志a(40h)-(41h)cy=1?(a)-8endstart y ncy=1?42hffh42h0 y n流程圖:流程圖:上頁上頁下頁下頁回目錄回目錄故故 障障正常正常 org 1000hstart:mov a,40hclr csubb a,41hjc errormov 42h,#0jc errorsubb a,#8sjmp exiterror:mov 42h,#0ffhexit: sjmp $end程序:程序:;吸入溫度值送;吸入溫度值送a; 0 cy; a(40h)-(41h);cy=1,則故障,則故障;是則故障是則故障;溫度小于溫度小于8?;工作正常標(biāo)志工作正常標(biāo)志;轉(zhuǎn)出口轉(zhuǎn)出口
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公路護(hù)欄施工合同范本
- 中歐貿(mào)易合同范本
- ktv管理合作合同范本
- 充值優(yōu)惠合同范本
- 出國勞務(wù)正式合同范本
- 2024年濰坊市婦幼保健院招聘考試真題
- 農(nóng)莊菜地續(xù)租合同范本
- 出租聚氨酯地坪合同范本
- 公章外借合同范本
- 買種子合同范本
- 2025年中考英語時文閱讀 6篇有關(guān)電影哪吒2和 DeepSeek的英語閱讀(含答案)
- 修高速土方合同范例
- 2024年湖北省武漢市中考語文試卷
- 工程項目部安全生產(chǎn)治本攻堅三年行動實施方案
- 2024三農(nóng)新政策解讀
- HGE系列電梯安裝調(diào)試手冊(ELS05系統(tǒng)SW00004269,A.4 )
- 酒店前臺績效考核表
- 水利工程水庫混凝土防滲墻施工方案
- 九宮格數(shù)獨題目(打印版)
- 內(nèi)燃機基本知識
- 抹灰工程施工合同-
評論
0/150
提交評論