單片微型計(jì)算機(jī)第講機(jī)械_第1頁
單片微型計(jì)算機(jī)第講機(jī)械_第2頁
單片微型計(jì)算機(jī)第講機(jī)械_第3頁
單片微型計(jì)算機(jī)第講機(jī)械_第4頁
單片微型計(jì)算機(jī)第講機(jī)械_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

單片微型計(jì)算機(jī)第講機(jī)械第1頁,課件共57頁,創(chuàng)作于2023年2月練習(xí)已知累加器A當(dāng)前的內(nèi)容為23H,進(jìn)位位C為1,執(zhí)行下列指令后,累加器A和進(jìn)位位C各為多少?ANLA,#7FHORLA,#35XRLA,#FFHRLCACJNEA,#40H,AAINCASJMPBBAA:ADDA,#23HBB:SJMP$第2頁,課件共57頁,創(chuàng)作于2023年2月第8-9講教學(xué)目的和要求【教學(xué)目標(biāo)】通過講述MCS-51單片機(jī)的匯編語言程序設(shè)計(jì)的基本步驟、基本方法,使學(xué)生對指令系統(tǒng)有進(jìn)一步的認(rèn)識和理解,同時(shí)使得學(xué)生掌握使用匯編語言進(jìn)行程序設(shè)計(jì)的方法,通過實(shí)例加以鞏固?!窘虒W(xué)重點(diǎn)】①單片機(jī)程序設(shè)計(jì)的基本方法;②查表、差值運(yùn)算、譯碼等簡單程序設(shè)計(jì)方法;【教學(xué)難點(diǎn)】如何將實(shí)際問題轉(zhuǎn)換成單片機(jī)能識別和解決的問題第3頁,課件共57頁,創(chuàng)作于2023年2月第五章MCS-51的匯編語言程序設(shè)計(jì)第4頁,課件共57頁,創(chuàng)作于2023年2月5.1

匯編語言程序設(shè)計(jì)概述語言的發(fā)展機(jī)器語言(MachineLanguage):二進(jìn)制表示指令和數(shù)據(jù),能被機(jī)器直接識別的計(jì)算機(jī)語言。速度快、占用內(nèi)存少。匯編語言(AssemblyLanguage):采用助記符表示的程序設(shè)計(jì)語言。內(nèi)存空間少,而且執(zhí)行速度快,但移植性差。高級語言(HighLevelLanguage):高級語言則是面向用戶的語言,移植性較好。MCS51單片機(jī)支持用匯編語言和C高級語言進(jìn)行編程,在單片機(jī)內(nèi)部最終轉(zhuǎn)換成機(jī)器語言存儲(chǔ)和運(yùn)行。第5頁,課件共57頁,創(chuàng)作于2023年2月源程序的編輯與匯編解決實(shí)際問題時(shí),往往需要根據(jù)業(yè)務(wù)邏輯和支持的指令,完成程序的編寫、調(diào)試、編譯、燒制等過程。第6頁,課件共57頁,創(chuàng)作于2023年2月匯編語言程序的結(jié)構(gòu)匯編語言程序的四分段書寫格式標(biāo)號字段操作碼字段操作數(shù)字段注釋字段START:MOVA,#00H;0→AMOVR1,#10;10→R1MOVR2,#00000011B;3→R2LOOP:ADDA,R2;(A)+(R2)→ADJNZR1,LOOP;R1減1,若不為0則循環(huán)NOP;延遲1個(gè)機(jī)器周期HERE:SJMPHERE;原地跳轉(zhuǎn)END;程序結(jié)束第7頁,課件共57頁,創(chuàng)作于2023年2月5.1.1

指令的格式注意:標(biāo)號:表示該指令所在的符號地址,一般由字母和數(shù)字組成,第一位為字母,其余位為字母、數(shù)字任選。操作助記符不能缺少;操作數(shù)個(gè)數(shù)可為:1、2、3個(gè),根據(jù)指令本身而定;2個(gè)操作數(shù)的指令,目的操作數(shù)在左邊;一般格式[標(biāo)號:]操作助記符[目的操作數(shù)][,源操作數(shù)][;注釋]匯編程序設(shè)計(jì)中,每一行書寫一條指令。第8頁,課件共57頁,創(chuàng)作于2023年2月指令的補(bǔ)充說明所有的符號均為英文符號,尤其注意常用的”,”、”;”。若書寫錯(cuò)誤,編譯程序?qū)⑻崾尽安荒茏R別的符號”。標(biāo)號的書寫標(biāo)號后必須跟冒號。標(biāo)號最大支持18個(gè)字符,且必須以字母開頭同一標(biāo)號在一個(gè)程序中只能定義一次不允許用系統(tǒng)保留字作為標(biāo)號一般只有別的指令需要訪問的語句才有標(biāo)號匯編時(shí),匯編程序自動(dòng)將標(biāo)號轉(zhuǎn)換成地址。第9頁,課件共57頁,創(chuàng)作于2023年2月指令的補(bǔ)充說明立即數(shù)和直接地址的書寫若是十進(jìn)制數(shù),后綴可無,也可以寫D;其他進(jìn)制必須帶后綴。二進(jìn)制B、八進(jìn)制O、十六進(jìn)制H。可以是字符串,如’A’、’YU’,編譯時(shí)自動(dòng)轉(zhuǎn)換成其ASCII可以是指令的標(biāo)號美元符號$的使用。$符號表示當(dāng)前地址,一般在程序結(jié)束或原地跳轉(zhuǎn)時(shí)使用,以下兩條指令等價(jià):HERE:SJMPHERESJMP

$第10頁,課件共57頁,創(chuàng)作于2023年2月5.1.2偽指令偽指令,也稱匯編命令。僅對匯編過程進(jìn)行指示,方便匯編程序?qū)⒋a轉(zhuǎn)換成機(jī)器代碼。偽指令無對應(yīng)的單片機(jī)可執(zhí)行代碼偽指令具有控制匯編程序的輸入輸出、定義數(shù)據(jù)和符號、條件匯編,分配存儲(chǔ)空間等功能??焖倮斫鈧沃噶睿喝绶峙浯鎯?chǔ)空間偽指令,匯編程序在編譯時(shí),根據(jù)偽指令的指示,完成存儲(chǔ)空間的劃分、初值的置入等工作。無需單片機(jī)去執(zhí)行。第11頁,課件共57頁,創(chuàng)作于2023年2月5.1.2.1ORG偽指令起始地址設(shè)定偽指令用于指定接下來指令在ROM中的存放位置使用格式:ORG

16位地址(以四位十六進(jìn)制方式書寫)舉例:有如下指令段

ORG2000HSTART:MOVA,#00H注意ORG可以多次使用使用順序必須由小到大ROMMOVA,#00H74H2000H00H第12頁,課件共57頁,創(chuàng)作于2023年2月ORG

偽指令…ORG2500H……ORG2000H……ORG3000H…ORG2000H……ORG2500H……ORG3000H×錯(cuò)誤的書寫方式√正確的書寫方式第13頁,課件共57頁,創(chuàng)作于2023年2月5.1.2.2END偽指令匯編終止偽指令用于告訴匯編程序,將某一段源程序翻譯成機(jī)器指令的工作到此為止。后面的指令將忽略。在整個(gè)源程序的最后添加END語句。舉例MOVA,#12HMOVA,#23HENDMOVA,#45HROMMOVA,#12H74H12H74H23HMOVA,#23H第14頁,課件共57頁,創(chuàng)作于2023年2月5.1.2.3DB

偽指令定義字節(jié)數(shù)據(jù)表偽指令用于從指定地址開始,在ROM的連續(xù)單元中定義字節(jié)數(shù)據(jù)格式:[標(biāo)號:]DB

字節(jié)數(shù)據(jù)表。用”,”分割表中的多個(gè)數(shù)舉例:ORG1000HTABLE:DB20H,32,’A’,’8’編譯時(shí):十進(jìn)制等自動(dòng)轉(zhuǎn)換成十六進(jìn)制字符轉(zhuǎn)換成ASCII碼ROM1000H20H20H41H38H1001H1002H1003H第15頁,課件共57頁,創(chuàng)作于2023年2月ASCII碼表‘0’~’9’:30H~39H‘A’~’Z’:41H~5AH‘a(chǎn)’~’z’:61H~7AH第16頁,課件共57頁,創(chuàng)作于2023年2月5.1.2.4DW

偽指令定義字?jǐn)?shù)據(jù)表偽指令從指定地址開始,在ROM的連續(xù)單元中定義16位的數(shù)據(jù)字格式:[標(biāo)號:]DW

字?jǐn)?shù)據(jù)表。用”,”分割表中的多個(gè)字舉例:ORG2000HTABLE:DW1246H,10ROM2000H12H46H00H0AH2001H2002H2003H第17頁,課件共57頁,創(chuàng)作于2023年2月5.1.2.5EQU偽指令用于給標(biāo)號賦值賦值后,后續(xù)程序中可用此標(biāo)號表示對應(yīng)的數(shù)據(jù)格式:標(biāo)號

EQU數(shù)據(jù)或匯編表達(dá)式。舉例:LENEQU10*3SUMEQU21HMOVR7,#LENMOVSUM,A對于常用的常量,采用此種方式后,當(dāng)該常量發(fā)生變化時(shí),無需頻繁更改主程序內(nèi)容,只需修改之前的賦值語句即可。第18頁,課件共57頁,創(chuàng)作于2023年2月5.1.2.6BIT偽指令將位地址定義成為符號名指令賦值后,后續(xù)程序中位地址可直接用符號名表示,增加程序的可讀性。格式:符號名BIT

位地址表達(dá)式。舉例:STBITP1.0;將P1.0的位地址賦給符號名STCFBIT0D7H;將位地址為D7H的位定義為符號名注意:用BIT定義的“符號名”一經(jīng)定義便不能重新定義和改變第19頁,課件共57頁,創(chuàng)作于2023年2月5.2匯編語言程序設(shè)計(jì)步驟分析問題根據(jù)任務(wù)的要求,確定程序的功能要求、輸入輸出、解決步驟等問題。算法設(shè)計(jì)將實(shí)際問題轉(zhuǎn)化為計(jì)算機(jī)處理的程序算法算法比較與優(yōu)化(內(nèi)存需求與運(yùn)行速度)第20頁,課件共57頁,創(chuàng)作于2023年2月匯編語言程序設(shè)計(jì)步驟流程描述將算法的內(nèi)容用流程圖的形式表示,更加直觀。典型外設(shè)查詢程序流程第21頁,課件共57頁,創(chuàng)作于2023年2月匯編語言程序設(shè)計(jì)步驟分配內(nèi)存等資源將片內(nèi)RAM資源合理分配,把內(nèi)存區(qū)、堆棧區(qū)、各種緩沖區(qū)進(jìn)行合理分配。確定每個(gè)區(qū)域的首地址,便于編程使用。程序的編寫與調(diào)試根據(jù)以上工作,結(jié)合MCS51單片機(jī)的指令系統(tǒng),完成源代碼的編寫,并上機(jī)調(diào)試,考查各種邊界情況。第22頁,課件共57頁,創(chuàng)作于2023年2月源程序的編輯依據(jù)匯編語言規(guī)則用好偽指令符號不用中文SJMP$

用于調(diào)試以.ASM存盤ORG0000HLJMPMAINORG0040HMAIN:MOVR7,#16MOVR0,#60HMOVA,#55HLOOP:MOV@R0,AINCR0DJNZR7,LOOPSJMP$END……ROMLJMP0040H02H0000H00H40H7FH0040H10HMOVR7,#1680H004BHFEHSJMP$第23頁,課件共57頁,創(chuàng)作于2023年2月程序匯編及連接源程序的匯編匯編源程序轉(zhuǎn)為目標(biāo)程序的過程叫匯編匯編通常在Windows下的集成開發(fā)環(huán)境完成用A51.EXE匯編生成.OBJ、.LIB及.LST目標(biāo)程序的連接.OBJ、.LIB經(jīng)BL51.EXE生成無擴(kuò)展名的絕對地址目標(biāo)文件絕對地址目標(biāo)文件可以用于仿真器調(diào)試調(diào)試無誤的目標(biāo)文件用OH51.EXE轉(zhuǎn)換為.HEX文件.HEX文件經(jīng)編程器寫入單片機(jī)存儲(chǔ)器第24頁,課件共57頁,創(chuàng)作于2023年2月注意事項(xiàng)強(qiáng)化模塊觀念程序模塊(主程序模塊、各種子程序模塊)模塊化優(yōu)點(diǎn):分塊設(shè)計(jì)、便于閱讀、調(diào)試方便采用循環(huán)和子程序使程序占用空間減少、結(jié)構(gòu)清晰循環(huán)初值和結(jié)束條件,避免“死機(jī)”現(xiàn)象子程序的現(xiàn)場保護(hù)(注意棧平衡、寄存器內(nèi)容)第25頁,課件共57頁,創(chuàng)作于2023年2月5.3匯編語言程序基本結(jié)構(gòu)匯編語言程序主要包含四種結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)第26頁,課件共57頁,創(chuàng)作于2023年2月5.3.1

順序結(jié)構(gòu)指令執(zhí)行時(shí),其執(zhí)行順序按照指令在存儲(chǔ)器中的存放順序進(jìn)行的。開始語句1語句n結(jié)束……【特點(diǎn)】順序執(zhí)行,程序通常簡單;無分支、無循環(huán)、無轉(zhuǎn)移圖中無判斷框;第27頁,課件共57頁,創(chuàng)作于2023年2月順序結(jié)構(gòu)舉例1數(shù)據(jù)傳送:內(nèi)部RAM的2AH~2EH單元中存儲(chǔ)的數(shù)據(jù)如圖所示。試編寫程序?qū)崿F(xiàn)圖示的數(shù)據(jù)傳送結(jié)果。2EH78H56H34H12H2DH2CH2BH00H2AHACC2EH56H34H12H00H2DH2CH2BH00H2AHACC78H第28頁,課件共57頁,創(chuàng)作于2023年2月方法1內(nèi)部RAM的2AH~2EH單元內(nèi)容傳遞至2BF~2EF、A中。MOVA,2EH;2字節(jié),1個(gè)機(jī)器周期MOV2EH,2DH;3字節(jié),2個(gè)機(jī)器周期MOV2DH,2CH;3字節(jié),2個(gè)機(jī)器周期MOV2CH,2BH;3字節(jié),2個(gè)機(jī)器周期MOV2BH,#00H;3字節(jié),2個(gè)機(jī)器周期使用14個(gè)字節(jié)的指令代碼,執(zhí)行時(shí)間為9個(gè)機(jī)器周期2EH78H56H34H12H2DH2CH2BH00H2AHACC78H56H34H12H00H2EH56H34H12H00H2DH2CH2BH00H2AHACC78H第29頁,課件共57頁,創(chuàng)作于2023年2月方法2內(nèi)部RAM的2AH~2EH單元內(nèi)容傳遞至2BF~2EF、A中。CLRA

;1字節(jié),1個(gè)機(jī)器周期XCHA,2BH;2字節(jié),1個(gè)機(jī)器周期XCHA,2CH;2字節(jié),1個(gè)機(jī)器周期XCHA,2DH;2字節(jié),1個(gè)機(jī)器周期XCHA,2EH;2字節(jié),1個(gè)機(jī)器周期使用9個(gè)字節(jié)的指令代碼,執(zhí)行時(shí)間為5個(gè)機(jī)器周期2EH78H56H34H12H2DH2CH2BH00H2AHACC00H12H00H34H12H56H34H78H56H2EH56H34H12H00H2DH2CH2BH00H2AHACC78H第30頁,課件共57頁,創(chuàng)作于2023年2月順序結(jié)構(gòu)舉例2碼制轉(zhuǎn)換:片內(nèi)RAM的21H單元存放一個(gè)十進(jìn)制數(shù)據(jù)十位的ASCII碼,22H單元存放該數(shù)據(jù)個(gè)位的ASCII碼。編寫程序?qū)⒃摂?shù)據(jù)轉(zhuǎn)換成壓縮BCD碼存放在20H單元。20H36H34H21H22H數(shù)字字符的ASCII碼為30H+數(shù)如字符3的ASCII碼為33H。右側(cè)表示存放的為數(shù)據(jù)64。64H程序第31頁,課件共57頁,創(chuàng)作于2023年2月ASCII到壓縮BCD碼的轉(zhuǎn)換分析取21H單元低位數(shù)據(jù),移至高位取22H單元內(nèi)容,去掉高位上述結(jié)果組合,傳送至20H單元20H36H34H21H22H64H程序第32頁,課件共57頁,創(chuàng)作于2023年2月ASCII到壓縮BCD碼的轉(zhuǎn)換程序ORG0040HSTART:MOVA,21H;取十位ASCII碼ANLA,#0FH;保留低半字節(jié)SWAPA;移至高半字節(jié)MOV20H,A;存入20H單元MOVA,22H;取個(gè)位ASCII碼ANLA,#0FH;保留低半字節(jié)ORL20H,A;合并到結(jié)果單元SJMP$END20H36H34H21H22HACC36H06H60H60H34H04H64H第33頁,課件共57頁,創(chuàng)作于2023年2月20HX21H程序平方表區(qū)順序結(jié)構(gòu)舉例3查表程序:有一變量存放在片內(nèi)RAM的20H單元,其取值范圍為:00H~05H。要求編制一段程序,使用查表指令,根據(jù)變量值求其平方值,并存入片內(nèi)RAM的21H單元。X2開始A→(21H)(20H)→A表格首地址→DPTRMOVCA,@A+DPTR結(jié)束第34頁,課件共57頁,創(chuàng)作于2023年2月查表操作程序

ORG1000HSTART:MOVDPTR,#TABLEMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$ORG2000HTABLE:DB00,01,04,09,16,25END開始A→(21H)(20H)→A表格首地址→DPTRMOVCA,@A+DPTR結(jié)束第35頁,課件共57頁,創(chuàng)作于2023年2月練習(xí)根據(jù)累加器A的值(0–7FH)查平方表,求平方值,結(jié)果放在BA中。TABLE:DW0000H,0001H,0004H,0009H DW0010H,0019H,……MOV DPTR,#TABLEMOVCA,@A+DPTRMOV B,AINC AMOVCA,@A+DPTR…………TABLE00H00H00H01HTABLE+100HROM04HTABLE+2TABLE+3TABLE+4TABLE+5RLAPUSHACCPOPACCMOV DPTR,#TABLERLAPUSHACCMOVCA,@A+DPTRMOV B,APOPACCINC AMOVCA,@A+DPTR第36頁,課件共57頁,創(chuàng)作于2023年2月5.3.2

分支結(jié)構(gòu)指令執(zhí)行時(shí),根據(jù)不同的情況執(zhí)行不同的程序段。單分支雙分支多分支第37頁,課件共57頁,創(chuàng)作于2023年2月單分支結(jié)構(gòu)設(shè)累加器A中存儲(chǔ)有符號數(shù)的原碼,編程轉(zhuǎn)換成補(bǔ)碼開始保存A最高位結(jié)束最高位為0NA數(shù)據(jù)位取反+1恢復(fù)符號位YCMPT:JNBAcc.7,RETURN

MOVC,Acc.7

CPLA ADDA,#1

MOVAcc.7,C RETURN:SJMP$END第38頁,課件共57頁,創(chuàng)作于2023年2月雙分支結(jié)構(gòu)設(shè)變量x以補(bǔ)碼的形式存放在片內(nèi)RAM的30H單元,變量y與x的關(guān)系是:當(dāng)x>0時(shí),y=x;當(dāng)x=0時(shí),y=20H;當(dāng)x<0時(shí),y=x+5。編制程序,根據(jù)x的大小求y并送回30H單元。判斷結(jié)果為0,可通過執(zhí)行JZrel來實(shí)現(xiàn)判斷補(bǔ)碼的正負(fù),可通過最高位來判斷先與,保留最高位,再判斷結(jié)果是否為零來實(shí)現(xiàn)第39頁,課件共57頁,創(chuàng)作于2023年2月雙分支結(jié)構(gòu)設(shè)變量x以補(bǔ)碼的形式存放在片內(nèi)RAM的30H單元,變量y與x的關(guān)系是:當(dāng)x>0時(shí),y=x;當(dāng)x=0時(shí),y=20H;當(dāng)x<0時(shí),y=x+5。編制程序,根據(jù)x的大小求y并送回30H單元。第40頁,課件共57頁,創(chuàng)作于2023年2月雙分支結(jié)構(gòu)START:MOVA,30H;取x至累加器

JZNEXT;x=0,轉(zhuǎn)NEXTNEXT:MOV30H,#20HDONE:SJMP$

ENDANLA,#80H;否,保留符號位JZDONE;x>0,轉(zhuǎn)結(jié)束MOVA,#05H;x<0處理ADDA,30HMOV30H,A;X+05H送YSJMPDONE第41頁,課件共57頁,創(chuàng)作于2023年2月5.3.3

循環(huán)結(jié)構(gòu)按某種控制規(guī)律重復(fù)執(zhí)行的程序稱為循環(huán)程序。循環(huán)程序有先執(zhí)行后判斷和先判斷后執(zhí)行兩種基本結(jié)構(gòu)。第42頁,課件共57頁,創(chuàng)作于2023年2月例1

延時(shí)程序編寫一段延時(shí)50ms的程序若晶振頻率為12MHz,則一個(gè)機(jī)器周期為1μs,延時(shí)50ms,則程序的執(zhí)行時(shí)間為50000個(gè)機(jī)器周期。立即數(shù)取指在0~255之間,可考慮200*250=50000。需要用到減1,結(jié)果不為0則重復(fù)的指令。執(zhí)行一條DJNZ指令需要2個(gè)機(jī)器周期,即2μs。采用循環(huán)計(jì)數(shù)法實(shí)現(xiàn)延時(shí),需要用到雙重循環(huán)。第43頁,課件共57頁,創(chuàng)作于2023年2月延時(shí)程序DEL:MOVR7,#200;1μsDEL1:NOP;1

μsDEL1:MOVR6,#?;1μsNOP ;1μsDEL2:DJNZR6,DEL2;2μsDJNZR7,DEL1;2μs

DEL1:MOVR6,#123;1μs共計(jì)

[(2×123+2+2)×200+1]μs,即50.001ms第44頁,課件共57頁,創(chuàng)作于2023年2月例2

未知次數(shù)的循環(huán)將內(nèi)部RAM中起始地址為data的數(shù)據(jù)串傳送到外部RAM中起始地址為buffer的存儲(chǔ)區(qū)域內(nèi),直到發(fā)現(xiàn)‘$’字符停止傳送?!璬ata??H??Hdata+1……內(nèi)部RAM‘$’??…………bufferbuffer+1……外部RAM問題何時(shí)終止傳送?對取出的數(shù)進(jìn)行與’S’進(jìn)行比較,判斷是否相等。用CJNE

第45頁,課件共57頁,創(chuàng)作于2023年2月例2

未知次數(shù)的循環(huán)程序?qū)?nèi)部RAM中起始地址為data的數(shù)據(jù)串傳送到外部RAM中起始地址為buffer的存儲(chǔ)區(qū)域內(nèi),直到發(fā)現(xiàn)‘$’字符停止傳送。

MOVR0,#dataMOVDPTR,#bufferLOOP:MOVA,@R0

CJNEA,’$’,繼續(xù)執(zhí)行地址結(jié)束

LP:MOVX@DPTR,AINCR0INCDPTRSJMPLOOPLP2:SJMP$END

SJMPLP2

CJNEA,’$’,LP

第46頁,課件共57頁,創(chuàng)作于2023年2月5.4

子程序及其調(diào)用在實(shí)際應(yīng)用中,經(jīng)常會(huì)遇到一些帶有通用性的問題,在一個(gè)程序中可能要使用多次。這時(shí)可以將其設(shè)計(jì)成通用的子程序供隨時(shí)調(diào)用,減少代碼冗余。一個(gè)程序中可以多次調(diào)用一個(gè)子程序多個(gè)程序可以調(diào)用一個(gè)子程序子程序可以調(diào)用子程序,最多支持8級調(diào)用子程序時(shí),單片機(jī)能自動(dòng)保存PC內(nèi)容,遇RET返回時(shí),能自動(dòng)恢復(fù)PC程序1……子程序RET……程序2……第47頁,課件共57頁,創(chuàng)作于2023年2月子程序結(jié)構(gòu)子程序編寫完成后,使用ACALL

函數(shù)名(短距離調(diào)用)LCALL

函數(shù)名(整個(gè)ROM區(qū)調(diào)用)此處的函數(shù)名,實(shí)際上是一個(gè)標(biāo)號,編譯后形成具體的地址。子程序的處理過程中,可能要影響PSW、ACC,以及其他的一些功能寄存器,若這些影響是子程序功能的一部分,則無需保護(hù);否則,一定要保護(hù)現(xiàn)場,使得主程序得以正確執(zhí)行。保護(hù)現(xiàn)場……子程序處理……恢復(fù)現(xiàn)場RET子程序函數(shù)名:第48頁,課件共57頁,創(chuàng)作于2023年2月通過堆棧進(jìn)行現(xiàn)場的保護(hù)SUB1:PUSHPSW;保護(hù)現(xiàn)場

PUSHACC;

PUSHB;

……MOVPSW,#10H;換當(dāng)前工作寄存器組

……POPB;恢復(fù)現(xiàn)場

POPACC;

POPPSW;

RET注意:①保護(hù)和恢復(fù)的工作在子程序中進(jìn)行。②保護(hù)與恢復(fù)的順序要對應(yīng)。第49頁,課件共57頁,創(chuàng)作于2023年2月子程序結(jié)構(gòu)子程序參數(shù)的傳遞。調(diào)用子程序時(shí),語句中無法攜帶子程序運(yùn)行所需的參數(shù)。明確子程序的功能后,對子程序使用的參數(shù),應(yīng)在調(diào)用之前完成數(shù)據(jù)的賦值等工作。類似乘法指令MULAB,必須在此指令之前將AB賦值,運(yùn)算才有意義。保護(hù)現(xiàn)場……子程序處理……恢復(fù)現(xiàn)場RET子程序函數(shù)名:第50頁,課件共57頁,創(chuàng)作于2023年2月子程序舉例編寫程序,實(shí)現(xiàn)c=a2+b2

。設(shè)a,b,c分別存于內(nèi)部RAM的30H,31H,32H三個(gè)單元中如何求數(shù)的平方MULAB左移查表開始調(diào)用求平方子程序結(jié)束a2→R1(31H)→A(30H)→AA+R1→A調(diào)用求平方子程序A→32H第51頁,課件共57頁,創(chuàng)作于2023年2月方法1:直接相乘START:MOVA,30H;取aACALLSQR;調(diào)用乘法

MOVR1,A;a2暫存于R1中

MOVA,31H;取bACALLSQR;調(diào)用查平方表

ADDA,R1;a2+b2存于A中

MOV32H,A;存結(jié)果

SJMP$SQR:PUSHPSWMOVB,AMULAB;POPPSW

RET開始調(diào)用求平方子程序結(jié)束a2→R1(31H)→A(30H)→AA+R1→A調(diào)用求平方子程序A→32H第52頁,課件共57頁,創(chuàng)作于2023年2月方法2:左移1次START:MOVA,30H;取aACALLSQR;調(diào)用乘法

MOVR1,A;a2暫存于R1中

MOVA,31H;取bACALLSQR;調(diào)用查平方表

ADDA,R1;a2+b2存于A中

MOV32H,A;存結(jié)果

SJMP$SQR:PUSHPSWRLAPOPPSW

RET開始調(diào)用求平方子程序結(jié)束a2→R1(31H)→A(30H)→AA+R1→A調(diào)用求平方子程序A→32H第53頁,課件共57頁,創(chuàng)作于2023年2月方法3:查表START:MOVA,30H;取aACALLSQR;調(diào)用乘法

MOVR1,A;a2暫存于R1中

MOVA,31H;取bACALLSQR;調(diào)用查平方表

ADDA,R1;a2+b2存于A中

MOV32H,A;存結(jié)果

SJMP$SQR:MOVDPTR,#TAB;子程序

MOVCA,@A+DPTR;

RET

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(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

提交評論