版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第四章匯編語言程序設(shè)計(jì)§4-1匯編語言源程序§4-2匯編語言程序設(shè)計(jì)§4-3匯編語言程序設(shè)計(jì)實(shí)例§4-1匯編語言源程序一、程序設(shè)計(jì)語言二、匯編語言源程序格式三、匯編語言偽指令四、目標(biāo)程序的生成一、程序設(shè)計(jì)語言(0)1、機(jī)器語言:直接使用微處理機(jī)指令機(jī)器碼編寫程序的語言稱作機(jī)器語言。由于微處理機(jī)指令機(jī)器碼(包括操作碼和操作數(shù))是以二進(jìn)制形式編碼和存儲(chǔ)的,所以用機(jī)器語言編寫的程序有以下特點(diǎn):⑴計(jì)算機(jī)唯一能夠直接識(shí)別、理解和執(zhí)行的程序,因此所有用其他語言編寫的程序最終都必須翻譯成機(jī)器語言才能運(yùn)行,所以機(jī)器語言程序也稱目標(biāo)程序;⑵程序難讀、難寫、難記、難交流、易出錯(cuò),從而給程序的設(shè)計(jì)、調(diào)試、維護(hù)帶來困難;⑶不同微處理機(jī)其指令機(jī)器碼不同,所以機(jī)器語言程序無通用性。一、程序設(shè)計(jì)語言(1)2、匯編語言:使用一套能夠反映微處理機(jī)指令功能、特征的助記符來表述指令,并使用標(biāo)號(hào)、序號(hào)等字符串來表達(dá)操作數(shù),按一定格式編寫程序的語言稱作匯編語言,其特征為:⑴用匯編語言編寫的匯編語言源程序必須經(jīng)過手工或機(jī)器匯編成機(jī)器語言目標(biāo)程序才能讓計(jì)算機(jī)執(zhí)行;⑵由于一套助記符是由反映指令功能和特征的英文縮減,所以能夠克服機(jī)器語言程序四難一易的缺點(diǎn),給程序的設(shè)計(jì)、調(diào)試、維護(hù)帶來方便;⑶未脫離“面向機(jī)器”的語言特點(diǎn),程序通用性、可移植性差。一、程序設(shè)計(jì)語言(2)3、高級(jí)語言:按約定方式使用一些接近書寫習(xí)慣的英語和數(shù)學(xué)表達(dá)形式編寫程序的語言稱作高級(jí)語言。其特點(diǎn)為:⑴用高級(jí)語言編寫的程序必須經(jīng)特定的編譯程序或解釋程序翻譯成機(jī)器語言才能讓計(jì)算機(jī)執(zhí)行;⑵與匯編語言一樣能克服機(jī)器語言程序四難一易的缺點(diǎn),給程序的設(shè)計(jì)、調(diào)試、維護(hù)帶來方便;⑶是“面向過程”的語言,使人們脫離了對(duì)機(jī)器本身的依賴,不但在編程時(shí)能集中精力在解決問題上,而且能使得編成的程序有一定通用性和較好的可移植性。一、程序設(shè)計(jì)語言(3)4、匯編語言與高級(jí)語言的比較:⑴在功能相同條件下,匯編語言源程序生成的目標(biāo)程序比高級(jí)語言源程序生成的目標(biāo)程序占用存儲(chǔ)單元少、執(zhí)行速度快,一般有速度要求場所盡可能采用匯編語言編寫源程序;⑵為了獲取目標(biāo)程序而使用的工具,匯編程序比解釋程序或編譯程序簡單要得多,所占存儲(chǔ)單元約為后者的1/2至1/10;⑶由于匯編語言的“面向機(jī)器”性,能更合理地使用計(jì)算機(jī)硬件資源,所以在檢測、控制、數(shù)據(jù)采集、通訊等場合比高級(jí)語言編程更方便、簡捷。二、匯編語言源程序格式
匯編語言源程序由源語句組成,其語句結(jié)構(gòu)四要素按書寫次序依次為:1、標(biāo)號(hào);2、操作碼;3、操作數(shù);4、注釋。匯編語言源程序的源語句標(biāo)號(hào)操作碼操作數(shù)注釋三、匯編語言偽指令(0)
1、
偽指令的作用:偽指令用于控制匯編程序?qū)R編語言源程序匯編成機(jī)器語言目標(biāo)程序的匯編過程,故可稱其為“匯編命令”。2、
偽指令的特點(diǎn):⑴偽指令只是控制匯編語言源程序變成機(jī)器語言目標(biāo)程序的匯編過程的命令,不會(huì)使CPU產(chǎn)生任何特定操作;⑵其種類的多少只與匯編程序本身的約定有關(guān),與微處理機(jī)的種類無關(guān);⑶偽指令沒有相應(yīng)的機(jī)器代碼。三、匯編語言偽指令(1)⑴ORG偽指令:定義起始地址偽指令格式:ORG16位地址A、
ORG偽指令的前面可以有或無標(biāo)號(hào);B、ORG偽指令的后面必須有操作數(shù),即指定的起始地址。⑵EQU偽指令:給標(biāo)號(hào)賦值偽指令格式:標(biāo)號(hào)EQU已定義過的標(biāo)號(hào)或數(shù)據(jù)A、
EQU偽指令的前面必須有標(biāo)號(hào)段;B、
EQU偽指令的后面必須有常數(shù)、地址、已定義過的標(biāo)號(hào)等作操作數(shù)段;注意:一個(gè)標(biāo)號(hào)在源程序中只能賦值一次。三、匯編語言偽指令(2)⑶DB(DCB)偽指令:定義字節(jié)內(nèi)容即以字節(jié)為單位依次存入存儲(chǔ)單元中的偽指令格式:(標(biāo)號(hào))DB1至8項(xiàng)的8位數(shù)據(jù)A、DB偽指令的前面可以有標(biāo)號(hào),也可以無標(biāo)號(hào);B、DB偽指令的后面必須有匯編程序約定的1、4、8項(xiàng)8位數(shù)據(jù);C、
多項(xiàng)數(shù)據(jù)必須以逗號(hào)分開。三、匯編語言偽指令(3)⑷DW(DCW)偽指令:定義字內(nèi)容即以字為單位先低字節(jié)、后高字節(jié)依次存入存儲(chǔ)單元中的偽指令(注意:也有先高字節(jié)、后低字節(jié)的約定)格式:(標(biāo)號(hào))DW1至8項(xiàng)的16位數(shù)據(jù)A、DW偽指令的前面可以有標(biāo)號(hào),也可以無標(biāo)號(hào);B、
DW偽指令的后面必須有匯編程序約定的1、4、8項(xiàng)16位數(shù)據(jù);C、多項(xiàng)數(shù)據(jù)必須以逗號(hào)分開。三、匯編語言偽指令(4)⑸DS(DSB)偽指令:定義以字節(jié)為單位保留空間格式:(標(biāo)號(hào))DS數(shù)值A(chǔ)、DS偽指令的前面可以有標(biāo)號(hào),也可以無標(biāo)號(hào);B、DS偽指令的后面必須是一個(gè)常數(shù)項(xiàng)。例:
LEDH: DS 10H ;此處保留16個(gè)單元⑹DSW偽指令:定義以字為單位保留空間格式:(標(biāo)號(hào))DSW數(shù)值A(chǔ)、DSW偽指令的前面可以有標(biāo)號(hào),也可以無標(biāo)號(hào);B、
DSW偽指令的后面必須是一個(gè)常數(shù)項(xiàng)。例:
LCDH: DSW 10H ;保留32個(gè)單元供緩沖三、匯編語言偽指令(5)⑺bit偽指令:定義特定位格式:標(biāo)號(hào)bit位地址或符號(hào)A、bit偽指令的前面必須有標(biāo)號(hào);B、bit偽指令的后面可以是被定義的位地址或位符號(hào);C、定義后即可用該標(biāo)號(hào)代替指定的位。三、匯編語言偽指令(6)⑻END偽指令:程序結(jié)束偽指令格式:END(標(biāo)號(hào)或地址)A、END偽指令后面可以有或無標(biāo)號(hào)、地址,若有則匯編結(jié)束后即從該標(biāo)號(hào)指定的地址開始執(zhí)行程序;B、END偽指令表示源程序的結(jié)束,匯編程序?qū)ζ浜竺娴膬?nèi)容將不再理睬。四、目標(biāo)程序的生成
1、手工匯編:對(duì)照匯編語言指令表,將匯編語言源程序正確翻譯成機(jī)器語言目標(biāo)程序,注意多字節(jié)指令中的機(jī)器碼次序。2、機(jī)器匯編:借助于PC機(jī)及匯編程序等工具將匯編語言源程序翻譯成機(jī)器語言目標(biāo)程序。通常匯編語言源程序的文件擴(kuò)展名為“.ASM”,匯編后生成擴(kuò)展名為“.HEX”的十六進(jìn)制機(jī)器碼文件和擴(kuò)展名為“.LST”的列表文件等?!?-2匯編語言程序設(shè)計(jì)一、匯編語言程序設(shè)計(jì)步驟二、程序流程圖三、結(jié)構(gòu)程序設(shè)計(jì)基本模塊四、子程序一、匯編語言程序設(shè)計(jì)步驟
1、根據(jù)實(shí)際問題抽象出數(shù)學(xué)模型;2、結(jié)合所使用CPU特點(diǎn)確定解決問題的算法;3、根據(jù)算法思路列出程序流程圖;4、分配寄存器、內(nèi)存單元,組織數(shù)據(jù);5、按照流程圖編寫程序;6、手工或機(jī)器匯編后得到機(jī)器語言目標(biāo)程序;7、借助于開發(fā)工具調(diào)試和修改程序。二、程序流程圖(1)1、
流程圖的作用:流程圖是對(duì)程序執(zhí)行過程的圖解表示法,它往往比文字描述更為直觀和有效。其最大特點(diǎn)為各個(gè)功能部分以時(shí)間為線索有機(jī)地聯(lián)系起來。從時(shí)間順序上看整個(gè)過程條理井然,所以不僅在程序設(shè)計(jì)中使用,還廣泛地使用在非計(jì)算機(jī)操作的其他場合。二、程序流程圖(2)2、
流程圖的符號(hào):最常用的流程圖符號(hào)有以下幾種:⑴處理框圖:表示數(shù)據(jù)處理、數(shù)據(jù)傳送、輸入/輸出、某種功能等(矩形框)⑵邏輯判斷框圖:有兩個(gè)走向,根據(jù)條件判斷決定程序的去向(棱形)⑶子程序框圖:表示調(diào)用子程序(處理框圖中的兩端加兩豎)⑷起始與終止框圖:表示程序的開始或結(jié)束(鼓形)⑸連接點(diǎn)框圖:表示程序的連接點(diǎn),常用于不同頁碼中程序的連接(小圓)⑹連接箭頭符:表示程序的連接與走向(帶箭頭線條)圖例常用流程圖的符號(hào)⑴處理框圖⑷起始與終止框圖⑵邏輯判斷框圖⑸連接點(diǎn)框圖⑶子程序框圖⑹連接箭頭符n返回二、程序流程圖(3)3、流程圖的優(yōu)缺點(diǎn):優(yōu)點(diǎn):⑴通俗易理解,即使對(duì)于沒有程序設(shè)計(jì)知識(shí)的人也能方便地讀懂;⑵流程圖可粗可細(xì),故可把設(shè)計(jì)分成若干個(gè)子任務(wù),根據(jù)對(duì)流程圖的評(píng)價(jià)即能評(píng)價(jià)任務(wù)進(jìn)展情況;⑶流程圖以時(shí)間順序?yàn)榫€索表示操作過程,故有利于確定須修改的錯(cuò)誤源;⑷流程圖除程序設(shè)計(jì)之外,還可廣泛使用于其他領(lǐng)域。缺點(diǎn):⑴沒有對(duì)流程圖本身查錯(cuò)與測試的簡易方法;⑵流程圖只能表示程序的組織結(jié)構(gòu),表示不了其數(shù)據(jù)結(jié)構(gòu);⑶流程圖對(duì)于硬件結(jié)構(gòu)及定時(shí)問題沒有幫助;⑷復(fù)雜程序流程圖往往很難設(shè)計(jì),難度甚至超過設(shè)計(jì)程序的本身。三、結(jié)構(gòu)程序設(shè)計(jì)基本模塊
(1)結(jié)構(gòu)程序設(shè)計(jì)的特點(diǎn)是采用單入口、單出口模塊,基本模塊有三種:1、
順序結(jié)構(gòu)模塊:即一種線性結(jié)構(gòu)的模塊,模塊中的指令語句或指令集將被順序執(zhí)行。
2、
條件結(jié)構(gòu)模塊:條件結(jié)構(gòu)模塊是根據(jù)某種條件選擇程序走向的一種選擇結(jié)構(gòu),它是分支結(jié)構(gòu)的基礎(chǔ),是程序賦予計(jì)算機(jī)某種人工智能的重要手段。條件結(jié)構(gòu)模塊中,借以判斷條件的內(nèi)容,主要是程序狀態(tài)字PSW中的標(biāo)志位,其次也可以是編程者設(shè)定的特殊標(biāo)志或程序運(yùn)行結(jié)果等。3、
循環(huán)結(jié)構(gòu)模塊:程序中,在某種條件下往往要求某一段程序重復(fù)執(zhí)行多次,這時(shí)候可以采用循環(huán)結(jié)構(gòu)。
圖例圖例另外循環(huán)結(jié)構(gòu)模塊循環(huán)結(jié)構(gòu)模塊包括三個(gè)部分:⑴循環(huán)主體:即要求重復(fù)執(zhí)行的程序段,包括循環(huán)工作部分和循環(huán)控制部分;⑵循環(huán)條件:即循環(huán)結(jié)束的條件,最常見的循環(huán)條件是計(jì)數(shù)循環(huán),當(dāng)循環(huán)一定次數(shù)后就結(jié)束循環(huán),計(jì)數(shù)可以采用增或減方式;⑶循環(huán)初態(tài):即循環(huán)開始時(shí)的必要條件,包括循環(huán)工作部分的初態(tài)及循環(huán)條件部分的初態(tài)。例如多字節(jié)帶進(jìn)位加法循環(huán)時(shí),循環(huán)工作部分初態(tài)應(yīng)清進(jìn)位標(biāo)志C并設(shè)置地址指針,字節(jié)計(jì)數(shù)器的初態(tài)可預(yù)置循環(huán)次數(shù),再逐一減到0,也可以先清0,再逐一增加直到與循環(huán)次數(shù)相等時(shí)再結(jié)束循環(huán)。圖例三、結(jié)構(gòu)程序設(shè)計(jì)基本模塊(2)4、
選擇結(jié)構(gòu)模塊:選擇結(jié)構(gòu)有時(shí)也稱分支結(jié)構(gòu),雖不屬于結(jié)構(gòu)程序設(shè)計(jì)的基本模塊,但它用得十分普遍,以致可以作為結(jié)構(gòu)程序設(shè)計(jì)的輔助結(jié)構(gòu)模塊。5、
結(jié)構(gòu)程序設(shè)計(jì)的特點(diǎn):⑴只允許三種基本結(jié)構(gòu)及少量輔助結(jié)構(gòu);⑵結(jié)構(gòu)可以嵌套到任意復(fù)雜的程度;⑶每個(gè)模塊只允許一個(gè)入口和一個(gè)出口。四、子程序(1)
1、
什么是子程序?編寫匯編語言源程序時(shí),把經(jīng)常用到的一些程序段落編寫成一個(gè)相對(duì)獨(dú)立的程序,用到時(shí)可以隨意調(diào)用并能自動(dòng)返回。被調(diào)用的程序稱作子程序;調(diào)用子程序的程序稱作主程序。子程序的調(diào)用是匯編語言程序設(shè)計(jì)中的一種很重要的手段,微處理機(jī)指令系統(tǒng)中往往都設(shè)置有專門用于子程序調(diào)用和返回的指令。四、子程序(2)2、子程序的操作過程:調(diào)用子程序的過程也像程序轉(zhuǎn)移一樣是通過修改程序計(jì)數(shù)器PC中的數(shù)值來實(shí)現(xiàn)的,它與一般程序轉(zhuǎn)移過程的區(qū)別在于:子程序調(diào)用時(shí),總是先將程序計(jì)數(shù)器PC的值壓入堆棧中保護(hù)起來。由于子程序總是以RET指令結(jié)束,它將主程序調(diào)用時(shí)PC的值從堆棧彈回,從而使程序能夠返回主程序的調(diào)用處。這種設(shè)計(jì)的實(shí)現(xiàn)完全依賴于堆棧的先進(jìn)后出特性,并須使返回主程序時(shí)的堆棧指針SP值與調(diào)用之時(shí)相等,否則將無法保證程序的正確返回。四、子程序(3)3、子程序的編寫要點(diǎn):⑴子程序的第1條語句必須要有標(biāo)號(hào),以便作為調(diào)用指令的調(diào)用名稱;⑵子程序必須以RET指令結(jié)束,以便能夠正確返回主程序;⑶子程序應(yīng)有操作功能說明,以便調(diào)用時(shí)參考;⑷子程序應(yīng)該注明入口條件,便于調(diào)用時(shí)設(shè)法給予滿足;⑸子程序應(yīng)該標(biāo)注出口條件,便于主程序的很好銜接。四、子程序(4)4、子程序中數(shù)據(jù)保護(hù):為了防止子程序中所使用的寄存器的內(nèi)容被修改后對(duì)主程序的錯(cuò)誤影響,應(yīng)充分考慮到子程序執(zhí)行過程中這些寄存器中內(nèi)容的變化,這種變化有兩種可能,一種是須帶給主程序的操作結(jié)果,另一種是不能帶給主程序、與主程序無關(guān)的中間結(jié)果。對(duì)于與主程序無關(guān)的中間結(jié)果若傳遞給主程序?qū)⑹钩绦虍a(chǎn)生錯(cuò)誤。因此,必須采取措施對(duì)主程序中所用到而子程序也必須使用的寄存器在調(diào)用子程序之時(shí)對(duì)其內(nèi)容進(jìn)行保護(hù)。對(duì)于MCS-51CPU其子程序中數(shù)據(jù)保護(hù)方法通常有以下三種:⑴利用四組工作寄存器互換的方法,使主程序與子程序使用不同組別工作寄存器,從而可以保護(hù)工作寄存器R0~R7中的數(shù)據(jù)不受破壞;⑵利用堆棧的先進(jìn)后出特性,將主程序與子程序中均需使用的寄存器中內(nèi)容在進(jìn)入子程序時(shí)依次壓入堆棧保護(hù)起來,返回主程序前再依次彈出恢復(fù);⑶將主程序與子程序均需使用的寄存器中內(nèi)容在剛進(jìn)入子程序時(shí)暫用其它空閑寄存器寄存,返回主程序前取回。四、子程序(5)5、子程序中參數(shù)傳遞:被調(diào)用的子程序與調(diào)用的主程序之間有參數(shù)需要傳遞時(shí),視須傳遞的參數(shù)量的多少分別采用以下三種方法實(shí)現(xiàn):⑴參數(shù)量很少時(shí),往往利用指定的寄存器進(jìn)行;例如:將一個(gè)字節(jié)壓縮BCD碼轉(zhuǎn)換成2位ASCII碼的子程序中,可指定:
R0中存放被轉(zhuǎn)換的壓縮BCD碼作為入口條件;
R0中存放低位BCD碼的ASCII碼、R1中存放高位BCD碼的ASCII碼為出口狀態(tài)。⑵參數(shù)量較少時(shí),往往可利用堆棧來進(jìn)行參數(shù)傳遞;⑶參數(shù)量較多時(shí),往往需開辟一個(gè)公共存儲(chǔ)區(qū)域作為主程序與子程序的數(shù)據(jù)共享區(qū)域,此時(shí),只需在主程序、子程序中分別指定數(shù)據(jù)區(qū)域的數(shù)據(jù)指針即可?!?-3匯編語言程序設(shè)計(jì)實(shí)例一、數(shù)據(jù)傳送程序二、數(shù)值運(yùn)算程序三、數(shù)碼處理程序四、數(shù)值處理程序五、其它處理程序一、數(shù)據(jù)傳送程序例4-3-1:請(qǐng)編寫將片內(nèi)RAM中20H開始的8個(gè)單元中的數(shù)據(jù)傳送到70H開始的單元之中的程序。例4-3-2:請(qǐng)編寫將片內(nèi)RAM區(qū)20H單元開始的16單元數(shù)據(jù)傳送到片外RAM的4000H單元開始的存儲(chǔ)單元中的程序。例4-3-3:試編寫將程序存儲(chǔ)器區(qū)1800H單元開始的16字節(jié)數(shù)據(jù)傳送到片內(nèi)RAM區(qū)的60H為首地址單元中的程序。流程程序程序程序二、數(shù)值運(yùn)算程序例4-3-4:請(qǐng)編寫多字節(jié)無符號(hào)二進(jìn)制數(shù)加法程序。被加數(shù)、加數(shù)分別存放在片內(nèi)以ADR1、ADR2為首地址的RAM中,數(shù)據(jù)以低字節(jié)放低地址、高字節(jié)放高地址的規(guī)律依次存放,其字節(jié)數(shù)存放在工作寄存器R7中,加得的結(jié)果放回被加數(shù)原存放單元。例4-3-5:請(qǐng)編寫16位數(shù)乘16位數(shù)的無符號(hào)數(shù)乘法子程序。例4-3-6:請(qǐng)編寫用查表法求片內(nèi)RAM區(qū)60H單元中數(shù)的平方值,結(jié)果存入其后面二個(gè)單元中的程序。程序程序程序三、數(shù)碼處理程序例4-3-7:請(qǐng)編寫將一個(gè)十六進(jìn)制數(shù)據(jù)串轉(zhuǎn)換為ASCII碼的程序,該十六進(jìn)制數(shù)據(jù)串存放于起始地址為ADR1的內(nèi)存區(qū)域中,轉(zhuǎn)換后的結(jié)果存放到以ADR2為起始地址的內(nèi)存區(qū)域中去,字節(jié)串的長度在工作寄存器R7中。例4-3-8:請(qǐng)編寫將累加器A中的ASCII碼轉(zhuǎn)換為16進(jìn)制數(shù)后存放于數(shù)據(jù)存儲(chǔ)器區(qū)1000H單元之中的程序,若A中ASCII碼內(nèi)容非為16進(jìn)制數(shù),則該單元內(nèi)容置FFH。例4-3-9:若待轉(zhuǎn)換的BCD碼以非壓縮BCD碼形式存放在累加器A中,試用查表方式編寫一位BCD碼轉(zhuǎn)換成ASCII碼后結(jié)果仍在累加器A中的子程序。程序程序程序四、數(shù)值處理程序例4-3-10:請(qǐng)編寫在片外數(shù)據(jù)存儲(chǔ)器區(qū)2000H單元開始的32個(gè)字節(jié)中尋找最大值后存放到片內(nèi)RAM的68H單元中的程序。例4-3-11:請(qǐng)編寫統(tǒng)計(jì)片外數(shù)據(jù)存儲(chǔ)器區(qū)2000H單元開始的256單元中ASCII碼字符A的個(gè)數(shù)的程序,統(tǒng)計(jì)數(shù)據(jù)存放在片內(nèi)RAM的6FH單元中。例4-3-12:請(qǐng)編寫程序,將片外RAM區(qū)1000H單元開始的30個(gè)短整數(shù)按正、負(fù)數(shù)分開存儲(chǔ),正數(shù)從30H單元開始存放,負(fù)數(shù)從40H單元開始存放,假設(shè)這些被使用單元已被清零。例4-3-13:請(qǐng)編寫將片內(nèi)RAM區(qū)中30H~3AH單元中十一個(gè)字節(jié)數(shù)據(jù)按從大到小規(guī)律排序的程序。例4-3-14:請(qǐng)編寫將片內(nèi)RAM區(qū)30H~3AH單元中十一個(gè)已從大到小排序的字節(jié)數(shù)據(jù)去除1個(gè)最大值、去除1個(gè)最小值后再取平均值的數(shù)值濾波程序。若平均值大于等于100,則置7FH單元為全1,否則將該單元清零。程序程序程序程序程序五、其它處理程序例4-3-15:若MCS-51系統(tǒng)主頻為12MHz,試編寫延時(shí)1毫秒子程序。例4-3-16:系統(tǒng)主頻仍為12MHz,試編寫延時(shí)1秒程序。例4-3-17:編寫根據(jù)面板上撥碼開關(guān)從0~9的設(shè)置,轉(zhuǎn)入TP0~TP9相應(yīng)分支程序的程序,撥碼開關(guān)的地址為8000H。程序程序程序本章總結(jié)1、匯編語言程序源語句的構(gòu)成2、匯編語言源程序中的偽指令3、匯編語言源程序設(shè)計(jì)方法4、子程序及其設(shè)計(jì)5、匯編語言程序設(shè)計(jì)及調(diào)試C51簡介FranklinC51的數(shù)據(jù)類型C51簡介C51存儲(chǔ)類型和51系統(tǒng)存儲(chǔ)空間的對(duì)應(yīng)關(guān)系chardataval; //片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)00H-FFFHbitbdataflag; //片內(nèi)位尋址區(qū)20H-2FHfloatidatax; //片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū),間接尋址方法訪問unsignedint
pdatay; //片外數(shù)據(jù)存儲(chǔ)區(qū),用MOVX@R0訪問unsignedcharxdata
abc; //片外數(shù)據(jù)存儲(chǔ)區(qū), //用MOVX@DPTR訪問C51簡介C51的數(shù)據(jù)存儲(chǔ)模式及說明#pragmalargeC51簡介常用的頭文件#include<math.h>#include<reg51.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<absacc.h>C51簡介sbitCON=P1^0;sbitSTATUS=P1^4;voidDelay1ms(void){TMOD=0x51; //T1:Counter,T0:TimerTR0=0,TF0=0,TH0=0x0fc,TL0=0x18; //65536-0x0fc18:1msTR0=1;while(TF0==0);TF0=0,TR0=0;}voidDelaynms(int
nms){registerinti;
for(i=0;i<nms;i++)Delay1ms();}C51簡介voidmain(void){STATUS=1;for(;;){Delaynms(1000);CON=STATUS;}}本章作業(yè)4-44-64-9改為:x2.5+y4-12例4-3-1程序流程
開始結(jié)束設(shè)置源數(shù)據(jù)指針設(shè)置目標(biāo)地址指針設(shè)置循環(huán)次數(shù)次數(shù)到?獲取源數(shù)據(jù)修正源地址指針傳送到目標(biāo)地址修正目標(biāo)地址指針11YN返回例4-3-1源程序清單
ORG 0100H MOV R0,#20H ;源數(shù)據(jù)地址指針MOVR1,
#70H;目標(biāo)地址指針
MOV R7,#08H ;取傳送字節(jié)數(shù)LP:MOV A,@R0 ;取源數(shù)據(jù)
MOV @R1,A ;數(shù)據(jù)傳送到目標(biāo)地址INC R0 ;源數(shù)據(jù)地址指針+1INC R1 ;目標(biāo)地址指針+1 DJNZ R7,LP ;未傳送完則循環(huán)
NOP ;結(jié)束返回例4-3-2源程序清單解:用工作寄存器和數(shù)據(jù)指針分別作為源數(shù)據(jù)及目標(biāo)地址的指針。
ORG 0200H MOV R0,#20H;工作寄存器R0指向源數(shù)據(jù)首址
MOV DPTR,#4000H ;數(shù)據(jù)指針指向目標(biāo)地址
MOV R7,#10H ;取傳送數(shù)據(jù)的字節(jié)數(shù)MLP: MOV A,@R0 ;取源數(shù)據(jù)
MOVX @DPTR,A ;送入目標(biāo)地址
INC R0 ;修正源地址指針
INC DPTR ;修正目標(biāo)地址指針
DJNZ R7,MLP ;未送完則循環(huán)
NOP ;送完則結(jié)束返回例4-3-3源程序清單解:數(shù)據(jù)指針和堆棧指針分別作為源數(shù)據(jù)地址和目標(biāo)地址的指針。
ORG 0300H MOV R6,SP ;暫存保護(hù)堆棧指針
MOV DPTR,#1800H;指針指向源數(shù)據(jù)首地址
MOV R0,#60H ;R0指向目標(biāo)地址首地址
MOV R7,#10H ;取傳送數(shù)據(jù)的字節(jié)數(shù)CLP:CLR A ;清累加器
MOVCA,@A+DPTR ;獲取源數(shù)據(jù)
MOV @R0,A ;存放數(shù)據(jù)到目標(biāo)地址
INC DPTR ;修正源地址指針
INC R0 ;修正目標(biāo)地址指針
DJNZ R7,CLP ;未完成則循環(huán)
NOP ;完成則結(jié)束返回例4-3-4源程序清單解:ADR1 EQU 40H ;指定被加數(shù)存放首地址ADR2 EQU 60H ;指定加數(shù)存放首地址
ORG 0030H MOV R0,#ADR1 ;R0指向被加數(shù)首址
MOV R1,#ADR2 ;R1指向加數(shù)首地址
CLR C;清進(jìn)位標(biāo)志為帶進(jìn)位相加作準(zhǔn)備LP: MOV A,@R0 ;取一個(gè)字節(jié)被加數(shù)
ADDC A,@R1 ;加上一個(gè)字節(jié)加數(shù)
MOV @R0,A ;結(jié)果放回原地址
INC R0 ;修正被加數(shù)數(shù)據(jù)指針
INC R1 ;修正加數(shù)數(shù)據(jù)指針
DJNZ R7,LP ;是否加完未完轉(zhuǎn)移
NOP ;做完則結(jié)束處可加斷點(diǎn)返回例4-3-5源程序算法原理子程序功能:16位×16位得到32位的積子程序入口:被乘數(shù)a、b在工作寄存器R7、R6中,乘數(shù)c、d在R5、R4中子程序出口:R0所指片內(nèi)RAM單元為乘積高字節(jié)所使用資源:部分乘積存放R3、R2中,進(jìn)位位暫存R1中算法:ab×cd
bdH
bdL
adH
adL
bcH
bcL+acH
acL=MR3MR2MR1MR用MUL指令分4次求積,按列求和,即可得到32位的乘積。例4-3-5源程序清單(1)MUL1: MOV A,R6 ;取被乘數(shù)低位b MOV B,R4 ;取乘數(shù)低位d MUL AB ;得到bdH和bdL MOV @R0,A ;結(jié)果bdL放到目標(biāo)地址單元
MOV R3,B ;暫存bdH MOV A,R7 ;取被乘數(shù)高位a MOV B,R4 ;取乘數(shù)低位d MUL AB ;得到adH和adL ADD A,R3 ;得到adL+bdH MOV R3,A ;暫存adL+bdH MOV A,B ;將adH取入累加器A ADDC A,#00H ;adH加上進(jìn)位標(biāo)志C MOV R2,A ;暫存adH MOV A,R6 ;取被乘數(shù)低位b MOV B,R5 ;取乘數(shù)高位c MUL AB ;得到bcH和bcL ADD A,R3 ;得到bcL+adL+bdH INC R0 ;修正存放地址指針
MOV @R0,A;結(jié)果bcL+adL+bdH放目標(biāo)地址單元例4-3-5源程序清單(2)
CLR R1 ;清進(jìn)位標(biāo)志暫存單元
MOV A,R2 ;將adH取入累加器A ADDC A,B ;得到bcH+adH+“C” MOV R2,A ;暫存中間結(jié)果
JNC LAST ;無進(jìn)位時(shí)跳轉(zhuǎn)
INC R1 ;有進(jìn)位時(shí)暫存進(jìn)位標(biāo)志CLAST: MOV A,R7 ;取被乘數(shù)高位a MOV B,R5 ;取乘數(shù)高位c MUL AB ;得到acH和acL ADD A,R2 ;得到acL+bcH+adH INC R0 ;修正目標(biāo)地址指針
MOV @R0,A ;存放結(jié)果acL+bcH+adH到目標(biāo)地址單元
MOV A,B ;acH取入累加器A ADDC A,R1 ;加上進(jìn)位標(biāo)志暫存結(jié)果
INC R0 ;修正目標(biāo)地址指針
MOV @R0,A ;存結(jié)果acH到目標(biāo)地址單元
RET ;結(jié)束返回主程序返回例4-3-6源程序清單
ORG 0400H MOV A,60H ;取源操作數(shù)
RL A ;操作數(shù)左移1位即乘2 MOV R3,A ;保護(hù)操作數(shù)乘2后的值
MOV DPTR,#TABM ;指針指向平方值表首址
MOVC A,@A+DPTR ;讀取平方值的低位結(jié)果
MOV 61H,A ;存放低位結(jié)果
MOV A,R3 ;重取操作數(shù)乘2后的值
INC A ;指向其下一單元即高位
MOVC A,@A+DPTR ;讀取平方值的高位結(jié)果
MOV 62H,A ;存放高位結(jié)果
SJMP $ ;表示程序結(jié)束的自循環(huán)
ORG 1000HTABM:DB 00H,00H,01H,00H,04H,00H,09H,00HDB 10H,00H,19H,00H,24H,00H,31H,00HDB 40H,00H,51H,00H,………返回例4-3-7源程序清單(1)‘1’-‘9;:+30H;’A’-’F’:+37HADR1 EQU 60H ;定義十六進(jìn)制數(shù)據(jù)串的起始地址ADR2 EQU 20H ;定義ASCII碼結(jié)果存放起始地址
ORG 0030H ;指定程序起始地址
MOV R0,#ADR1 ;R0指向十六進(jìn)制數(shù)據(jù)
MOV R1,#ADR2 ;R1指向結(jié)果存放地址HCAL0: MOV A,@R0 ;累加器A中取入一字節(jié)十六進(jìn)制數(shù)
ANL A,#0FH ;屏蔽高半字節(jié),先轉(zhuǎn)換低半字節(jié)
MOV R2,A ;暫存低半字節(jié)
ADD A,#0F6H; 加246后有否進(jìn)位判別是否大于10MOV A,R2 ;取回低半字節(jié)十六進(jìn)制數(shù)
JNC HCAL1 ;無進(jìn)位即小于10,跳過下一條指令
ADD A,#07H ;有進(jìn)位須加7HCAL1 ADD A,#30H ;加30H轉(zhuǎn)換成ASCII碼
MOV @R1,A ;存放轉(zhuǎn)換結(jié)果的ASCII碼例4-3-7源程序清單(2)
INC R1 ;修正結(jié)果存放地址指針
MOV A,@R0 ;重取該字節(jié)十六進(jìn)制數(shù)
ANL A,#0F0H ;屏蔽低半字節(jié)轉(zhuǎn)換高半字節(jié)
SWAP A ;高字節(jié)十六進(jìn)制數(shù)放到低位
MOV R2,A ;暫存高半字節(jié)內(nèi)容
ADD A,#0F6H ;加246后有否進(jìn)位判別是否大于10MOV A,R2 ;取回高半字節(jié)十六進(jìn)制數(shù)
JNC HCAL2 ;無進(jìn)位即小于10,跳過下一條指令
ADD A,#07H ;有進(jìn)位須加7HCAL2: ADD A,#30H ;加30H轉(zhuǎn)換成ASCII碼
MOV @R1,A ;存放轉(zhuǎn)換結(jié)果的ASCII碼
INC R1 ;修正結(jié)果存放地址指針
INC R0 ;修正十六進(jìn)制數(shù)據(jù)指針
DJNZ R7,HCAL0 ;判是否完成轉(zhuǎn)換,未結(jié)束轉(zhuǎn)
NOP ;結(jié)束,此處可設(shè)斷點(diǎn)返回例4-3-8源程序清單(1)解: MOV R7,A ;保護(hù)源操作數(shù)
CLR C ;為做減法而清進(jìn)位標(biāo)志
SUBB A,#47H ;是否非十六進(jìn)制數(shù)
JC LP1 ;有借位即是十六進(jìn)制數(shù)轉(zhuǎn)移
SJMP LP4 ;非十六進(jìn)制數(shù)轉(zhuǎn)移
LP1: MOV A,R7 ;重取ASCII碼
CLR C ;為做減法而清進(jìn)位標(biāo)志
SUBB A,#41H ;是否十六進(jìn)制數(shù)的A至F JC LP2 ;不是則轉(zhuǎn)移
ADD A,#0AH ;是則加10即為十六進(jìn)制數(shù)A至F SJMP LP5 ;轉(zhuǎn)出口存儲(chǔ)例4-3-8源程序清單(2)
LP2: MOV A,R7 ;重取ASCII碼
CLR C ;為做減法而清進(jìn)位標(biāo)志
SUBB A,#3AH ;是否十六進(jìn)制數(shù)0至9等
JC LP3 ;是則轉(zhuǎn)移
SJMP LP4 ;非十六進(jìn)制數(shù)轉(zhuǎn)移
LP3: MOV A,R7 ;重取ASCII碼
CLR C ;為做減法而清進(jìn)位標(biāo)志
SUBB A,#30H ;是否十六進(jìn)制數(shù)的0至9 JNC LP5 ;是則轉(zhuǎn)移
LP4: MOV A,#0FFH ;不是則取FFHLP5: MOV DPTR,#1000H ;數(shù)據(jù)指針指向目標(biāo)地址
MOVX @DPTR,A ;存儲(chǔ)結(jié)果
SJMP $ ;表示程序結(jié)束的自循環(huán)返回例4-3-9源程序清單(1)解:MCS-51查表方式可有遠(yuǎn)程查表和近程查表2種方式,分別以TABS1和TABS2表示:TABS1 MOV DPTR,#TAB
;數(shù)據(jù)指針指向表格首地址
MOVC A,@A+DPTR
;查表得到對(duì)應(yīng)的ASCII碼
RET ;返回主程序TAB DB 30H ;0的ASCII碼
DB 31H ;1的ASCII碼 ∶
DB 39H ;9的ASCII碼以上為利用數(shù)據(jù)指針DPTR的遠(yuǎn)程查表,其特點(diǎn)應(yīng)為ASCII碼表格可存放在64K程序存儲(chǔ)器的任何位置上。例4-3-9源程序清單(2)以下利用程序計(jì)數(shù)器PC的近程查表,其ASCII碼表格必須緊跟在轉(zhuǎn)換子程序的后面,即使子程序結(jié)束時(shí)有一條返回主程序的RET指令介在中間,也必須修正累加器A中的內(nèi)容以抵消其影響。子程序如下:TABS2 INC A ;修正累加器A中內(nèi)容抵消RET指令影響
MOVC A,@A+PC
;查表得到對(duì)應(yīng)的ASCII碼②
22 RET ;返回主程序TAB: DB 30H ;0的ASCII碼
DB 31H ;1的ASCII碼 ∶
DB 39H ;9的ASCII碼
返回例4-3-10源程序清單解: MOV DPTR,#2000H
;數(shù)據(jù)指針指向源數(shù)據(jù)首址
MOV R7,#1FH
;設(shè)置循環(huán)比較次數(shù)
MOVXA,@DPTR;取第一個(gè)操作數(shù)
MOV 68H,A;設(shè)為最大值保存到目標(biāo)中LOOP: INC DPTR ;調(diào)整數(shù)據(jù)指針
MOVXA,@DPTR;取下一個(gè)操作數(shù)
CJNE A,68H,LOP
;取入數(shù)據(jù)是否比目標(biāo)單元內(nèi)容大LOP: JC LP ;否無須交換跳過下一指令
MOV 68H,A
;是,以累加器中內(nèi)容取代目標(biāo)單元內(nèi)容LP: DJNZ R7,LOOP ;循環(huán)控制
NOP ;比較31次后程序結(jié)束返回例4-3-11源程序清單解: MOV DPTR,#2000H
;數(shù)據(jù)指針指向源數(shù)據(jù)首址
MOV R7,#0H
;設(shè)置循環(huán)比較次數(shù)
MOV 6FH,#0H
;統(tǒng)計(jì)數(shù)據(jù)存放單元清零SLP: MOVX A,@DPTR ;取源操作數(shù)
CJNE A,#41H,SLP1
;取入數(shù)據(jù)是否是ASCII碼A,不是跳轉(zhuǎn)
INC 6FH ;是,統(tǒng)計(jì)數(shù)據(jù)存放單元加1SLP1: INC DPTR ;修正指針指向下一單元
DJNZ R7,SLP ;循環(huán)控制
NOP ;統(tǒng)計(jì)完成程序結(jié)束返回例4-3-12源程序清單解: MOV DPTR,#1000H ;數(shù)據(jù)指針指向源數(shù)據(jù)區(qū)首址
MOV R0,#30H ;設(shè)置正數(shù)存放指針
MOV R1,#40H ;設(shè)置負(fù)數(shù)存放指針
MOV R7,#30 ;取分儲(chǔ)操作次數(shù)FLP: MOVX A,@DPTR ;取源操作數(shù)
JB ACC.7,F(xiàn)LP1 ;是負(fù)數(shù)轉(zhuǎn)移
MOV @R0,A ;是正數(shù)轉(zhuǎn)儲(chǔ)
INC R0 ;修正正數(shù)據(jù)指針指向下一單元
SJMP FLP2 ;轉(zhuǎn)循環(huán)控制FLP1: MOV @R1,A ;轉(zhuǎn)儲(chǔ)負(fù)數(shù)
INC R1 ;修正負(fù)數(shù)據(jù)指針指向下一單元FLP2: INC DPTR ;修正源數(shù)據(jù)指針指向下一單元
DJNZ R7,F(xiàn)LP ;循環(huán)控制
NOP ;分儲(chǔ)完成程序結(jié)束返回例4-3-13源程序清單解: MOV R7,#0AH ;取數(shù)據(jù)比較遍數(shù)L0: MOV 40H,R7 ;取數(shù)據(jù)比較一遍的次數(shù)
MOV R0,#30H ;源數(shù)據(jù)指針指向數(shù)據(jù)首地址
MOV A,@R0 ;取第一個(gè)數(shù)據(jù)L1: INC R0 ;修正數(shù)據(jù)指針
MOV R1,A ;暫存數(shù)據(jù)
CLR C ;為做減法而清借位標(biāo)志
SUBB A,@R0 ;與下一單元數(shù)據(jù)相減比較
MOV A,R1 ;恢復(fù)數(shù)據(jù)
JNC L2 ;無借位無須交換而轉(zhuǎn)移
XCH A,@R0;有借位則2個(gè)存儲(chǔ)單元內(nèi)容經(jīng)累加器交換
DEC R0 XCH A,@R0 INC R0L2: MOV A,@R0 ;重取數(shù)據(jù)準(zhǔn)備下一輪比較
DJNZ 40H,L1 ;
一遍未比較完成轉(zhuǎn)移
DJNZ R7,L0 ;未全部比較完成則轉(zhuǎn)移
NOP ;比較完成則程序結(jié)束返回例4-3-14源程序清單解: MOV R0,#31H ;數(shù)據(jù)指針指向有效數(shù)據(jù)首字節(jié)
MOV R7,#08H ;9個(gè)有效數(shù)據(jù)需加8次
MOV B,#00H ;結(jié)果和的高位清0 MOV A,@R0 ;取有效數(shù)據(jù)首位LP0:INC R0 ;修正數(shù)據(jù)指針
ADD A,@R0 ;數(shù)據(jù)相加
JNC LP1 ;無進(jìn)位轉(zhuǎn)移
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年自卸車租賃服務(wù)合同3篇
- 二零二五年度加油站消防設(shè)施租賃與維護(hù)合同6篇
- 二零二五年型汽車吊機(jī)租賃及維修保養(yǎng)合同2篇
- 2024期權(quán)協(xié)議書:金融衍生品期權(quán)投資合同范本3篇
- 2025年度影視作品宣傳發(fā)行合同范本6篇
- 2024年跨境服裝電商平臺(tái)銷售協(xié)議樣本版B版
- 二零二五年度合同作廢聲明模板與相關(guān)法律法規(guī)解析3篇
- 2024年航空公司飛機(jī)采購及租賃合同
- 2024版定制產(chǎn)品合同模板
- 2024年道路照明工程燈具購銷安裝一體化服務(wù)合同9篇
- 醫(yī)院院長年終工作總結(jié)報(bào)告精編ppt
- 大連市小升初手冊(cè)
- 《自然辯證法》課后習(xí)題答案自然辯證法課后題答案
- 造價(jià)咨詢結(jié)算審核服務(wù)方案
- 中國人民財(cái)產(chǎn)保險(xiǎn)股份有限公司機(jī)動(dòng)車綜合商業(yè)保險(xiǎn)條款
- 燃?xì)夤こ瘫O(jiān)理實(shí)施細(xì)則(通用版)
- E車E拍行車記錄儀說明書 - 圖文-
- 人才梯隊(duì)-繼任計(jì)劃-建設(shè)方案(珍貴)
- 《健身氣功》(選修)教學(xué)大綱
- 王家?guī)r隧道工程地質(zhì)勘察報(bào)告(總結(jié))
- 《昆明的雨》優(yōu)質(zhì)課一等獎(jiǎng)(課堂PPT)
評(píng)論
0/150
提交評(píng)論