MCS-51單片機(jī)指令系統(tǒng)與匯編語言程序設(shè)計ppt課件_第1頁
MCS-51單片機(jī)指令系統(tǒng)與匯編語言程序設(shè)計ppt課件_第2頁
MCS-51單片機(jī)指令系統(tǒng)與匯編語言程序設(shè)計ppt課件_第3頁
MCS-51單片機(jī)指令系統(tǒng)與匯編語言程序設(shè)計ppt課件_第4頁
MCS-51單片機(jī)指令系統(tǒng)與匯編語言程序設(shè)計ppt課件_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2.3.5 2.3.5 位操作指令位操作指令 位操作布爾變量操作):操作數(shù)不是字節(jié),而是字節(jié)中的某位操作布爾變量操作):操作數(shù)不是字節(jié),而是字節(jié)中的某個位。每位的取值只能取個位。每位的取值只能取0或或1。 指令的尋址范圍:片內(nèi)指令的尋址范圍:片內(nèi)RAM位尋址區(qū)位尋址區(qū)20H2FH, SFR中中的的11個可位尋址特殊寄存器中的個可位尋址特殊寄存器中的83個可尋址位。個可尋址位。 特點(diǎn):以進(jìn)位標(biāo)志特點(diǎn):以進(jìn)位標(biāo)志Cy作為位累加器,可以實(shí)現(xiàn)布爾變量的傳作為位累加器,可以實(shí)現(xiàn)布爾變量的傳送、運(yùn)算和控制轉(zhuǎn)移等功能。送、運(yùn)算和控制轉(zhuǎn)移等功能。 指令中的位地址的表達(dá)方式:直接地址方式如指令中的位地址的表達(dá)方

2、式:直接地址方式如0AFH)、特)、特殊功能寄存器名殊功能寄存器名.位序號如位序號如PSW.3)、字節(jié)地址)、字節(jié)地址.位序號如位序號如0D0H.0)、位名稱方式如)、位名稱方式如F0和用戶定義名稱等幾種方式和用戶定義名稱等幾種方式。 docin/sundae_meng1. 位數(shù)據(jù)傳送指令位數(shù)據(jù)傳送指令2條)條)特點(diǎn):在可尋址位與位累加器特點(diǎn):在可尋址位與位累加器Cy之間進(jìn)行的。不能在兩個可尋之間進(jìn)行的。不能在兩個可尋址位間直接進(jìn)行傳送。址位間直接進(jìn)行傳送。 指令格式:指令格式:MOV C, bit ;(Cy)(bit) MOV bit, C ;(bit) (Cy) 例:例: 比較比較 MOV

3、 A, 20H ;片內(nèi)片內(nèi)RAM 20H單元內(nèi)容送單元內(nèi)容送A,傳送,傳送8位位二進(jìn)制數(shù)二進(jìn)制數(shù) MOV C, 20H ;位地址為位地址為20H的位送的位送C,傳送,傳送1位二進(jìn)位二進(jìn)制數(shù)制數(shù)P71 例例2.55 destdocin/sundae_meng2. 位邏輯操作指令位邏輯操作指令6條)條)n指令格式:操作碼指令格式:操作碼 C , n 其中:操作碼包括其中:操作碼包括ANL、ORL ; 包括包括bit、bit。n CPL ; dest 包括包括Cy、 bit。n功能:位邏輯操作指令用于位邏輯操作,還可用功能:位邏輯操作指令用于位邏輯操作,還可用于對組合邏輯電路的模擬。采用位操作指令進(jìn)

4、行于對組合邏輯電路的模擬。采用位操作指令進(jìn)行組合邏輯電路的設(shè)計比采用字節(jié)型邏輯指令節(jié)約組合邏輯電路的設(shè)計比采用字節(jié)型邏輯指令節(jié)約存儲空間,運(yùn)算操作十分方便。存儲空間,運(yùn)算操作十分方便。P71 例例2.56docin/sundae_meng3. 位狀態(tài)置位、清位狀態(tài)置位、清0控制指令控制指令4條)條) 指令格式:指令格式:CLR ; 0 SETB ; 1 其中:其中:包括包括Cy、 bit。4. 位條件控制轉(zhuǎn)移指令位條件控制轉(zhuǎn)移指令5條)條) 特點(diǎn):以位的狀態(tài)作為實(shí)現(xiàn)程序轉(zhuǎn)移的判斷條件。特點(diǎn):以位的狀態(tài)作為實(shí)現(xiàn)程序轉(zhuǎn)移的判斷條件。指令格式:指令格式:(1以進(jìn)位標(biāo)志位以進(jìn)位標(biāo)志位Cy內(nèi)容為條件的轉(zhuǎn)

5、移指令內(nèi)容為條件的轉(zhuǎn)移指令 J C r e l ; 假 設(shè)假 設(shè) ( C y ) = 1 , 則 轉(zhuǎn) 移, 則 轉(zhuǎn) 移(PC)(PC)+2+rel , 否則順序執(zhí)行否則順序執(zhí)行 J N C r e l ; 假 設(shè)假 設(shè) ( C y ) = 0 , 則 轉(zhuǎn) 移, 則 轉(zhuǎn) 移(PC)(PC)+2+rel , 否則順序執(zhí)行否則順序執(zhí)行docin/sundae_meng(2 2以位地址以位地址bitbit內(nèi)容為條件的轉(zhuǎn)移指令內(nèi)容為條件的轉(zhuǎn)移指令指令格式:指令格式:JB bit, rel ; JB bit, rel ; 假設(shè)假設(shè)(bit)=1(bit)=1,則轉(zhuǎn)移,則轉(zhuǎn)移(PC) (PC) (PC)+3

6、+rel(PC)+3+rel,否則順序執(zhí)行,否則順序執(zhí)行 JNB bit, rel ; JNB bit, rel ; 假設(shè)假設(shè)(bit)=0(bit)=0,則轉(zhuǎn)移,則轉(zhuǎn)移(PC) (PC) (PC)+3+rel(PC)+3+rel,否則順序執(zhí)行,否則順序執(zhí)行 JBC bit, rel ; JBC bit, rel ; 假設(shè)假設(shè)(bit)=1(bit)=1,則轉(zhuǎn)移,則轉(zhuǎn)移(PC) (PC) (PC)+3+rel(PC)+3+rel,且,且(bit )0(bit )0, 否則順序執(zhí)行否則順序執(zhí)行 docin/sundae_mengP73 例2.58 ORG 0100H MOV DPTR,#DATA

7、 MOV R0,#30H MOV R1,#40HLOOP: MOVX A,DPTR CJNE A,#0DH,LOOP1 SJMP $LOOP1:JB ACC.7,LOOP2 MOV R0,A INC R0 INC DPTR AJMP LOOPLOOP2: MOV R1,A INC R1 INC DPTR AJMP LOOP ENDdocin/sundae_meng2.4 匯編語言及程序設(shè)計匯編語言及程序設(shè)計 程序設(shè)計:就是編制計算機(jī)的程序,即應(yīng)用計算機(jī)所能識別的、程序設(shè)計:就是編制計算機(jī)的程序,即應(yīng)用計算機(jī)所能識別的、接受的語言把要解決的問題的步驟有序地描述出來。接受的語言把要解決的問題的步驟

8、有序地描述出來。 程序設(shè)計語言的種類:程序設(shè)計語言的種類:(1 1機(jī)器語言:機(jī)器語言是用二進(jìn)制代碼表示的計算機(jī)惟一能機(jī)器語言:機(jī)器語言是用二進(jìn)制代碼表示的計算機(jī)惟一能識別和執(zhí)行的最原始的程序設(shè)計語言。識別和執(zhí)行的最原始的程序設(shè)計語言。 (2 2匯編語言:利用指令助記符來描述的程序設(shè)計語言。匯編語言:利用指令助記符來描述的程序設(shè)計語言。(3 3高級語言:高級語言接近于人的自然語言,是面向過程而高級語言:高級語言接近于人的自然語言,是面向過程而獨(dú)立于機(jī)器的通用語言。獨(dú)立于機(jī)器的通用語言。匯編語言的指令類型:匯編語言的指令類型: MCS-51 MCS-51單片機(jī)匯編語言,包含兩類不同性質(zhì)的指令。單片

9、機(jī)匯編語言,包含兩類不同性質(zhì)的指令。(1 1指令:即指令系統(tǒng)中的指令。它們都是機(jī)器能夠執(zhí)行的指指令:即指令系統(tǒng)中的指令。它們都是機(jī)器能夠執(zhí)行的指令,每一條指令都有對應(yīng)的機(jī)器碼。令,每一條指令都有對應(yīng)的機(jī)器碼。(2 2偽指令:匯編時用于控制匯編的指令。它們都是機(jī)器不執(zhí)偽指令:匯編時用于控制匯編的指令。它們都是機(jī)器不執(zhí)行的指令,無機(jī)器碼。行的指令,無機(jī)器碼。docin/sundae_meng匯編語言的語句格式:匯編語言源程序是由匯編語句即指令匯編語言的語句格式:匯編語言源程序是由匯編語句即指令組成的。典型的匯編語句格式如下:組成的。典型的匯編語句格式如下: 標(biāo)號標(biāo)號: : 操作碼操作碼 操作數(shù)操作

10、數(shù) , ,操作數(shù)操作數(shù) ; ;注釋注釋 數(shù)據(jù)的表示方法:數(shù)據(jù)的表示方法:(1 1二進(jìn)制數(shù):由二進(jìn)制數(shù):由0 0、1 1組成,組成,“逢逢2 2進(jìn)進(jìn)1 1的數(shù)制。如:的數(shù)制。如:01011110B 01011110B (0 01 1 后綴:后綴:B/bB/b)(2 2十六進(jìn)制數(shù):便于讀寫記憶的二進(jìn)制數(shù)的簡寫形式。十六進(jìn)制數(shù):便于讀寫記憶的二進(jìn)制數(shù)的簡寫形式。 (0 09 9,A AF F 后綴:后綴:H/hH/h)(3 3十進(jìn)制數(shù):可用二進(jìn)制數(shù)表示也稱為十進(jìn)制數(shù):可用二進(jìn)制數(shù)表示也稱為BCDBCD碼,碼, 0 09 9表示表示為為:0000:00001001B 1001B ),也可用十進(jìn)制數(shù)表示

11、后綴),也可用十進(jìn)制數(shù)表示后綴:D/d:D/d或無后或無后綴)。綴)。docin/sundae_meng2.4.1 匯編語言程序設(shè)計的步驟匯編語言程序設(shè)計的步驟 匯編語言程序設(shè)計:根據(jù)任務(wù)要求,采用匯編語言編制程序的過程稱為匯編匯編語言程序設(shè)計:根據(jù)任務(wù)要求,采用匯編語言編制程序的過程稱為匯編語言程序設(shè)計。語言程序設(shè)計。匯編語言程序設(shè)計的步驟:匯編語言程序設(shè)計的步驟:(1 1擬訂設(shè)計任務(wù)書擬訂設(shè)計任務(wù)書 (2 2建立數(shù)學(xué)模型建立數(shù)學(xué)模型 (3 3確定算法確定算法 (4 4分配內(nèi)存單元,編制程序流程圖分配內(nèi)存單元,編制程序流程圖 (5 5編制源程序編制源程序 進(jìn)一步合理分配存儲器單元和了解進(jìn)一步

12、合理分配存儲器單元和了解I/OI/O接口地址;按功能設(shè)計程序,明接口地址;按功能設(shè)計程序,明確各程序之間的相互關(guān)系;用注釋行說明程序,便于閱讀和修改調(diào)試和修改。確各程序之間的相互關(guān)系;用注釋行說明程序,便于閱讀和修改調(diào)試和修改。 (6 6上機(jī)調(diào)試上機(jī)調(diào)試(7 7程序優(yōu)化程序優(yōu)化 docin/sundae_meng編制程序流程圖:是指用各種圖形、符號、指向線等來說明程編制程序流程圖:是指用各種圖形、符號、指向線等來說明程序設(shè)計的過程。國際通用的圖形和符號說明如下:序設(shè)計的過程。國際通用的圖形和符號說明如下: 橢圓框:開始和結(jié)束框,在程序的開始和結(jié)束時使用。橢圓框:開始和結(jié)束框,在程序的開始和結(jié)束

13、時使用。 矩形框:處理框,表示要進(jìn)行的各種操作。矩形框:處理框,表示要進(jìn)行的各種操作。 菱形框:判斷框,表示條件判斷,以決定程序的流向。菱形框:判斷框,表示條件判斷,以決定程序的流向。 流向線:流程線,表示程序執(zhí)行的流向。流向線:流程線,表示程序執(zhí)行的流向。 圓圓 圈:連接符,表示不同頁之間的流程連接。圈:連接符,表示不同頁之間的流程連接。各種幾何圖形符號如下圖所示。各種幾何圖形符號如下圖所示。docin/sundae_meng2.4.2 順序程序設(shè)計順序程序設(shè)計 特點(diǎn):順序結(jié)構(gòu)程序是最簡單、最基本的程序。程序按編寫的順特點(diǎn):順序結(jié)構(gòu)程序是最簡單、最基本的程序。程序按編寫的順序依次往下執(zhí)行每一

14、條指令,直到最后一條。它能夠解決某些實(shí)序依次往下執(zhí)行每一條指令,直到最后一條。它能夠解決某些實(shí)際問題,或成為復(fù)雜程序的子程序。際問題,或成為復(fù)雜程序的子程序。 例題例題2 2 將片內(nèi)將片內(nèi)RAM 30HRAM 30H單元中的兩位壓縮單元中的兩位壓縮BCDBCD碼轉(zhuǎn)換成二進(jìn)制數(shù)碼轉(zhuǎn)換成二進(jìn)制數(shù)送到片內(nèi)送到片內(nèi)RAM 40HRAM 40H單元中。單元中。 解:兩位壓縮解:兩位壓縮BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)碼轉(zhuǎn)換成二進(jìn)制數(shù)的算法為:的算法為: (a1a 0BCD=10a1a0 程序流程圖如右圖所示。程序流程圖如右圖所示。如:如:25=210+5用用BCD碼:(碼:(00100101)BCD=001010

15、10+0101=11001docin/sundae_meng程序如下:程序如下: ORG 1000H ORG 1000HSTART: MOV A, 30HSTART: MOV A, 30H ; ; 取兩位取兩位BCDBCD壓縮碼壓縮碼a1a0a1a0送送A A ANL A, #0F0H ANL A, #0F0H ; ; 取高取高4 4位位BCDBCD碼碼a1a1 SWAP A SWAP A ; ; 高高4 4位與低位與低4 4位位換位換位 MOV B, #0AH MOV B, #0AH ; ; 將二進(jìn)制數(shù)將二進(jìn)制數(shù)1010送入送入B B MUL AB MUL AB ; ; 將將1010a1a1

16、送入送入A A中中 MOV R0, A MOV R0, A ; ; 結(jié)果送入結(jié)果送入R0R0中中保存保存 MOV A, 30H MOV A, 30H ; ; 再取兩位再取兩位BCDBCD壓壓縮碼縮碼a1a0a1a0送送A A ANL A, #0FH ANL A, #0FH ; ; 取低取低4 4位位BCDBCD碼碼a0a0 ADD A, R0 ADD A, R0 ; ; 求和求和1010a1+ a1+ a0a0 MOV 40H, A MOV 40H, A ; ; 結(jié)果送入結(jié)果送入40H40H保保存存 SJMP $ SJMP $ ; ; 程序執(zhí)行完,程序執(zhí)行完,“原地踏步原地踏步” ” END

17、ENDdocin/sundae_meng例題例題3利用查表指令將內(nèi)部利用查表指令將內(nèi)部RAM中中20H單元的壓縮單元的壓縮BCD碼拆開,碼拆開,轉(zhuǎn)換成相應(yīng)的轉(zhuǎn)換成相應(yīng)的ASCII碼,存入碼,存入21H、22H中,高位存在中,高位存在22H。解:解: BCD碼的碼的09對應(yīng)的對應(yīng)的ASCII碼為碼為30H39H,將,將30H39H按大小順序排列放入表按大小順序排列放入表TABLE中,先將中,先將BCD碼拆分,將拆分后碼拆分,將拆分后的的BCD碼送入碼送入A,表首址送入,表首址送入DPTR ,然后領(lǐng)用查表指令,然后領(lǐng)用查表指令MOVC A,A+DPTR,查表即得結(jié)果,然后存入,查表即得結(jié)果,然后存

18、入21H、22H中。中。程序如下:程序如下: ORG 1000H START: MOV DPTR,#TABLEMOV A,20HANLA,#0FHMOVCA,A+DPTRMOV 21H,Adocin/sundae_meng MOVA,20HANLA,#0F0HSWAPAMOVC A,A+DPTRMOV22H,ASJMP TABLE:DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H ENDdocin/sundae_meng2.4.3 分支程序設(shè)計分支程序設(shè)計特點(diǎn):根據(jù)不同的條件,確特點(diǎn):根據(jù)不同的條件,確定程序的走向。它主要靠條定程序的走向。它主要靠條件

19、轉(zhuǎn)移指令、比較轉(zhuǎn)移指令件轉(zhuǎn)移指令、比較轉(zhuǎn)移指令和位轉(zhuǎn)移指令來實(shí)現(xiàn)。分支和位轉(zhuǎn)移指令來實(shí)現(xiàn)。分支程序的結(jié)構(gòu)如右圖所示。程序的結(jié)構(gòu)如右圖所示。 分支程序的設(shè)計要點(diǎn)如下:分支程序的設(shè)計要點(diǎn)如下:(1先建立可供條件轉(zhuǎn)移指令測試的條件。先建立可供條件轉(zhuǎn)移指令測試的條件。 (2選用合適的條件轉(zhuǎn)移指令。選用合適的條件轉(zhuǎn)移指令。(3在轉(zhuǎn)移的目的地址處設(shè)定標(biāo)號。在轉(zhuǎn)移的目的地址處設(shè)定標(biāo)號。docin/sundae_meng 解:此題有三個條件,所以有三個分解:此題有三個條件,所以有三個分支程序。這是一個三分支歸一的條件支程序。這是一個三分支歸一的條件轉(zhuǎn)移問題。轉(zhuǎn)移問題。 X是有符號數(shù),判斷符號位是是有符號數(shù),判

20、斷符號位是0還還是是1可利用可利用JB或或JNB指令。判斷指令。判斷X是否是否等于等于0則直接可以使用累加器則直接可以使用累加器A的判的判0指令。指令。程序流程圖如右圖所示。程序流程圖如右圖所示。例題例題4 求符號函數(shù)的值。已知片內(nèi)求符號函數(shù)的值。已知片內(nèi)RAM的的 40H單元內(nèi)有一自變單元內(nèi)有一自變量量X,編制程序按如下條件求函數(shù),編制程序按如下條件求函數(shù)Y的值,并將其存入片內(nèi)的值,并將其存入片內(nèi)RAM 的的41H單元中。單元中。 1 X0Y= 0 X=0 -1X255s255,因此單重循環(huán)程序無法實(shí)現(xiàn),可采用雙重循環(huán)的方,因此單重循環(huán)程序無法實(shí)現(xiàn),可采用雙重循環(huán)的方法編寫法編寫50ms50

21、ms延時程序。延時程序。 docin/sundae_meng程序如下:程序如下: ORG 1000H DELAY: MOV R7, #200 ; 設(shè)置外循環(huán)次數(shù)此條指令需要設(shè)置外循環(huán)次數(shù)此條指令需要1個機(jī)器周期)個機(jī)器周期) DLY1: MOV R6, #123 ; 設(shè)置內(nèi)循環(huán)次數(shù)設(shè)置內(nèi)循環(huán)次數(shù) DLY2: DJNZ R6, DLY2 ;(R6)1=0,則順序執(zhí)行,否,則順序執(zhí)行,否則轉(zhuǎn)回則轉(zhuǎn)回 DLY2繼續(xù)循環(huán),延時時間為繼續(xù)循環(huán),延時時間為2s123=246s NOP ; 延時時間為延時時間為1s DJNZ R7,DLY1 ;(R7)1=0,則順序執(zhí)行,則順序執(zhí)行, 否則轉(zhuǎn)回否則轉(zhuǎn)回DLY

22、1繼續(xù)循環(huán),延時繼續(xù)循環(huán),延時時間為時間為 (246211)20021=50.003ms RET ; 子程序結(jié)束子程序結(jié)束 ENDdocin/sundae_meng3 3設(shè)計循環(huán)程序時應(yīng)注意的問題設(shè)計循環(huán)程序時應(yīng)注意的問題(1 1循環(huán)程序是一個有始有終的整體,它的執(zhí)行是有條件的,循環(huán)程序是一個有始有終的整體,它的執(zhí)行是有條件的,所以要避免從循環(huán)體外直接轉(zhuǎn)到循環(huán)體內(nèi)部。所以要避免從循環(huán)體外直接轉(zhuǎn)到循環(huán)體內(nèi)部。(2 2多重循環(huán)程序是從外層向內(nèi)層一層一層進(jìn)入,循環(huán)結(jié)束時多重循環(huán)程序是從外層向內(nèi)層一層一層進(jìn)入,循環(huán)結(jié)束時是由內(nèi)層到外層一層一層退出的。在多重循環(huán)中,只允許外重循是由內(nèi)層到外層一層一層退出

23、的。在多重循環(huán)中,只允許外重循環(huán)嵌套內(nèi)重循環(huán)。不允許循環(huán)相互交叉,也不允許從循環(huán)程序的環(huán)嵌套內(nèi)重循環(huán)。不允許循環(huán)相互交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部。外部跳入循環(huán)程序的內(nèi)部。(3 3編寫循環(huán)程序時,首先要確定程序結(jié)構(gòu),處理好邏輯關(guān)系。編寫循環(huán)程序時,首先要確定程序結(jié)構(gòu),處理好邏輯關(guān)系。一般情況下,一個循環(huán)體的設(shè)計可以從第一次執(zhí)行情況入手,先一般情況下,一個循環(huán)體的設(shè)計可以從第一次執(zhí)行情況入手,先畫出重復(fù)執(zhí)行的程序框圖,然后再加上循環(huán)控制和置循環(huán)初值部畫出重復(fù)執(zhí)行的程序框圖,然后再加上循環(huán)控制和置循環(huán)初值部分,使其成為一個完整的循環(huán)程序。分,使其成為一個完整的循環(huán)程序。(4 4循

24、環(huán)體是循環(huán)程序中重復(fù)執(zhí)行的部分,應(yīng)仔細(xì)推敲,合理循環(huán)體是循環(huán)程序中重復(fù)執(zhí)行的部分,應(yīng)仔細(xì)推敲,合理安排,應(yīng)從改進(jìn)算法、選擇合適的指令入手對其進(jìn)行優(yōu)化,以達(dá)安排,應(yīng)從改進(jìn)算法、選擇合適的指令入手對其進(jìn)行優(yōu)化,以達(dá)到縮短程序執(zhí)行時間的目的。到縮短程序執(zhí)行時間的目的。 docin/sundae_meng4排序程序設(shè)計冒泡法)排序程序設(shè)計冒泡法) 例題例題7 設(shè)設(shè)MCS-51單片機(jī)內(nèi)部單片機(jī)內(nèi)部RAM起始地址為起始地址為30H的數(shù)據(jù)塊中共的數(shù)據(jù)塊中共存有存有64個無符號數(shù),編制程序使它們按從小到大的順序排列。個無符號數(shù),編制程序使它們按從小到大的順序排列。解:設(shè)解:設(shè)64個無符號數(shù)在數(shù)據(jù)塊中的順序?yàn)椋?/p>

25、個無符號數(shù)在數(shù)據(jù)塊中的順序?yàn)椋篹64, e63, e2, e1,使他們從小到大順序排列的方法很多,現(xiàn)以冒泡法為例進(jìn)行介紹。使他們從小到大順序排列的方法很多,現(xiàn)以冒泡法為例進(jìn)行介紹。 冒泡法又稱兩兩比較法。它先使冒泡法又稱兩兩比較法。它先使e64和和e63比較,若比較,若e64e63,則兩個存儲單元中的內(nèi)容交換,否則就不交換。然后使則兩個存儲單元中的內(nèi)容交換,否則就不交換。然后使e63和和e62比較,按同樣的原則決定是否交換。一直比較下去,最后完成比較,按同樣的原則決定是否交換。一直比較下去,最后完成e2和和e1的比較及交換,經(jīng)過的比較及交換,經(jīng)過N1=63次比較常用內(nèi)循環(huán)次比較常用內(nèi)循環(huán)63次

26、來實(shí)次來實(shí)現(xiàn)后,現(xiàn)后,e1的位置上必然得到數(shù)組中的最大值,猶如一個氣泡從的位置上必然得到數(shù)組中的最大值,猶如一個氣泡從水低冒出來一樣,如下頁圖所示圖中只畫出了水低冒出來一樣,如下頁圖所示圖中只畫出了6個數(shù)的比較過個數(shù)的比較過程)。程)。docin/sundae_mengdocin/sundae_meng 第二次冒泡過程和第一次完全相同,比較次數(shù)也可以是63次其實(shí)只需要62次,因?yàn)閑1的位置上是數(shù)據(jù)塊中的最大數(shù),不需要再比較),冒泡后在e2的位置上得到數(shù)組中的次大數(shù),如上頁圖所示。如此冒泡即大循環(huán)共63次內(nèi)循環(huán)6363次便可完成64個數(shù)的排序。 實(shí)際編程時,可通過設(shè)置“交換標(biāo)志用來控制是否再需要

27、冒泡,若剛剛進(jìn)行完的冒泡中發(fā)生過數(shù)據(jù)交換即排序尚未完成),應(yīng)繼續(xù)進(jìn)行冒泡;若進(jìn)行完的冒泡中未發(fā)生過數(shù)據(jù)交換即排序已經(jīng)完成),冒泡應(yīng)該停止。例如:對于一個已經(jīng)排好序的數(shù)組:1, 2, 3, 63, 64,排序程序只要進(jìn)行一次循環(huán)便可根據(jù)“交換標(biāo)志的狀態(tài)而結(jié)束排序程序的再執(zhí)行,這自然可以減少631=62次的冒泡時間。 冒泡法程序流程圖如下頁圖所示。 docin/sundae_mengdocin/sundae_meng程序如下:程序如下: ORG 1000HMOV R0, #30H ; 數(shù)據(jù)區(qū)首地址送數(shù)據(jù)區(qū)首地址送R0MOV R3, #63H ; 設(shè)置外循環(huán)次數(shù)在設(shè)置外循環(huán)次數(shù)在R3中中LP0: C

28、LR 7FH ; 交換標(biāo)志位交換標(biāo)志位2FH.7清清0MOV A, R3 ; 取外循環(huán)次數(shù)取外循環(huán)次數(shù)MOV R2, A ; 設(shè)置內(nèi)循環(huán)次數(shù)設(shè)置內(nèi)循環(huán)次數(shù)LP1: MOV 20H, R0 ; 數(shù)據(jù)區(qū)數(shù)據(jù)送數(shù)據(jù)區(qū)數(shù)據(jù)送20H單元中單元中MOV A, R0 ; 20H內(nèi)容送內(nèi)容送AINC R0 ; 修改地址指針修改地址指針R0+1)MOV 21H, R0 ; 下一個地址的內(nèi)容送下一個地址的內(nèi)容送21HCLR C ; Cy清清0 SUBB A, 21H ; 前一個單元的內(nèi)容與下一個單元前一個單元的內(nèi)容與下一個單元的內(nèi)容比較的內(nèi)容比較JC LP2 ; 若有借位若有借位Cy =1),前者小,程),前者小

29、,程序轉(zhuǎn)移到序轉(zhuǎn)移到LP2處執(zhí)行,處執(zhí)行, 若無借位若無借位Cy =0),前者大,不),前者大,不轉(zhuǎn)移,程序往下執(zhí)行轉(zhuǎn)移,程序往下執(zhí)行docin/sundae_meng MOV R0, 20H ; 前、后內(nèi)容交換DEC R0MOV R0, 21H INC R0 ; 修改地址指針R0+1)SETB 7FH ; 置位交換標(biāo)志位2FH.7為1LP2: DJNZ R2, LP1 ; 修改內(nèi)循環(huán)次數(shù)R2減少), 若R20,則程序轉(zhuǎn)到LP1 處仍執(zhí)行循環(huán), 若R2=0,程序結(jié)束循環(huán),程序往下執(zhí)行JNB 7FH, LP3 ; 交換標(biāo)志位2FH.7若為0,則程序轉(zhuǎn)到LP3處結(jié)束循環(huán)DJNZ R3, LP0 ;

30、 修改外循環(huán)次數(shù)R3減少), 若R30,程序轉(zhuǎn)到LP0處, 執(zhí)行仍循環(huán), 若R3=0,程序結(jié)束循環(huán),往下執(zhí)行LP3: SJMP $ ; 程序執(zhí)行完,“原地踏步”ENDdocin/sundae_meng2.4.5 查表程序設(shè)計查表程序設(shè)計 查表:根據(jù)存放在查表:根據(jù)存放在ROM中數(shù)據(jù)表格的項(xiàng)數(shù)來查找與它對應(yīng)的表中數(shù)據(jù)表格的項(xiàng)數(shù)來查找與它對應(yīng)的表中值。中值。 適用場合:主要應(yīng)用于數(shù)碼顯示、打印字符的轉(zhuǎn)換、數(shù)據(jù)轉(zhuǎn)換適用場合:主要應(yīng)用于數(shù)碼顯示、打印字符的轉(zhuǎn)換、數(shù)據(jù)轉(zhuǎn)換等場合。等場合。 1. 采用采用MOVC A, A+DPTR指令查表程序的設(shè)計方法指令查表程序的設(shè)計方法(1在程序存儲器中建立相應(yīng)的函

31、數(shù)表設(shè)自變量為在程序存儲器中建立相應(yīng)的函數(shù)表設(shè)自變量為X)。)。(2計算出這個表中所有的函數(shù)值計算出這個表中所有的函數(shù)值Y。將這群函數(shù)值按順序存。將這群函數(shù)值按順序存放在起始基地址為放在起始基地址為TABLE的程序存儲器中。的程序存儲器中。(3將表格首地址將表格首地址TABLE送入送入DPTR,X送入送入A,采用查表指,采用查表指令令MOVC A, A+DPTR完成查表,就可以得到與完成查表,就可以得到與X相對應(yīng)的相對應(yīng)的Y值值于累加器于累加器A中。中。 docin/sundae_meng2. 采用采用MOVC A, A+PC指令查表程序的設(shè)計方法指令查表程序的設(shè)計方法 當(dāng)使用當(dāng)使用PC作為基

32、址寄存器時,由于作為基址寄存器時,由于PC本身是一個程序計數(shù)本身是一個程序計數(shù)器,與指令的存放地址有關(guān),查表時其操作有所不同。器,與指令的存放地址有關(guān),查表時其操作有所不同。(1在程序存儲器中建立相應(yīng)的函數(shù)表設(shè)自變量為在程序存儲器中建立相應(yīng)的函數(shù)表設(shè)自變量為X)。)。(2計算出這個表中所有的函數(shù)值計算出這個表中所有的函數(shù)值Y。將這群函數(shù)值按順序存。將這群函數(shù)值按順序存放在起始基地址為放在起始基地址為TABLE的程序存儲器中。的程序存儲器中。(3X送入送入A,使用,使用ADD A, #data指令對累加器指令對累加器A的內(nèi)容進(jìn)行修的內(nèi)容進(jìn)行修正,偏移量正,偏移量data由公式由公式data=函數(shù)

33、數(shù)據(jù)表首地址函數(shù)數(shù)據(jù)表首地址PC1確定,即確定,即data值等于查表指令和函數(shù)表之間的字節(jié)數(shù)。值等于查表指令和函數(shù)表之間的字節(jié)數(shù)。(4采用查表指令采用查表指令MOVC A, A+PC完成查表,就可以得到與完成查表,就可以得到與X相對應(yīng)的相對應(yīng)的Y值于累加器值于累加器A中。中。 docin/sundae_meng例題例題8利用查表的方法編寫利用查表的方法編寫Y=X2X=0, 1, 2, 9的程序。的程序。解:設(shè)變量解:設(shè)變量X的值存放在內(nèi)存的值存放在內(nèi)存30H單元中,求得的單元中,求得的Y的值存放在內(nèi)的值存放在內(nèi)存存31H單元中。平方表存放在首地址為單元中。平方表存放在首地址為TABLE的程序存

34、儲器中。的程序存儲器中。方法一:采用方法一:采用MOVC A, A+DPTR指令實(shí)現(xiàn),查表過程如下圖指令實(shí)現(xiàn),查表過程如下圖2.所示。所示。docin/sundae_meng程序如下:程序如下: ORG 1000H START: MOV A, 30H ; 將查表的變量將查表的變量X送入送入A MOV DPTR, #TABLE ; 將查表的將查表的16位基地址位基地址TABLE送送DPTR MOVC A, A+DPTR ; 將查表結(jié)果將查表結(jié)果Y送送A MOV 31H, A ; Y值最后放入值最后放入31H中中 SJMP $ TABLE: DB 0, 1, 4, 9, 16 DB 25, 36,

35、 49, 64, 81 END方法二:采用方法二:采用MOVC A, A+PC指令實(shí)現(xiàn),查表過程如下頁圖所指令實(shí)現(xiàn),查表過程如下頁圖所示。示。程序如下:程序如下:docin/sundae_meng ORG 1000H START: MOV A, 30H ; 將查表的變量X送入A ADD A, #04H ; 定位修正 MOVC A, A+PC ; 將查表結(jié)果Y送A MOV 31H, A ; Y值最后放入31H中 SJMP $ TABLE: DB 0, 1, 4, 9, 16 DB 25, 36, 49, 64, 81 END docin/sundae_mengP84 例2.67將存放在片內(nèi)RAM

36、 40H單元的1位16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼,分別用查表和計算法完成。方法1:用查表求解。(略)方法2:計算求解: ORG 0000H LP1:ADD A,#0AH LJMP START ADD A,30H ORG 0030H LP2:MOV 40H,ASTART: MOV A,40H SJMP $ ANL A,#0FH END CLR C SUBB A,#0AH JC LP1 ADD A,#0AH ADD A,37H SJMP LP2 docin/sundae_meng2.4.6 子程序設(shè)計子程序設(shè)計子程序:能夠完成確定任務(wù),并能為其他程序反復(fù)調(diào)用的程序子程序:能夠完成確定任務(wù),并能為其他

37、程序反復(fù)調(diào)用的程序段稱為子程序。段稱為子程序。特點(diǎn):子程序可以多次重復(fù)使用,避免重復(fù)性工作,縮短整個特點(diǎn):子程序可以多次重復(fù)使用,避免重復(fù)性工作,縮短整個程序,節(jié)省程序存儲空間,有效地簡化程序的邏輯結(jié)構(gòu),便于程序,節(jié)省程序存儲空間,有效地簡化程序的邏輯結(jié)構(gòu),便于程序調(diào)試。程序調(diào)試。 主程序:調(diào)用子程序的程序叫做主程序或稱調(diào)用程序。主程序:調(diào)用子程序的程序叫做主程序或稱調(diào)用程序。 主程序主程序 子程序子程序 . AD1: PUSH PSW . AD1: PUSH PSW MOV A,20H PUSH 06H MOV A,20H PUSH 06H LCALL AD1 RL A LCALL AD1

38、RL AMOV 30H,A RL AMOV 30H,A RL A . POP 06H . POP 06H POP PSW POP PSW RET RETdocin/sundae_meng1子程序的調(diào)用與返回子程序的調(diào)用與返回n 主程序調(diào)用子程序的過程:在主程序主程序調(diào)用子程序的過程:在主程序中需要執(zhí)行這種操作的地方執(zhí)行一條調(diào)用中需要執(zhí)行這種操作的地方執(zhí)行一條調(diào)用指令指令LCALL或或ACALL),轉(zhuǎn)到子程序,轉(zhuǎn)到子程序,而完成規(guī)定的操作后,再在子程序最后應(yīng)而完成規(guī)定的操作后,再在子程序最后應(yīng)用用RET返回指令返回到主程序斷點(diǎn)處,繼返回指令返回到主程序斷點(diǎn)處,繼續(xù)執(zhí)行下去。續(xù)執(zhí)行下去。docin

39、/sundae_meng (1子程序的調(diào)用子程序的調(diào)用子程序的入口地址:子程序的第一條指令地址稱為子程序的入子程序的入口地址:子程序的第一條指令地址稱為子程序的入口地址,常用標(biāo)號表示??诘刂?,常用標(biāo)號表示。子程序的調(diào)用過程:單片機(jī)執(zhí)行子程序的調(diào)用過程:單片機(jī)執(zhí)行ACALL或或LCALL指令時,首指令時,首先將當(dāng)前的先將當(dāng)前的PC值調(diào)用指令的下一條指令的首地址壓入堆棧值調(diào)用指令的下一條指令的首地址壓入堆棧保存低保存低8位先進(jìn)棧,高位先進(jìn)棧,高8位后進(jìn)棧),然后將子程序的入口地位后進(jìn)棧),然后將子程序的入口地址送入址送入PC,轉(zhuǎn)去執(zhí)行子程序。,轉(zhuǎn)去執(zhí)行子程序。(2子程序的返回子程序的返回主程序的斷

40、點(diǎn)地址:子程序執(zhí)行完畢后,返回主程序的地址稱主程序的斷點(diǎn)地址:子程序執(zhí)行完畢后,返回主程序的地址稱為主程序的斷點(diǎn)地址,它在堆棧中保存。為主程序的斷點(diǎn)地址,它在堆棧中保存。子程序的返回過程:子程序執(zhí)行子程序的返回過程:子程序執(zhí)行RET指令時,將棧頂?shù)膬?nèi)容指令時,將棧頂?shù)膬?nèi)容返回地址彈回給返回地址彈回給PC先彈回先彈回PC的高的高8位,后彈回位,后彈回PC的低的低8位),使程序回到原先被中斷的主程序地址斷點(diǎn)地址去繼位),使程序回到原先被中斷的主程序地址斷點(diǎn)地址去繼續(xù)執(zhí)行。續(xù)執(zhí)行。docin/sundae_meng注意:中斷服務(wù)程序是一種特殊的子程序,它是在計算機(jī)響應(yīng)注意:中斷服務(wù)程序是一種特殊的子

41、程序,它是在計算機(jī)響應(yīng)中斷時,由硬件完成調(diào)用而進(jìn)入相應(yīng)的中斷服務(wù)程序。中斷時,由硬件完成調(diào)用而進(jìn)入相應(yīng)的中斷服務(wù)程序。RETIRETI指指令與令與RETRET指令相似,區(qū)別在于指令相似,區(qū)別在于RETRET是從子程序返回,是從子程序返回,RETIRETI是從中是從中斷服務(wù)程序返回。斷服務(wù)程序返回。 2 2保存與恢復(fù)寄存器內(nèi)容保存與恢復(fù)寄存器內(nèi)容(1 1保護(hù)現(xiàn)場保護(hù)現(xiàn)場 主程序轉(zhuǎn)入子程序后,保護(hù)主程序的信息不會在運(yùn)行子程主程序轉(zhuǎn)入子程序后,保護(hù)主程序的信息不會在運(yùn)行子程序時丟失的過程稱為保護(hù)現(xiàn)場。序時丟失的過程稱為保護(hù)現(xiàn)場。 保護(hù)現(xiàn)場通常在進(jìn)入子程序的開始時,由堆棧完成。如:保護(hù)現(xiàn)場通常在進(jìn)入子

42、程序的開始時,由堆棧完成。如: PUSH PSW PUSH PSW PUSH ACC PUSH ACC docin/sundae_meng(2恢復(fù)現(xiàn)場恢復(fù)現(xiàn)場 從子程序返回時,將保存在堆棧中的主程序的信息還原的過程從子程序返回時,將保存在堆棧中的主程序的信息還原的過程稱為恢復(fù)現(xiàn)場?;謴?fù)現(xiàn)場通常在從子程序返回之前將堆棧中保稱為恢復(fù)現(xiàn)場?;謴?fù)現(xiàn)場通常在從子程序返回之前將堆棧中保存的內(nèi)容彈回各自的寄存器。如:存的內(nèi)容彈回各自的寄存器。如: POP ACC POP PSW 3子程序的參數(shù)傳遞子程序的參數(shù)傳遞 主程序在調(diào)用子程序時傳送給子程序的參數(shù)和子程序結(jié)束后送主程序在調(diào)用子程序時傳送給子程序的參數(shù)和

43、子程序結(jié)束后送回主程序的參數(shù)統(tǒng)稱為參數(shù)傳遞?;刂鞒绦虻膮?shù)統(tǒng)稱為參數(shù)傳遞。入口參數(shù):子程序需要的原始參數(shù)。主程序在調(diào)用子程序前將入口參數(shù):子程序需要的原始參數(shù)。主程序在調(diào)用子程序前將入口參數(shù)送到約定的存儲器單元或寄存器中,然后子程序入口參數(shù)送到約定的存儲器單元或寄存器中,然后子程序從約定的存儲器單元或寄存器中獲得這些入口參數(shù)。從約定的存儲器單元或寄存器中獲得這些入口參數(shù)。出口參數(shù):子程序根據(jù)入口參數(shù)執(zhí)行程序后獲得的結(jié)果參數(shù)。出口參數(shù):子程序根據(jù)入口參數(shù)執(zhí)行程序后獲得的結(jié)果參數(shù)。子程序在結(jié)束前將出口參數(shù)送到約定的存儲器單元或寄存器子程序在結(jié)束前將出口參數(shù)送到約定的存儲器單元或寄存器中,然后主程序

44、從約定的存儲器單元或寄存器中獲得這些中,然后主程序從約定的存儲器單元或寄存器中獲得這些出口參數(shù)。出口參數(shù)。docin/sundae_meng(3傳送子程序參數(shù)的方法傳送子程序參數(shù)的方法 應(yīng)用工作寄存器或累加器傳遞參數(shù)。優(yōu)點(diǎn)是程序簡單、運(yùn)應(yīng)用工作寄存器或累加器傳遞參數(shù)。優(yōu)點(diǎn)是程序簡單、運(yùn)算速度較快,缺點(diǎn)是工作寄存器有限。算速度較快,缺點(diǎn)是工作寄存器有限。 應(yīng)用指針寄存器傳遞參數(shù)。優(yōu)點(diǎn)是能有效節(jié)省傳遞數(shù)據(jù)的應(yīng)用指針寄存器傳遞參數(shù)。優(yōu)點(diǎn)是能有效節(jié)省傳遞數(shù)據(jù)的工作量,并可實(shí)現(xiàn)可變長度運(yùn)算。工作量,并可實(shí)現(xiàn)可變長度運(yùn)算。 應(yīng)用堆棧傳遞參數(shù)。優(yōu)點(diǎn)是簡單,能傳遞的數(shù)據(jù)量較大,應(yīng)用堆棧傳遞參數(shù)。優(yōu)點(diǎn)是簡單,能

45、傳遞的數(shù)據(jù)量較大,不必為特定的參數(shù)分配存儲單元。不必為特定的參數(shù)分配存儲單元。 利用位地址傳送子程序參數(shù)。利用位地址傳送子程序參數(shù)。4子程序的嵌套子程序的嵌套 在子程序中若再調(diào)用子程序,稱為子程序的嵌套。在子程序中若再調(diào)用子程序,稱為子程序的嵌套。MCS-51單片機(jī)允許多重嵌套。如下頁圖所示。單片機(jī)允許多重嵌套。如下頁圖所示。 docin/sundae_meng5 5編寫子程序時應(yīng)注意的問題編寫子程序時應(yīng)注意的問題 子程序的入口地址一般用標(biāo)號表子程序的入口地址一般用標(biāo)號表示,標(biāo)號習(xí)慣上以子程序的任務(wù)命名。示,標(biāo)號習(xí)慣上以子程序的任務(wù)命名。例如,延時子程序常以例如,延時子程序常以DELAYDEL

46、AY作為標(biāo)號。作為標(biāo)號。 主程序通過調(diào)用指令調(diào)用子程序,主程序通過調(diào)用指令調(diào)用子程序,子程序返回主程序之前,必須執(zhí)行子程子程序返回主程序之前,必須執(zhí)行子程序末尾的一條返回指令序末尾的一條返回指令RETRET。 單片機(jī)能自動保護(hù)和恢復(fù)主程序的斷點(diǎn)地址。但對于各工作寄存器、特殊功能寄存器和內(nèi)存單元的內(nèi)容,則必須通過保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場實(shí)現(xiàn)保護(hù)。 子程序內(nèi)部必須使用相對轉(zhuǎn)移指令,以便子程序可以放在程序存儲器64KB存儲空間的任何子域并能為主程序調(diào)用,匯編時生成浮動代碼。 子程序的參數(shù)傳遞方法同樣適用于中斷服務(wù)程序。 docin/sundae_meng例題例題9 編制程序?qū)崿F(xiàn)編制程序?qū)崿F(xiàn)c=a2+b2,

47、(,(a, b均為均為1位十進(jìn)制數(shù))。位十進(jìn)制數(shù))。解:計算某數(shù)的平方可采用查表解:計算某數(shù)的平方可采用查表的方法實(shí)現(xiàn),并編寫成子程序。的方法實(shí)現(xiàn),并編寫成子程序。只要兩次調(diào)用子程序,并求和就只要兩次調(diào)用子程序,并求和就可得運(yùn)算結(jié)果。設(shè)可得運(yùn)算結(jié)果。設(shè)a, b分別存放于分別存放于片內(nèi)片內(nèi)RAM的的30H, 31H兩個單元中,兩個單元中,結(jié)果結(jié)果c存放于片內(nèi)存放于片內(nèi)RAM的的40H單單元。程序流程圖如右圖所示。元。程序流程圖如右圖所示。docin/sundae_meng主程序如下:主程序如下: ORG 1000H SR: MOV A, 30H; 將將30H中的內(nèi)容中的內(nèi)容a送入送入A ACAL

48、L SQR; 轉(zhuǎn)求平方子程序轉(zhuǎn)求平方子程序SQR處執(zhí)行處執(zhí)行 MOV R1, A; 將將a2結(jié)果送結(jié)果送R1 MOV A, 31H; 將將31H中的內(nèi)容中的內(nèi)容b送入送入A ACALL SQR; 轉(zhuǎn)求平方子程序轉(zhuǎn)求平方子程序SQR處執(zhí)行處執(zhí)行 ADD A, R1; a2+b2結(jié)果送結(jié)果送A MOV 40H, A; 結(jié)果送結(jié)果送40H單元中單元中 SJMP $; 程序執(zhí)行完,程序執(zhí)行完,“原地踏步原地踏步”求平方子程序如下采用查平方表的方法):求平方子程序如下采用查平方表的方法): SQR: INC A MOVC A, A+PC RET TABLE: DB 0, 1, 4, 9, 16 DB 2

49、5, 36, 49, 64, 81 ENDdocin/sundae_mengP88 例2.69n編寫子程序,將由R0和R1所指的片內(nèi)RAM中的兩個3字節(jié)無符號數(shù)相加,結(jié)果送到R0所指的片內(nèi)RAM中。n入口參數(shù):R0,R1分別指向兩個加數(shù)的低字節(jié)。n出口參數(shù):R0指向結(jié)果的高位字節(jié)n子程序功能:將由R0和R1所指的片內(nèi)RAM中的兩個3字節(jié)無符號數(shù)相加,結(jié)果送到R0所指的片內(nèi)RAM中。docin/sundae_meng程序: ORG 0100HNADD: MOV R7,#03 CLR CNADD1:MOV A,R0 ADDC A,R1 MOV R0,A INC R0 INC R1 DJNZ R7,

50、NADD1 DEC R0 RET ENDdocin/sundae_mengP102 作業(yè)題20 ORG 0100HMOV R0,#30HMOV R7,#08HMOV A , #00HL1: ADD A,R0 INC R0 DJNZ R7,L1 MOV B,#08H DIV AB MOV 3AH,A MOV 3BH,B SJMP $ END n編程計算片內(nèi)RAM30H37H這8個單元中的數(shù)的算術(shù)平均值,結(jié)果存放在3AH單元中。docin/sundae_meng2.5 程序設(shè)計舉例程序設(shè)計舉例2.5.1 多字節(jié)算術(shù)運(yùn)算程序多字節(jié)算術(shù)運(yùn)算程序例例 2.70 已知片內(nèi)已知片內(nèi)RAM以以BLOCK1和和

51、BLOCK2為起始的單元中,分別存有為起始的單元中,分別存有5字節(jié)無符號被減數(shù)和減數(shù)低位在前,字節(jié)無符號被減數(shù)和減數(shù)低位在前,高位在后)。編程序求差值,并把結(jié)果高位在后)。編程序求差值,并把結(jié)果存入以存入以BLOCK1為起始地址的片內(nèi)為起始地址的片內(nèi)RAM中。中。解:兩個解:兩個5字節(jié)的數(shù)做減法,需要用循環(huán)結(jié)字節(jié)的數(shù)做減法,需要用循環(huán)結(jié)構(gòu)設(shè)計程序。構(gòu)設(shè)計程序。docin/sundae_meng程序 ORG 0100HSYSUB:MOV R0,#BLOCK1 MOV R1,#BLOCK2 MOV R2,#05H CLR CLOOP: MOV A,R0 SUBB A,R1 MOV R0,A INC

52、 R0 INC R1 DJNZ R2,LOOP RET ENDdocin/sundae_meng例例2.71 編制程序?qū)崿F(xiàn)兩個編制程序?qū)崿F(xiàn)兩個16位二位二進(jìn)制數(shù)乘法運(yùn)算:進(jìn)制數(shù)乘法運(yùn)算: (R7R616(R5R416(R3R2R1R016 R7 R6 R5 R4 R4R6 R1R0 R4R7 R2R1 R5R6 R2R1 R5R7 R3R2docin/sundae_mengP89 程序解:解:MCS-51乘法指令只能完成兩個乘法指令只能完成兩個8位無符號數(shù)相乘位無符號數(shù)相乘,因此,因此16位無符號數(shù)求積必須將它們分解成位無符號數(shù)求積必須將它們分解成8位數(shù)相位數(shù)相乘來實(shí)現(xiàn)。其方法有先乘后加和邊乘

53、邊加兩種?,F(xiàn)以乘來實(shí)現(xiàn)。其方法有先乘后加和邊乘邊加兩種?,F(xiàn)以邊乘邊加為例設(shè)計。邊乘邊加為例設(shè)計。程序如下程序如下 ORG 1000H DMUL: MOV A, R6; 第一個因數(shù)的低位送第一個因數(shù)的低位送A MOV B, R4; 第二個因數(shù)的低位送第二個因數(shù)的低位送B MUL AB; 第一個因數(shù)的低位乘以第二個第一個因數(shù)的低位乘以第二個因數(shù)的低位因數(shù)的低位 R4R6docin/sundae_meng MOV R0, A; 積的低位送R0 MOV R1, B; 積的高位送R1 MOV A, R7; 第一個因數(shù)的高位送A MOV B, R4; 第二個因數(shù)的低位送B MUL AB; R4R7 ADD

54、 A, R1; 部分積相加,形成進(jìn)位Cy MOV R1, A; 部分積相加送R1 MOV A, B; 部分積的進(jìn)位Cy加到高位 ADDC A, #00H MOV R2, A MOV A, R6; 第一個因數(shù)的低位送A MOV B, R5; 第二個因數(shù)的高位送B MUL AB; R5R6 ADD A, R1; 部分積相加,形成進(jìn)位Cy MOV R1, A; 回送部分積 MOV A, R2docin/sundae_meng ADDC A, B; 部分積相加 MOV R2, A; 回送部分積 MOV A, #00H; 部分積的進(jìn)位Cy加到高位 ADDC A, #00H MOV R3, A; 回送部分

55、積 MOV A, R7; 第一個因數(shù)的高位送A MOV B, R5; 第二個因數(shù)的高位送B MUL AB; R5R7 ADD A, R2; 部分積相加,形成進(jìn)位Cy MOV R2, A; 回送部分積 MOV A, R3 ADDC A, B; 部分積相加 MOV R3, A; 回送部分積 RET ENDdocin/sundae_meng2.5.2 數(shù)制轉(zhuǎn)換程序數(shù)制轉(zhuǎn)換程序n例 2.72 將4位壓縮BCD碼十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)。na3a2a1a0=a31000+a2100+a110+a0n=(a310+a2) 100+(a110+a0 )n公因式 (ai10+aj),可用雙重嵌套子程序的方法將公

56、因式用內(nèi)層子程序編寫。(ai為高4位,aj為低4位)n外層子程序入口參數(shù):4位壓縮BCD碼存R6R5。n外層子程序出口參數(shù):轉(zhuǎn)換后的二進(jìn)制數(shù)存R6R5。n內(nèi)層子程序入口參數(shù):待轉(zhuǎn)換的BCD存R2。n內(nèi)層子程序出口參數(shù):轉(zhuǎn)換后的二進(jìn)制數(shù)存R2。docin/sundae_meng程序 (a310+a2) 100+(a110+a0 ) ORG 0100HBCDBIN2:MOV A,R6 MOV R2,A ACALL BCDBIN1 MOV A,R2 MOV B,#100 MUL AB MOV R6,B MOV R4,A MOV A,R5 MOV R2,A ACALL BCDBIN1 MOV A,R2

57、 ADD A,R4 MOV R5,A MOV A,R6 ADDC A,#00 MOV R6,A RETBCDBIN1:MOV A,R2 ANL A,#0F0H MOV B,#10 SWAP A MUL AB MOV R3,A MOV A,R2 ANL A,#0FH ADD A,R3 MOV R2,A RET ENDdocin/sundae_meng例例2.73 將雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成將雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼碼十進(jìn)制數(shù))。十進(jìn)制數(shù))。解:將二進(jìn)制數(shù)轉(zhuǎn)換成解:將二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼的數(shù)學(xué)模型為:碼的數(shù)學(xué)模型為:(a15a14a1a02=(a15215+a14214+a121+a02010上

58、式右側(cè)即為欲求的上式右側(cè)即為欲求的BCD碼。它可作如下變換碼。它可作如下變換 (a15214+a14213+a1)2+a0括號里的內(nèi)容可變?yōu)椋海ɡㄌ柪锏膬?nèi)容可變?yōu)椋海╝15213 +a14212+a13211+a2)2+a1括號里的內(nèi)容可變?yōu)椋海ɡㄌ柪锏膬?nèi)容可變?yōu)椋海╝15212+a14211+a13210+a3)2+a2 經(jīng)過經(jīng)過16次的變換后,括號里的內(nèi)容可變?yōu)椋捍蔚淖儞Q后,括號里的內(nèi)容可變?yōu)椋?(02+a15)2+a14 所以括號里的內(nèi)容的通式為所以括號里的內(nèi)容的通式為ai+12+ai,即為二進(jìn)制數(shù)轉(zhuǎn)換成,即為二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼的公因式。碼的公因式。docin/sundae_meng

59、 在程序設(shè)計中,可利用左移指令乘以2實(shí)現(xiàn)ai+12,采用循環(huán)計算16次公因式的方法來完成二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼。入口參數(shù):16位無符號數(shù)送R3, R2。出口參數(shù):共有5位BCD數(shù),萬位R6;千、百位R5;十、個位R4位。程序流程圖如右圖所示。docin/sundae_meng程序如下:程序如下: ORG 1000H BINBCD1: CLR A ; A 清清0 MOV R4, A ; 清清0出口參數(shù)寄存器出口參數(shù)寄存器 MOV R5, A MOV R6, A MOV R7, #10H ; 設(shè)置循環(huán)次數(shù)設(shè)置循環(huán)次數(shù)16 LOOP: CLR C ; 標(biāo)志位標(biāo)志位Cy清清0,為二進(jìn)制數(shù),為二進(jìn)制數(shù)2

60、作準(zhǔn)備作準(zhǔn)備 MOV A, R2 ;ai+12 RLC A MOV R2, A MOV A, R3 RLC A MOV R3, A MOV A, R4 docin/sundae_meng ADDC A, R4 ; 帶進(jìn)位自身相加,相當(dāng)于乘2 DA A MOV R4, A MOV A, R5 ADDC A, R5 DA A MOV R5, A MOV A, R6 ADDC A, R6 MOV R6, A ; 雙字節(jié)十六進(jìn)制數(shù)的萬位數(shù)不超過6, 不用調(diào)整 DJNZ R7, LOOP ; 若16位未循環(huán)完,轉(zhuǎn)向LOOP繼續(xù)循環(huán), 否則繼續(xù)執(zhí)行 RET ENDdocin/sundae_meng2.5.

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論