第三章MCS匯編語言程序設(shè)計(jì)lx_第1頁
第三章MCS匯編語言程序設(shè)計(jì)lx_第2頁
第三章MCS匯編語言程序設(shè)計(jì)lx_第3頁
第三章MCS匯編語言程序設(shè)計(jì)lx_第4頁
第三章MCS匯編語言程序設(shè)計(jì)lx_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第三章 MCS-51匯編語言程序設(shè)計(jì)n西北工業(yè)大學(xué)研究生專業(yè)選修課:單片機(jī)原理接口與應(yīng)用主講教師:楊奇電子信息學(xué)院2022-3-19MCS-51匯編語言程序設(shè)計(jì) 匯編語言概述 匯編語言程序的基本結(jié)構(gòu) 匯編語言程序設(shè)計(jì)舉例第三章 匯編語言概述 一、匯編語言特點(diǎn) 用助記符及標(biāo)號地址、標(biāo)號等符號來書寫的程序設(shè)計(jì)語言稱匯編語言,用匯編語言編寫的程序稱為匯編語言程序 指令采用助記符而不是使用指令碼表示 地址采用標(biāo)號地址,而不是真正的實(shí)際地址 采用助記符和標(biāo)號地址為使用者提供了方便,不必記憶指令的機(jī)器碼,也不必進(jìn)行實(shí)際的地址計(jì)算。 將助記符翻譯成機(jī)器碼和將標(biāo)號地址換算成實(shí)際地址的工作稱為匯編第三章 匯編語

2、言概述 匯編的2種方式 手工匯編:人工查指令表匯編。用于設(shè)計(jì)短小程序或調(diào)試程序的場合。 機(jī)器匯編:用匯編程序進(jìn)行匯編第三章 匯編語言概述 匯編語言的特點(diǎn): 助記符指令和機(jī)器指令一一對應(yīng),因此使用匯編語言編寫的程序代碼效率高,占用存儲空間小,運(yùn)行速度快。使用匯編語言能編寫出最優(yōu)化的程序 匯編語言能直接與存儲器和接口電路打交道,也能申請中斷,因此匯編語言程序能直接管理和控制硬件設(shè)備 匯編語言是面向計(jì)算機(jī)的,不是獨(dú)立于CPU的,每種微處理器都有專門的指令系統(tǒng),有自己的匯編語言,彼此之間不能通用。程序設(shè)計(jì)人員必須對計(jì)算機(jī)硬件有相當(dāng)深入的了解,才能使用匯編語言編寫程序,由于匯編語言與機(jī)器有關(guān),因此匯編語

3、言程序不易移植,但是掌握一種匯編語言有助于學(xué)習(xí)其他的匯編語言。第三章 匯編語言概述 二、匯編語言程序的語句格式 MCS51匯編語言程序的語句格式為 標(biāo)號: 操作碼 操作數(shù) ;注釋 有方括號的部分是可選擇部分,可有可無,視需要而定第三章 匯編語言概述 1標(biāo)號 標(biāo)號是語句地址的標(biāo)志符號,匯編語言程序的語句通過標(biāo)號才能訪問到該語句。 對于標(biāo)號的使用有以下規(guī)定: 標(biāo)號由8個(gè)ASCII字符組成,頭1個(gè)字符必須是字母,其余字符可以是字母、數(shù)字和特定字符 不能使用匯編語言中已經(jīng)定義的符號作為標(biāo)號,如指令助記符、偽指令、SFR的符號名稱等 標(biāo)號后必須緊跟一個(gè)冒號 同1標(biāo)號在1個(gè)程序只能定義1次,不能重復(fù)定義

4、1條語句有無標(biāo)號是任選的,根據(jù)程序中是否訪問該語句而定第三章 匯編語言概述 例:正確的標(biāo)號: LOOP: TABLE: THLS$: LT_1: 錯(cuò)誤的標(biāo)號: 11T: LST+2: MOV: TMOD:第三章 匯編語言概述 2操作碼 用于規(guī)定語句執(zhí)行的操作,它是指令助記符或偽指令 操作碼是匯編語盲語句中唯一不可空缺的部分 3操作數(shù) 操作數(shù)是參加運(yùn)算與操作的數(shù)據(jù)或數(shù)據(jù)的地址,它和操作碼之間用空格分開 在一條語句中,操作數(shù)根據(jù)指令的不同,可以是空白或一至三個(gè) 若有二個(gè)以上操作數(shù),各操作數(shù)之間用逗號分隔n對于立即數(shù) #datan(1)立即數(shù)188,可表示為 #10111100B、#0BCH、#18

5、8n(2)MOV R0,# BLOCK;BLOCK為定義過的標(biāo)號地址n對于直接地址 directn(1)二進(jìn)制、十進(jìn)制、十六進(jìn)制數(shù),MOV A,30Hn(2)定義過的標(biāo)號地址,AGAIN:SJMP AGAINn(3)表達(dá)式,如SUM+2,其中SUM為定義過的標(biāo)號地址n(4) SFR寄存器名,如SP、DPH、DPL等對于偏移量 rel(1)可以是數(shù)值、標(biāo)號地址、表達(dá)式(2)使用特殊符號“”,它代表本條轉(zhuǎn)移指令所 在的地址, 如LJMP (死循環(huán))(3)實(shí)際編程時(shí),凡指令中用到地址(rel、 addr11 、addr16等)都可用標(biāo)號地址代替實(shí)際地址,而地址的運(yùn)算由匯編程序完成。第三章 匯編語言概

6、述 三、匯編語言的偽指令 偽指令是屬于指令系統(tǒng)之外的,是程序員發(fā)給匯編程序的命令。匯編程序在這些命令的指導(dǎo)下將匯編語言程序匯編,生成機(jī)器碼 偽指令沒有對應(yīng)的機(jī)器語言代碼,對程序本身的算法和流程控制沒有作用 MCS-51匯編語言程序中常用的偽指令有第三章 匯編語言概述 1ORG(匯編起始命令) 功能是規(guī)定生成的機(jī)器語言程序代碼的起始地址 格式: 標(biāo)號: ORG 地址 其中標(biāo)號:是任選項(xiàng) 地址項(xiàng)為16位二進(jìn)制地址。 例: ORG 1000H START:MOV SP,#60H 規(guī)定了這個(gè)程序的START標(biāo)號所在地址為1000H,程序機(jī)器碼從1000H地址開始第三章 匯編語言概述 2END(匯編終止

7、命令) 功能是終止源程序的匯編工作,在END之后的指令,匯編程序都不予處理 END是匯編語言程序的結(jié)束標(biāo)志,1個(gè)程序只能有1個(gè)END命令 格式: 標(biāo)號: END 表達(dá)式 其中標(biāo)號和表達(dá)式兩項(xiàng)均是可選項(xiàng) 表達(dá)式項(xiàng)表示該程序的可執(zhí)行段的首地址 例: ENDSTART第三章 匯編語言概述 3EQU(等值指令) 功能是將一個(gè)特定值賦與一個(gè)標(biāo)號 格式: 字符名稱 EQU 表達(dá)式 字符名稱不同于標(biāo)號,不加冒號 表達(dá)式可以是常數(shù)、地址、標(biāo)號等 賦值以后的字符名稱既可以作地址使用,也可以作立即數(shù)使用,并且其值在整個(gè)程序中是固定的第三章 匯編語言概述 4DB(定義字節(jié)命令) 從指定的地址單元開始,定義若干個(gè)字節(jié)

8、的數(shù)據(jù) 格式: 標(biāo)號: DB 數(shù)據(jù)表 標(biāo)號是可選項(xiàng) 數(shù)據(jù)表是1字節(jié)數(shù)據(jù)或用逗號分隔的1組字節(jié)數(shù)據(jù) 例: CONST:DB 30H TBL: DB 0C0H,0F9H,0A4HDB 0B0H, 99H,92H 第2個(gè)例子定義了1個(gè)常數(shù)表,起始地址為TBL,表中的數(shù)據(jù)按指令中數(shù)據(jù)的順序排列第三章 匯編語言概述 5DW(定義字命令) 從指定地址開始,連續(xù)存放16位的字?jǐn)?shù)據(jù) 格式: 標(biāo)號: DW 字?jǐn)?shù)據(jù)表 1個(gè)字?jǐn)?shù)據(jù)占兩個(gè)字節(jié) 在MCS-51系統(tǒng)中,字?jǐn)?shù)據(jù)是按照高字節(jié)在先,低字節(jié)在后的順序存入 例: WTBL: DW 1234H,279H,20H 將按順序存入12H,34H,02H,79H,00H,2

9、0H第三章 匯編語言概述 6DS(定義存儲器命令) 從指定地址開始保留若干字節(jié)的存儲單元 格式: 標(biāo)號: DS 表達(dá)式 表達(dá)式的值決定了保留多少字節(jié)的存儲單元 例: BASE: DS 100 將從BASE標(biāo)號地址開始保留100個(gè)存儲單元第三章 匯編語言概述 四、匯編語言程序設(shè)計(jì)特點(diǎn) 用匯編語言進(jìn)行程序設(shè)計(jì)與使用高級語言進(jìn)行程序設(shè)計(jì)過程是類似的,同樣需要按照分析問題、確定算法、設(shè)計(jì)流程圖和編寫程序的步驟來進(jìn)行。但是,匯編語言程序設(shè)計(jì)也有自己的特點(diǎn)。 匯編程序設(shè)計(jì)時(shí),設(shè)計(jì)者要對數(shù)據(jù)的存放、寄存器和工作單元的使用作出計(jì)劃安排 匯編語言程序設(shè)計(jì)要求設(shè)計(jì)人員必須對所使用的計(jì)算機(jī)的硬件結(jié)構(gòu)有較為詳細(xì)的了解

10、,尤其對寄存器、IO端口、定時(shí)器計(jì)數(shù)器、中斷系統(tǒng)等更應(yīng)深入了解,從而能夠在程序設(shè)計(jì)中熟練應(yīng)用 匯編語言程序設(shè)計(jì)的技巧性較高,且有軟硬件結(jié)合的特點(diǎn)第三章 匯編語言程序的基本結(jié)構(gòu) 匯編語言程序的基本結(jié)構(gòu) 和大多數(shù)高級語言程序類似,匯編語言程序有四種結(jié)構(gòu)形式 順序結(jié)構(gòu) 分支結(jié)構(gòu) 循環(huán)結(jié)構(gòu) 子程序結(jié)構(gòu)n程序設(shè)計(jì)的基本步驟n一般步驟為:n(1)分析題意,明確要求;n(2)建立思路,確定算法;n(3)編制框圖,繪出流程;n(4)編寫程序,上機(jī)調(diào)試;n 顯然,算法和流程是至關(guān)重要的。程序結(jié)構(gòu)有簡單順序、分支、循環(huán)和子程序等幾種基本形式。nn畫流程圖n畫流程圖是指用各種圖形、符號、指向線等來說明程序n設(shè)計(jì)的過

11、程。國際通用的圖形和符號說明如下:n n橢圓框:起止框,在程序的開始和結(jié)束時(shí)使用。n矩形框:處理框,表示要進(jìn)行的各種操作。n菱形框:判斷框,表示條件判斷,以決定程序的流向。n指向線:流程線,表示程序執(zhí)行的流向。n圓 圈:連接符,表示不同頁之間的流程連接。n各種幾何圖形符號如下圖所示。第三章 匯編語言程序的基本結(jié)構(gòu) 一、順序結(jié)構(gòu)程序 順序結(jié)構(gòu)是最簡單的程序結(jié)構(gòu),順序結(jié)構(gòu)的程序中既順序結(jié)構(gòu)是最簡單的程序結(jié)構(gòu),順序結(jié)構(gòu)的程序中既無分支、循環(huán),也無調(diào)用子程序,一條條順序執(zhí)行無分支、循環(huán),也無調(diào)用子程序,一條條順序執(zhí)行 例:將兩位例:將兩位BCD數(shù)轉(zhuǎn)變?yōu)槎M(jìn)制數(shù),設(shè)數(shù)轉(zhuǎn)變?yōu)槎M(jìn)制數(shù),設(shè)BCD數(shù)在累加數(shù)在

12、累加器器A中,轉(zhuǎn)換結(jié)果仍存于中,轉(zhuǎn)換結(jié)果仍存于AORG1000H DTOB: MOVB, #10HDIVAB ;分開A中的BCD數(shù)個(gè)位和十位MOVR7, B ;暫存?zhèn)€位MOVB, #0AHMULAB ;十位數(shù)乘10ADDA, R7 ;加個(gè)位 HERE: SJMP HEREn例:例:已知兩個(gè)壓縮BCD碼分別n放在內(nèi)部RAM的31H30H和33H 32Hn等4個(gè)單元中,試編程求和,結(jié)果存n入R4R3R2中。n 分析:流程如圖:n程序如下:nORG 0000HnLJMP MAINnORG 0040H MAIN:MOV A,30HADDA,32HDAAMOV R2,AMOV A,31HADDCA,33

13、HDA AMOV R3,ACLRAMOVACC.0,CMOV R4,AHERE:SJMPHEREEND例:例: 利用查表指令將內(nèi)部RAM中20H單元的壓縮BCD碼拆開,轉(zhuǎn)換成相應(yīng)的ASCII碼,存入21H、22H中,高位存在22H。分析:控制流程圖(略),程序如下:START:MOV DPTR,#TABLEMOVA,20HANLA,#0FHMOVCA,A+DPTRMOV21H, AMOVA,20HANLA,#0F0HSWAPAMOVCA,A+DPTRMOV22H, ASJMP TABLE:DB 30H,31H,32H,33H,34HDB 35H,36H,37H,38H,39H第三章 匯編語言程

14、序的基本結(jié)構(gòu) 二、分支結(jié)構(gòu)程序 程序的分支是通過條件轉(zhuǎn)移指令實(shí)現(xiàn)的,根據(jù)條件對程序執(zhí)行中的狀態(tài)進(jìn)行判斷,滿足條件則進(jìn)行程序轉(zhuǎn)移,否則按順序執(zhí)行 指令系統(tǒng)中有多種條件轉(zhuǎn)移指令,包括JZ、JNZ、CJNE、DJNZ以及位狀態(tài)條件轉(zhuǎn)移指令JC、JNC、JB、JNB、JBC等 分支結(jié)構(gòu)程序可分為單分支程序和多分支程序1、單分支程序、單分支程序 單分支結(jié)構(gòu)程序使用轉(zhuǎn)移指令實(shí)現(xiàn),即根據(jù)條件對程序的執(zhí)行進(jìn)行判斷,滿足條件是轉(zhuǎn)移執(zhí)行,否則順序執(zhí)行。在MCS-51指令系統(tǒng)中條件轉(zhuǎn)移指令有:(1)判A轉(zhuǎn)移指令JZ、JNZ;(2)判位轉(zhuǎn)移指令JB、JNB、JBC、JC、JNC;(3)比較轉(zhuǎn)移指令CJNE;(4)減1

15、不為0轉(zhuǎn)移指令DJNZ;第三章 匯編語言程序的基本結(jié)構(gòu) 單分支程序是只使用一次條件轉(zhuǎn)移指令的分支程序 例:一位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼。設(shè)十六進(jìn)制數(shù)在A中,轉(zhuǎn)換結(jié)果仍存在于A中 HTOA: CJNE A, #0AH, NOEQ ;=10? NOEQ: JCLT10 ;C=1,=10, +7 LT10:ADDA, #30H ;+30H HERE: SJMP HERE 0 9 的ASCII碼為 30H 39H (48 57) A F 的ASCII碼為 41H 46H (65 69)n 例:例: 假定在外部RAM中有ST1、ST2和ST3共3個(gè)連續(xù)單元,其中ST1、ST2單元中分別存放著兩個(gè)8位

16、無符號數(shù),要求找出其中的大數(shù)并存入ST3單元。n分析:兩個(gè)無符號數(shù)的大小比較可利用兩數(shù)相減是否有借位來判斷,流程圖和程序如下所示:lSTART:CLRCl MOV DPTR,#ST1l MOVX A,DPTRl MOV R7,Al INC DPTRl MOVX A,DPTRl SUBB A,R7l JC BIG1l MOVX A,DPTRl SJMPBIG2l BIG1:XCH A,R7l BIG2:INC DPTRl MOVX DPTR,Al SJMP 第三章 匯編語言程序的基本結(jié)構(gòu) 2N路分支程序 在多分支程序中,因?yàn)榭赡艿姆种蠳個(gè),若采用多條CJNE指令逐次比較,程序的執(zhí)行效率會降低

17、很多,特別是分支較多時(shí)。 一般采用跳轉(zhuǎn)表的方法,兩次轉(zhuǎn)移實(shí)現(xiàn)多分支結(jié)構(gòu)第三章 匯編語言程序的基本結(jié)構(gòu) 例:設(shè)內(nèi)部RAM的30H有一個(gè)數(shù),根據(jù)該值的不同轉(zhuǎn)移到不同的程序段進(jìn)行處理,設(shè)數(shù)值的范圍是010的無符號數(shù)MOVA, 30H;取數(shù)RLA;2MOVDPTR, #JMPTBL;跳轉(zhuǎn)表首地址JMPA+DPTR;一次跳轉(zhuǎn) JMPTBL:AJMP BRCH0;轉(zhuǎn)至分支0AJMP BRCH1;轉(zhuǎn)至分支1 :AJMP BRCH10;轉(zhuǎn)至分支10 BRCH0: . . . .第三章 匯編語言程序的基本結(jié)構(gòu) 使用跳轉(zhuǎn)表最多可實(shí)現(xiàn)128路分支的轉(zhuǎn)移 AJMP指令的轉(zhuǎn)移范圍是2KB,分支處理程序的位置受到了限制。

18、跳轉(zhuǎn)表使用LJMP指令,分支程序可分布在整個(gè)64KB范圍內(nèi),但要對分支數(shù)值進(jìn)行乘3處理MOVA, 30H;取數(shù)RLA;2ADDA, 30H;+,= 3MOVDPTR, #JMPTBL;跳轉(zhuǎn)表首地址JMPA+DPTR;一次跳轉(zhuǎn) JMPTBL:LJMP BRCH0;轉(zhuǎn)至分支0LJMP BRCH1;轉(zhuǎn)至分支1 :LJMP BRCH10;轉(zhuǎn)至分支10 BRCH0: . . . .第三章 匯編語言程序的基本結(jié)構(gòu) 還可采用查表法來實(shí)現(xiàn) 查表法的表的內(nèi)容不是跳轉(zhuǎn)指令,而是地址的偏移量,即各分支處理程序的入口地址與表的基地址的差值,因此也稱為差值表。MOVA, 30H;取數(shù)MOVDPTR, #BRTAB;表基

19、地址MOVC A, A+DPTR;查表JMPA+DPTR;計(jì)算地址并跳轉(zhuǎn) BRTAB: DBBR0-BRTAB ;分支0地址與表基地址差DBBR1-BRTAB ;分支1地址與表基地址差 :DBBR10-BRTAB ;分支10與表基地址差 BR0: . . . .第三章 匯編語言程序的基本結(jié)構(gòu) 三、循環(huán)結(jié)構(gòu)程序 循環(huán)程序是指計(jì)算機(jī)反復(fù)執(zhí)行某一段程序(稱為循環(huán)體) 循環(huán)是在一定條件控制下進(jìn)行,以決定是繼續(xù)循環(huán)執(zhí)行或是結(jié)束循環(huán) 程序循環(huán)是通過條件轉(zhuǎn)移指令進(jìn)行控制的 通常循環(huán)結(jié)構(gòu)的程序包含四個(gè)組成部分 循環(huán)準(zhǔn)備:設(shè)置循環(huán)次數(shù)、起始地址和初值等參數(shù) 循環(huán)體:循環(huán)程序的主體,是要求重復(fù)執(zhí)行的部分 循環(huán)修改

20、:修改循環(huán)次數(shù)及有關(guān)變量參數(shù)等 循環(huán)控制部分:根據(jù)循環(huán)結(jié)束條件來判斷是否結(jié)束循環(huán)第三章 匯編語言程序的基本結(jié)構(gòu) 循環(huán)結(jié)構(gòu)的兩種組織方式第三章 匯編語言程序的基本結(jié)構(gòu) 例:外部RAM之間的數(shù)據(jù)。把外部RAM2000H開始單元中的數(shù)據(jù)傳送到外部RAM3000H開始的單元中,數(shù)據(jù)個(gè)數(shù)在內(nèi)部RAM的40H單元中 訪問外部RAM只有1對DPTR寄存器間址方式的指令 要完成累加器與外部RAM間的數(shù)據(jù)傳送,源地址指針和目的地址指針都必須使用DPTR 必須將源指針和目的指針分別保護(hù),分時(shí)占用DPTR來傳送數(shù)據(jù)第三章 匯編語言程序的基本結(jié)構(gòu) ORG 1000H START:MOVDPTR,#2000H;源地址

21、PUSH DPL ;壓棧保護(hù) PUSH DPH MOV DPTR,#3000H;目的地址 MOV R2, DPL ;保護(hù)在寄存器中MOVR3, DPH LOOP:POPDPH;取源指針POPDPLMOVX A, DPTR;取數(shù)據(jù)INCDPTR;修改源指針 PUSH DPL ;壓棧保護(hù) PUSH DPH第三章 匯編語言程序的基本結(jié)構(gòu) MOV DPL, R2 ;取出目的地址MOVDPH, R3MOVX DPTR, A;存數(shù)據(jù)INCDPTR;修改目的指針 MOV R2, DPL ;保護(hù)在寄存器中MOVR3, DPHDJNZ 40H, LOOP HERE:SJMP HERE第三章 匯編語言程序的基本結(jié)

22、構(gòu) 四、子程序結(jié)構(gòu) 子程序結(jié)構(gòu)是匯編語言程序重要的程序組織形式 恰當(dāng)?shù)厥褂米映绦?,可以使整個(gè)程序結(jié)構(gòu)清楚,便于閱讀和理解,并可減小程序代碼的長度 每調(diào)用一次子程序都要附加保護(hù)斷點(diǎn)現(xiàn)場等操作,增加了程序的執(zhí)行時(shí)間,但從總的方面來說,付出這些代價(jià)是值得的第三章 匯編語言程序的基本結(jié)構(gòu) 子程序應(yīng)具備的特性 通用性 子程序必須適應(yīng)于各種應(yīng)用程序的調(diào)用,子程序的參數(shù)應(yīng)是可變的 可浮動性 子程序可以不加任何修改而放置在存儲器的任何區(qū)域。這要求在子程序設(shè)計(jì)中應(yīng) 避免使用絕對轉(zhuǎn)移指令 子程序的首地址也應(yīng)該用符號地址 可遞歸性和可重入性 可遞歸性是指子程序可以調(diào)用自己, 可重入性是指一個(gè)子程序可以同時(shí)被多個(gè)程序

23、調(diào)用。 本特性對大規(guī)模系統(tǒng)程序的要求,一般不要求第三章 匯編語言程序的基本結(jié)構(gòu) 參數(shù)傳遞方法 匯編語言子程序結(jié)構(gòu)中,參數(shù)的傳遞要靠程序設(shè)計(jì)者自己安排數(shù)據(jù)的存放和工作單元的選擇問題 匯編語言子程序參數(shù)的傳遞一般可采用下面的方法 傳遞數(shù)據(jù) 將數(shù)據(jù)通過工作寄存器R0R7或者累加器A來傳送。 其具體過程 在調(diào)用子程序前把數(shù)據(jù)送入寄存器中,子程序中就對這些寄存器中的數(shù)據(jù)進(jìn)行操作 子程序執(zhí)行后,結(jié)果仍由寄存器送回第三章 匯編語言程序的基本結(jié)構(gòu) 傳遞地址 數(shù)據(jù)存放在數(shù)據(jù)存儲器中,參數(shù)傳遞時(shí)只通過R0、R1、DPTR傳遞數(shù)據(jù)所存放的地址。調(diào)用結(jié)束時(shí),結(jié)果也可存放在數(shù)據(jù)存儲器中,傳送回的也是存在寄存器中的地址。

24、 通過堆棧傳遞參數(shù) 在調(diào)用之前,先把要傳送的參數(shù)壓入堆棧,進(jìn)入子程序后,再將堆棧中的參數(shù)彈出到工作寄存器或其他內(nèi)部RAM單元。在彈出參數(shù)時(shí),應(yīng)注意棧頂?shù)膬蓚€(gè)字節(jié)數(shù)據(jù)是斷點(diǎn)地址,不應(yīng)誤為傳遞的參數(shù),也不應(yīng)拋棄。在子程序返回之前,應(yīng)保證該兩字節(jié)數(shù)據(jù)仍處在棧頂位置,以便正確返回主程序。第三章 匯編語言程序的基本結(jié)構(gòu) 通過堆棧傳遞參數(shù)時(shí),應(yīng)注意 不能在子程序的開頭通過壓入堆棧來保護(hù)現(xiàn)場,而應(yīng)在主程序中先保護(hù)現(xiàn)場,然后壓入要傳遞的參數(shù) 在子程序返回后,應(yīng)使堆?;謴?fù)到原來的深度,彈出堆棧中傳遞的參數(shù)廢棄,保持堆棧與調(diào)用前深度一致,這樣才能保證后續(xù)操作的正確,并且不會因?yàn)槊空{(diào)用一次子程序,堆棧深度就會加深,

25、而使堆棧發(fā)生溢出 見P.81例2(用子程序?qū)崿F(xiàn)多字節(jié)無符號數(shù)加法運(yùn)算。);子程序名稱:MULTADD;功能:將位數(shù)相同的被加數(shù)與加數(shù)相加,和存入被; 加數(shù)單元,和的最高字節(jié)進(jìn)位存入緊隨其后; 的單元;入口參數(shù):通過堆棧傳遞,從棧底到棧頂?shù)拇涡蚍郑?別為:被加數(shù)首地址,加數(shù)首地址和字節(jié)長; 度;出口參數(shù):無;使用寄存器:A,第三工作寄存器的R0,R1,R2(RS1=1,RS0=1);調(diào)用:無MULTADD:SETBRS1;選擇第三工作寄存器組 SETBRS0 DEC SP;跳過棧頂?shù)臄帱c(diǎn)地址 DECSP POP1AH;長度彈出到R2 POP19H;加數(shù)地址彈出到R1 POP18H;被加數(shù)地址彈出

26、到R0 CLRC ;清CYLOOP: MOV A, R0 ;取被加數(shù)一字節(jié) ADDC A, R1;兩數(shù)相加 MOV R0, A ;存和數(shù) INCR0;修改地址指針 INCR1 DJNZR2, LOOP CLRA;處理最高進(jìn)位 ADDCA, #0MOVR0, AINCSP;修改堆棧指針,指向斷點(diǎn)的保護(hù)單元INCSPINCSPINCSPINCSPRET;主程序;設(shè)被加數(shù)在內(nèi)部RAM的30H單元開始的區(qū)域,加數(shù)在50H開始的區(qū)域;長度均為8字節(jié)ORG2000HSTART:CLRRS1;選第0組工作寄存器CLRRS0MOVA, #30H;向堆棧壓入被加數(shù)地址PUSHAMOVA, #50H;壓入加數(shù)地址

27、PUSHAMOVA, #8;壓入字節(jié)長度PUSHAACALLMULTADD;調(diào)用,結(jié)果存放30H開始的單元POPA;彈出廢棄參數(shù)POPAPOPACLRRS1CLRRS0HERE:SJMPHERE第三章 匯編語言程序的基本結(jié)構(gòu) 現(xiàn)場保護(hù) 進(jìn)入子程序后,除了要處理的參數(shù)數(shù)據(jù)和要傳遞回主程序的參數(shù)之外,現(xiàn)場保護(hù) 有關(guān)的內(nèi)部RAM單元的內(nèi)容 工作寄存器的內(nèi)容 各標(biāo)志的狀態(tài) 現(xiàn)場保護(hù)方法 進(jìn)入子程序時(shí),將使用的或被改變的單元內(nèi)容壓堆棧 在返回前,把堆棧中數(shù)據(jù)彈出到原對應(yīng)的工作單元 對所使用的工作寄存器的保護(hù)可用改變工作寄存器組的方法第三章 匯編語言程序的基本結(jié)構(gòu) 子程序接口說明子程序接口說明子程序接口說

28、明對于程序結(jié)構(gòu)沒有實(shí)質(zhì)的影響,它是一些說明子程序功能的注釋文字,便于程序的使用及調(diào)試和修改專業(yè)的編程規(guī)范應(yīng)包含必要的子程序接口說明第三章 匯編語言程序的基本結(jié)構(gòu)子程序接口的說明主要包括 子程序名稱子程序功能:簡單描述完成的工作入口參數(shù)及格式:詳細(xì)說明各入口參數(shù)的意義,若傳遞的地址或通過堆棧傳數(shù)據(jù),還應(yīng)說明在內(nèi)部RAM或堆棧中的參數(shù)的格式、順序、用途出口參數(shù)及格式子程序中所使用的寄存器和工作單元調(diào)用:本子程序調(diào)用的其他子程序名稱第三章 匯編語言程序的基本結(jié)構(gòu) 例:通過調(diào)用子程序?qū)崿F(xiàn)延時(shí)100ms ;子程序名稱:DELAY ;功 能:延時(shí)1256ms,fOSC=12MHz,t=1us ;入 口 參

29、 數(shù):R3=延時(shí)的ms數(shù)(二進(jìn)制表示) ;出 口 參 數(shù):無 ;使用寄存器:R2、R3 ;調(diào) 用:無 DELAY: MOVR2, #0FAH;=250 LOOP: NOP;1tNOP;1tDJNZ R2, LOOP;2t,內(nèi)循環(huán)250 x4usDJNZ R3, DELAY;2tRET第三章 匯編語言程序的基本結(jié)構(gòu) ;主程序:PUSH PSW;保護(hù)程序狀態(tài)字MOVPSW, #08H;選擇工作寄存器1MOVR3, #64H;入口參數(shù)100ACALL DELAY;調(diào)用延時(shí)POPPSW;恢復(fù)程序狀態(tài)字:第三章 匯編語言程序設(shè)計(jì)舉例 一、查表程序 二、數(shù)制轉(zhuǎn)換程序 例:雙字節(jié)取補(bǔ):將R5、R4中的雙字節(jié)

30、二進(jìn)制數(shù)取補(bǔ),結(jié)果仍放在R5、R4中(LOR5,HIR4) DBCPL:MOVA, R5;取低字節(jié)CPLA;取反ADDA, #1;加一MOVR5, A;存結(jié)果MOVA, R4;取高字節(jié)XRLA, #7FH ;符號位不變,其余取反ADDC A, #0;加進(jìn)位MOVR4, A;存結(jié)果第三章 匯編語言程序設(shè)計(jì)舉例 三、算術(shù)運(yùn)算程序 例:多字節(jié)二進(jìn)制數(shù)減法:設(shè)被減數(shù)首地址存于R0,減數(shù)首地址存于R1,兩個(gè)數(shù)的字節(jié)長度存于R2,相減結(jié)果存于被減數(shù)所在單元,多字節(jié)二進(jìn)制數(shù)按低字節(jié)在前的順序存放 MSUB:CLRC;清進(jìn)位位 MSUB1:MOVA, R0;被減數(shù)最低字節(jié)SUBB A, R1;減MOVR0,

31、A;存INCR0;指向高一個(gè)字節(jié)INCR1DJNZ R2, MSUB1;循環(huán) CY位保存減法結(jié)果的借位狀態(tài)第三章 匯編語言程序設(shè)計(jì)舉例 例:多字節(jié)BCD數(shù)減法: 設(shè)被減數(shù)存于30H開始單元,減數(shù)存于40H開始單元,字節(jié)長度存于2FH,相減結(jié)果存于30H開始單元,多字節(jié)BCD數(shù)按低字節(jié)在前順序存放 由于MCS-51指令系統(tǒng)沒有提供減法結(jié)果的十進(jìn)制調(diào)整功能,只能將其變換為十進(jìn)制數(shù)加法,再進(jìn)行十進(jìn)制調(diào)整。方法是對減數(shù)進(jìn)行十進(jìn)制取補(bǔ)后再進(jìn)行十進(jìn)制加法運(yùn)算。9999減 數(shù)+01(-減數(shù))的補(bǔ)碼99H9AHBCD減數(shù)(-BCD減數(shù))的補(bǔ)碼第三章 匯編語言程序設(shè)計(jì)舉例 BCDSUB:MOVR0,#30HMO

32、VR1,#40HMOVR2,2FHMOVA,#9AHCLRC ;多字節(jié)BCD求補(bǔ) NEGS:SUBB A,R1MOVR1,A INCR1MOVA,#99HDJNZ R2,NEGS MOV R1,#40H ;多字節(jié)BCD加法MADD: CLR CMADD1:MOV A,R0 ADDC A,R1 DA A MOV R0,A INC R0 INC R1 DJNZ 2FH,MADD1第三章 匯編語言程序設(shè)計(jì)舉例 四、布爾運(yùn)算程序 例:設(shè)有邏輯表達(dá)式 其中 AP1.0 BP1.4 GTF1 D22H.0 E22H.3 FIE1 輸出 YP1.5)()(FEDGBAY第三章 匯編語言程序設(shè)計(jì)舉例 LOGI

33、C:MOVC,P1.4; BORLC,/TF1; +/GCPLC; /()ANLC,P1.0; *AMOVF0,C; 存MOVC,22H.3; EORLC,/IE1; +/FCPLC; /()ANLC,22H.0; *DORLC,F0; +MOVP1.5,C; 輸出SJMP $)()(FEDGBAY第三章 匯編語言程序設(shè)計(jì)舉例 五、定時(shí)程序 例:長時(shí)間的定時(shí)程序:采用多重循環(huán)的延時(shí)MOVR5,#TIME1;1t LOOP1:MOVR4,#TIME2;1t LOOP2:NOP;1tNOP;1tNOP;1tDJNZ R4,LOOP2;2tDJNZ R5,LOOP1;2t 內(nèi)循環(huán)一次占時(shí)5個(gè)機(jī)器周期

34、,最多循環(huán)256次,則內(nèi)循環(huán)最長占時(shí)5256個(gè)機(jī)器周期;外循環(huán)占時(shí)為內(nèi)循環(huán)占時(shí)加3個(gè)機(jī)器周期,這段程序的最長延時(shí) (2565+3)256+1=328,449t=656,898us(fOSC=6MHz)第三章 匯編語言程序設(shè)計(jì)舉例 六、排序與檢索程序 七、定時(shí)器編程 對8051單片機(jī)內(nèi)的兩個(gè)定時(shí)器初始化編程步驟 設(shè)置TMOD:根據(jù) 功能 工作方式 運(yùn)行方式 計(jì)算計(jì)數(shù)初值并預(yù)置計(jì)數(shù)寄存器TH、TL 若使用中斷系統(tǒng),則設(shè)置中斷控制寄存器IE、IP 啟動定時(shí)器工作第三章 匯編語言程序設(shè)計(jì)舉例 例:利用定時(shí)器0定時(shí),在P1.7引腳輸出周期為100ms的連續(xù)方波。設(shè)fOSC6MHz 分析:實(shí)現(xiàn)周期100

35、ms方波,即應(yīng)輸出50 ms高電平和50 ms低電平。用定時(shí)器0定時(shí)50ms,工作方式用方式1,采用中斷的方法使p1.7輸出邏輯取反,實(shí)現(xiàn)方波輸出 方式1,定時(shí),不用GATE位,TMOD=01H 初值: (216-X)2us = 501000us 得:X = 40536 = 9E58H TH0 = 9EH TL0 = 58H第三章 匯編語言程序設(shè)計(jì)舉例ORG0000HAJMPSTARTORG000BHAJMPT0ISRORG0060H START:MOVTMOD, #01H; 方式1,定時(shí)MOVTH0,#9EHMOVTL0,#58HSETBEA; 開中斷SETBET0; 允許T0中斷SETBT

36、R0; 啟動定時(shí)器 HERE:SJMPHEREORG0100H T0ISR:MOVTH0,#9EHMOVTL0,#58HCPLP1.7;取反,半周期RETI第三章 課后思考題n課后思考題:n3.2n3.3n3.5n3.6n3.8n3.9n3.13n3.16n3.17n3.19n3.20n3.21n3.22n3.24n3.25第三章 課后思考題n3.3 外部外部RAM中有首地址中有首地址SOURCE開始的長度為開始的長度為LEN的的數(shù)據(jù)塊,要求將該數(shù)據(jù)區(qū)傳送到內(nèi)部數(shù)據(jù)塊,要求將該數(shù)據(jù)區(qū)傳送到內(nèi)部RAM以以DEST地址地址開始的區(qū)域,直到遇見字符開始的區(qū)域,直到遇見字符“”(“”也要傳送也要傳送)

37、,或,或整個(gè)字符串傳送完畢。整個(gè)字符串傳送完畢。nSTART:MOVDPTR, #SOURCE;首地址nMOVR7, #LEN;長度nMOVR0,#DEST;目的地址nLOOP:MOVX A,DPTR;取數(shù)nMOVR0,AnINCR0nINCDPTRnCJNE A,$,NEXT;結(jié)束條件1nHERE:SJMP HEREnNEXT:DJNZ R7,LOOP;結(jié)束條件2nSJMP HERE第三章 課后思考題n例:在內(nèi)部例:在內(nèi)部RAM的的VAL單元有二進(jìn)制數(shù)單元有二進(jìn)制數(shù)x,計(jì)算,計(jì)算y,結(jié)果,結(jié)果存入存入RES.n方法1:用SUBB20,50205 , 845,4xxxxxy第三章 課后思考題n方法1:用SUBBnSTART:MOV A, VALn CLR Cn SUBB A, #20n JC BR1 ;=20n AJMP DONEnBR1: MOV A,VALn MOV B,#

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論