版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
單片機(jī)原理及接口技術(shù)主編:張毅剛
主講:第4章89C51匯編語言程序設(shè)計(jì)匯編語言是面向機(jī)器硬件的語言,也是能直接控制單片機(jī)硬件的編程語言。本章介紹程序設(shè)計(jì)的基本知識(shí)及如何使用匯編語言來進(jìn)行基本的程序設(shè)計(jì)。程序是若干指令的有序集合,單片機(jī)的運(yùn)行就是執(zhí)行這一指令序列的過程,編寫這一指令序列的過程稱為程序設(shè)計(jì)。用于程序設(shè)計(jì)的語言基本上分為3種:機(jī)器語言、匯編語言和高級(jí)語言。1.機(jī)器語言機(jī)器語言是用二進(jìn)制代碼表示的指令、數(shù)字和符號(hào)。用機(jī)器語言編寫的程序不易懂,難記憶,易出錯(cuò)。4.1匯編語言程序設(shè)計(jì)概述4.1.1機(jī)器、匯編和高級(jí)語言2.匯編語言
用英文助記符表示的指令稱為符號(hào)語言或稱匯編語言。匯編語言程序需轉(zhuǎn)換成二進(jìn)制代碼表示的機(jī)器語言程序,單片機(jī)才能識(shí)別和執(zhí)行。通常把這一轉(zhuǎn)換(翻譯)工作稱為“匯編”。匯編由專門的程序來完成,這種程序稱為匯編程序。經(jīng)匯編程序“匯編”得到的機(jī)器語言程序稱為目標(biāo)程序,原來的匯編語言程序稱為源程序。匯編語言特點(diǎn):①.面向機(jī)器的語言,能直接管理和控制硬件設(shè)備。②.助記符指令和機(jī)器指令一一對(duì)應(yīng),程序效率高,占用存儲(chǔ)空間小,運(yùn)行速度快,能編寫出最優(yōu)化的程序。③.缺點(diǎn)是可讀性差,缺乏通用性。4.1匯編語言程序設(shè)計(jì)概述4.1.1機(jī)器、匯編和高級(jí)語言3.高級(jí)語言高級(jí)語言不受具體機(jī)器的限制。常用的如C語言等。高級(jí)語言程序同樣需轉(zhuǎn)換成機(jī)器語言程序,單片機(jī)才能識(shí)別和執(zhí)行。這一轉(zhuǎn)換工作稱為“編譯”。高級(jí)語言優(yōu)點(diǎn):通用性強(qiáng),直觀、易懂、易學(xué),可讀性好。近年來,面向自動(dòng)控制、工程設(shè)計(jì)方面的高級(jí)語言發(fā)展很快,對(duì)51序列單片機(jī)操作的C語言,稱為C51。盡管如此,對(duì)于程序的空間和時(shí)間要求很高的場(chǎng)合,匯編語言仍是必不可缺的。使用匯編語言編程,是單片機(jī)程序設(shè)計(jì)的基本功之一4.1匯編語言程序設(shè)計(jì)概述4.1.1機(jī)器、匯編和高級(jí)語言匯編語言有兩種基本類型:指令語句和偽指令語句(1).指令語句已在第3章介紹,每一條指令語句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼——機(jī)器代碼(2).偽指令語句
是為匯編服務(wù)的。在匯編時(shí)沒有機(jī)器代碼與之對(duì)應(yīng)。4.1匯編語言程序設(shè)計(jì)概述4.1.2匯編語言語句的種類和格式AT89C51的匯編語言的指令語句格式典型的四分段格式如下:
標(biāo)號(hào)字段 操作碼字段
操作數(shù)字段
注釋字段規(guī)則:(1).標(biāo)號(hào)字段和操作字碼段之間要有冒號(hào)“:”相隔;(2).操作碼字段和操作數(shù)字段就是指令;(3).操作數(shù)字段和注釋字段之間的分界符用分號(hào)“;”相隔。(4).一條語句可以沒有標(biāo)號(hào),標(biāo)號(hào)的有無取決于本程序中的其他語句是否訪問該條語句。指令部分為必選項(xiàng),其余各段為任選項(xiàng)。4.1匯編語言程序設(shè)計(jì)概述4.1.2匯編語言語句的種類和格式例4-1下面是一段匯編語言程序的四分段書寫格式
標(biāo)號(hào)字段操作碼字段
操作數(shù)字段
注釋字段START:
MOV
A,30H
;(30H)→A
MOV
R1,#10
;10→R1
MOV
R2,#00000011B
;3→R2LOOP:
ADD
A,R2
;(A)+(R2)→A
DJNZ
R1,LOOP
;(R1)-1≠0循環(huán)
NOPHERE:
SJMP HERE注意:匯編語言程序中標(biāo)點(diǎn)符號(hào)一定要半角符號(hào),否則匯編程序不認(rèn)識(shí)全角標(biāo)點(diǎn)符號(hào),會(huì)給出出錯(cuò)提示:符號(hào)沒有定義。4.1匯編語言程序設(shè)計(jì)概述4.1.2匯編語言語句的種類和格式基本語法規(guī)則1.標(biāo)號(hào)字段是語句所在地址的標(biāo)志符號(hào)(1).標(biāo)號(hào)后邊必須跟以冒號(hào)“:”;(2).由1-8個(gè)ASCII字符組成,第一個(gè)必須是字母;(3).同一標(biāo)號(hào)在一個(gè)程序中只能定義一次;(4).不能使用匯編語言已經(jīng)定義的符號(hào)作為標(biāo)號(hào)。如:MOV。2.操作碼字段
就是指令開始部分。4.1匯編語言程序設(shè)計(jì)概述4.1.2匯編語言語句的種類和格式3.操作數(shù)字段
通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是雙操作數(shù),則操作數(shù)之間,要以逗號(hào)隔開。(1).十六進(jìn)制、二進(jìn)制和十進(jìn)制形式的操作數(shù)表示
十六進(jìn)制,后綴“H”,如32H。若是A~F開頭,則需在它前面加一個(gè)“0”,以便在匯編時(shí)把它和字符A~F區(qū)別開來。如0F2H。二進(jìn)制,后綴“B”,如101101B。如:MOVA,#00111011B十進(jìn)制,后綴“D”,也可省略后綴,如32。如:MOVA,#59通常使用十六進(jìn)制表示。如:MOVA,#3BH4.1匯編語言程序設(shè)計(jì)概述4.1.2匯編語言語句的種類和格式(2).工作寄存器和特殊功能寄存器的表示采用工作寄存器和特殊功能寄存器的代號(hào)來表示,也可用其地址來表示。例如,寄存器可用B表示。也可用0F0H來表示,0F0H為寄存器B的地址。指令MOV B,#3與指令 MOV 0F0H,#3等價(jià),都對(duì)應(yīng)機(jī)器碼75HF0H03H4.1匯編語言程序設(shè)計(jì)概述4.1.2匯編語言語句的種類和格式(3).美元符號(hào)$的使用用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下兩條指令是等價(jià)的:HERE:JNB F0,HERE
JNB F0,
$再如:如下指令也是等價(jià)的: CJNE A,#50,NEXTNEXT: JNC LAGA ;≥50跳轉(zhuǎn) CJNE A,#50,$+3 ;三字節(jié) JNC LAGA ;≥50跳轉(zhuǎn)4.1匯編語言程序設(shè)計(jì)概述4.1.2匯編語言語句的種類和格式4.注釋字段注釋字段用于解釋指令或程序的含義,提高程序的可讀性。使用時(shí)必須以分號(hào)“;”開頭。換行書寫也要以分號(hào)“;”開頭。程序設(shè)計(jì)者使用匯編語言編寫的匯編語言程序必須匯編成機(jī)器代碼,才能運(yùn)行。在AT89C51匯編語言源程序中應(yīng)有向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過使用偽指令來實(shí)現(xiàn)的。偽指令不屬于指令系統(tǒng)中的匯編語言指令,它是程序員發(fā)給匯編程序的命令,也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽指令。經(jīng)過匯編得到目標(biāo)程序(機(jī)器代碼)后,偽指令已無存在的必要,所以“偽”體現(xiàn)在匯編時(shí),偽指令沒有相應(yīng)的機(jī)器代碼產(chǎn)生。4.1匯編語言程序設(shè)計(jì)概述4.1.3偽指令常用的偽指令
1.ORG匯編起始地址命令在匯編語言源程序的開始,通常都用一條ORG偽指令來實(shí)現(xiàn)規(guī)定程序的起始地址。如不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開始。例如: ORG 2000HSTART: MOVA,#00H ┋規(guī)定標(biāo)號(hào)START開始的程序放在地址為2000H開始的存儲(chǔ)單元。4.1匯編語言程序設(shè)計(jì)概述4.1.3偽指令1.ORG匯編起始地址命令一個(gè)源程序中,可多次使用ORG指令,來規(guī)定不同的程序段的起始地址。但地址必須由小到大排列,地址不能交叉、重疊。4.1匯編語言程序設(shè)計(jì)概述4.1.3偽指令例如: ORG2000H ┇ ORG2500H ┇ ORG3000H ┇例如: ORG2500H ┇ ORG2000H ┇ ORG3000H ┇此段程序不能超出2500H,否則被覆蓋。2.END匯編終止命令匯編語言源程序的結(jié)束標(biāo)志,用于終止源程序的匯編工作。在整個(gè)源程序中只能有一條END命令,且位于程序的最后。4.1匯編語言程序設(shè)計(jì)概述4.1.3偽指令2000H30H2001H40H2002H18H2003H43H2004H42H3.DB定義字節(jié)命令DB功能是在程序存儲(chǔ)器從指定單元開始定義(存儲(chǔ))若干個(gè)字節(jié)數(shù)據(jù),例如ORG 2000HDB30H,40H,24,“C”,“B”匯編后24=18H,C、B的ASCII為43H、42H4.DW定義數(shù)據(jù)字命令從指定的地址開始,在程序存儲(chǔ)器的連續(xù)單元中定義16位的數(shù)據(jù)字。例如: ORG2000HDW 1246H,7BH,104.1匯編語言程序設(shè)計(jì)概述4.1.3偽指令匯編后2000H12H2001H46H2002H00H2003H7BH2004H00H2005H0AH5.EQU賦值命令用于給標(biāo)號(hào)賦值。賦值以后,其標(biāo)號(hào)值在整個(gè)程序有效。例如:TESTEQU2000H 表示標(biāo)號(hào)TEST=2000H,在匯編時(shí),凡是遇到標(biāo)號(hào)TEST時(shí),均以2000H來代替。6.DATA數(shù)據(jù)地址賦值命令DATA偽指令常在程序中定義數(shù)據(jù)地址。例如:BMKGDATA 20H ;撥碼開關(guān)值存儲(chǔ)單元等價(jià)程序: MOV A,BMKG
MOV A,20H7.BIT位地址符號(hào)命令功能是將位地址的值賦給字符名。例如:WDOGBIT P1.3DCD BIT 20H等價(jià)程序: SETB WDOG SETB P1.3 JB DCD,STAR JB 20H,STAR 4.1匯編語言程序設(shè)計(jì)概述4.1.3偽指令匯編語言源程序“翻譯”成機(jī)器代碼(指令代碼)的過程稱為“匯編”。匯編可分為手工匯編和機(jī)器匯編兩類:手工匯編:人工查表翻譯指令。不但麻煩,且容易出錯(cuò)。在實(shí)際程序設(shè)計(jì)中,采用機(jī)器匯編來自動(dòng)完成匯編。4.2匯編語言源程序的匯編4.2.1手工匯編程序編輯:用編輯軟件(例如記事本)進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)擴(kuò)展名為“.ASM”文件。匯編:在計(jì)算機(jī)上運(yùn)行匯編程序(例如KeilμVision4或PMedWin),把匯編語言源程序翻譯成機(jī)器代碼。程序燒錄:借助于單片機(jī)仿真開發(fā)工具,將匯編后的機(jī)器代碼寫入到單片機(jī)芯片。反匯編:將二進(jìn)制機(jī)器代碼語言程序翻譯成匯編語言源程序。其作用是分析現(xiàn)成產(chǎn)品的程序。4.2匯編語言源程序的匯編4.2.2機(jī)器匯編例4-2下面是一段源程序的匯編結(jié)果,讀者可通過查第3章指令表,進(jìn)行手工匯編,來驗(yàn)證下面的匯編結(jié)果是否正確。見表4-1表4-1 源程序匯編結(jié)果 匯編語言程序 匯編后的機(jī)器代碼標(biāo)號(hào) 助記符指令 地址 機(jī)器代碼 ORG 2000HSTART:MOV A,#08H 2000H 74H 08H MOV B,#76H 2002H 75H F0H 76H ADD A,A 2005H 05H E0H ADD A,B 2007H 05H F0H LJMP START 2009H 02H 20H 00H4.2匯編語言源程序的匯編4.2.2機(jī)器匯編匯編程序設(shè)計(jì)步驟(1).分析問題,確定算法(2).根據(jù)算法,畫出程序框圖(3).分配存儲(chǔ)器工作區(qū)及有關(guān)端口地址(4).編寫程序,要養(yǎng)成在程序的適當(dāng)位置上加上注釋的好習(xí)慣。(5).“匯編”成機(jī)器代碼,上機(jī)調(diào)試4.3匯編語言程序設(shè)計(jì)舉例
實(shí)際程序設(shè)計(jì)中,常常將那些需多次應(yīng)用的、完成相同的某種基本運(yùn)算或操作的程序段從整個(gè)程序中獨(dú)立出來,單獨(dú)編成一個(gè)程序段,需要時(shí)通過子程序調(diào)用指令進(jìn)行調(diào)用。這樣的程序段稱為子程序。子程序在程序設(shè)計(jì)中非常重要,采用子程序能使整個(gè)程序結(jié)構(gòu)簡(jiǎn)單,縮短程序的設(shè)計(jì)時(shí)間,減少占用的程序存儲(chǔ)空間。并且方便多人分工編寫程序。調(diào)用子程序的程序稱為主程序或調(diào)用程序。1.子程序設(shè)計(jì)原則和應(yīng)注意的問題設(shè)計(jì)原則:子程序是一種能完成某一特定任務(wù)的程序段,其資源要為所有調(diào)用程序共享。因此,子程序在結(jié)構(gòu)上應(yīng)具有獨(dú)立性和通用性。
4.3匯編語言程序設(shè)計(jì)舉例4.3.1子程序的設(shè)計(jì)編寫子程序時(shí)應(yīng)注意以下問題:(1).子程序的第一條指令的地址稱為子程序的入口地址。該指令前必須有標(biāo)號(hào)。(2).主程序調(diào)用子程序兩條調(diào)用子程序指令如下,實(shí)際應(yīng)用時(shí)只要寫調(diào)用子程序標(biāo)號(hào)。絕對(duì)調(diào)用指令: ACALLaddr11長(zhǎng)調(diào)用指令: LCALLaddr16(3).注意設(shè)置堆棧指針和現(xiàn)場(chǎng)保護(hù);(4).最后一條指令必須是RET指令;(5).子程序可以嵌套,即子程序中可以調(diào)用其它子程序。4.3匯編語言程序設(shè)計(jì)舉例4.3.1子程序的設(shè)計(jì)舉例:已知當(dāng)前狀態(tài)如圖 LCALL DEL ······DEL:PUSHPSW ; ······ RET66H 07H65H 06H64H 05H63H 04H62H 03H61H 02H60H 01HSPSP64HSP02H4.3匯編語言程序設(shè)計(jì)舉例4.3.1子程序的設(shè)計(jì)編寫子程序時(shí)應(yīng)注意以下問題:(6).子程序中壓棧和出棧指令必須成對(duì)出現(xiàn),否則會(huì)亂套。調(diào)用子程時(shí),先把調(diào)用指令的下一條指令地址壓棧,執(zhí)行返回指令時(shí),調(diào)用指令的下一條指令地址出棧送PC。SP38H下一條指令地址0264H返回時(shí),沒有返回到下一條指令地址0264H,而是從3802H處執(zhí)行程序。2.子程序的基本結(jié)構(gòu)MAIN: ┇ ;MAIN為主程序或調(diào)用程序標(biāo)號(hào) LCALLSUB ;調(diào)用子程序SUB ┇ ┇SUB: PUSHPSW ;現(xiàn)場(chǎng)保護(hù),不是必須的,根據(jù)情況。 PUSHACC ;
······ ;子程序處理程序段 POPACC ;現(xiàn)場(chǎng)恢復(fù) POPPSW ; RET ;最后一條指令必須為RET4.3匯編語言程序設(shè)計(jì)舉例4.3.1子程序的設(shè)計(jì)例:編寫一子程序,將A中的數(shù)據(jù)轉(zhuǎn)換成壓縮BCD碼,高字節(jié)放在R2,低字節(jié)放在R3。BCD: MOV B,#100 DIV AB ;(A)÷(B)商→A,余數(shù)→B MOV R2,A MOV A,B MOV B,#10 DIV AB ; SWAP A ORL A,B MOV R3,A RET ;最后一條指令必須為RET4.3匯編語言程序設(shè)計(jì)舉例4.3.1子程序的設(shè)計(jì)例如(A)=FDH=253,結(jié)果(R2)=02H,(R3)=53H(B)=100=64H(A)=02H(R2)=02H(B)=35H(A)=35H(B)=10=0AH(A)=05H(B)=03H(A)=50H(A)=53H(R3)=53H主程序中,將要轉(zhuǎn)換的數(shù)據(jù)放入A,然后LCALLBCD,轉(zhuǎn)換結(jié)果就放在R2R3了。
在單片機(jī)應(yīng)用系統(tǒng)中,查表程序是一種常用的程序。利用它可以避免復(fù)雜的運(yùn)算或轉(zhuǎn)換過程。查表就是根據(jù)自變量x,在表格中查找與之對(duì)應(yīng)的y。數(shù)據(jù)表格存放在程序存儲(chǔ)器,在寫入程序時(shí)一起寫入,采用偽指令DB或DW。指令系統(tǒng)中,給用戶提供了兩條查表指令:(1). MOVC A,@A+DPTR ;常用的查表指令把A中內(nèi)容與DPTR中內(nèi)容相加,所得結(jié)果為某一程序存儲(chǔ)單元的地址,然后把該地址單元中的內(nèi)容送到累加器A中。(2). MOVC A,@A+PC ;用的少注意:書中例4-3、例4-4、例4-6,用此指令,不要去看。4.3匯編語言程序設(shè)計(jì)舉例4.3.2查表程序設(shè)計(jì)
查表就是根據(jù)自變量x,在表格中找到與之對(duì)應(yīng)的y。求自變量x對(duì)應(yīng)的y在存儲(chǔ)器中的地址。設(shè)數(shù)據(jù)表格首地址為0800H4.3匯編語言程序設(shè)計(jì)舉例4.3.2查表程序設(shè)計(jì)
0800H00H0801H01H0802H04H0803H09H0804H10H0805H24Hx=0,y=x2x=1x=2(1)、若y為單字節(jié)數(shù),則x對(duì)應(yīng)的y的地址為:0800H+xxA,0800HDPTR用MOVCA,@A+DPTR(2)、若y為2字節(jié)數(shù),則x對(duì)應(yīng)的y的地址為:0800H+2x0800HDPTR(DPTR)+2xDPTR0A用MOVCA,@A+DPTR0800H00H0801H00H0802H00H0803H01H0804H00H0805H04Hx=1x=2x=0,y=x2例4-3設(shè)計(jì)一子程序,功能為:根據(jù)累加器A中的數(shù)x(0~9之間)查x的平方表y,根據(jù)x的值查出相應(yīng)的平方y(tǒng)。x和y均為單字節(jié)數(shù)。分析:設(shè)(A)=x=04H,則對(duì)應(yīng)的y的單元地址為起始地址+x程序如下: MOV DPTR,#TAB1 ;(DPTR)=2000H MOVCA,@A+DPTR;(2004H)→A,(A)=10H,42=16 RET ORG2000HTAB1: DB00H,01H,04H,09H,10H DB19H,24H,31H,40H,51H4.3匯編語言程序設(shè)計(jì)舉例4.3.2查表程序設(shè)計(jì)
例4-5
在一個(gè)以AT89C51單片機(jī)為核心的溫度控制器中,溫度傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸出的電壓已由A/D轉(zhuǎn)換為10位二進(jìn)制數(shù)。測(cè)得的不同溫度下的電壓值數(shù)據(jù),構(gòu)成一個(gè)表,表中數(shù)據(jù)為溫度值為y(雙字節(jié)無符號(hào)數(shù))。設(shè)測(cè)得的電壓值數(shù)據(jù)x(雙字節(jié)無符號(hào)數(shù))放入R2R3中,根據(jù)電壓值x,查找對(duì)應(yīng)的溫度值y,仍放入R2R3中。解:因?yàn)闇囟戎禐殡p字節(jié)無符號(hào)數(shù),則電壓x對(duì)應(yīng)的溫度值y的高、低位應(yīng)放在:表格起始地址+x×2,表格起始地址+x×2+1單元4.3匯編語言程序設(shè)計(jì)舉例4.3.2查表程序設(shè)計(jì)
設(shè)表格放在0800H為首地址存儲(chǔ)空間,則電壓x對(duì)應(yīng)的溫度值y的高位單元:0800H+x×2 低位單元:0800H+x×2+1ORG 0800HTAB2: DW0000H,0005H,000DH,0014H,0020H,002BH·······已知x放在R2R3中0R3R2Cy10000010100000004.3匯編語言程序設(shè)計(jì)舉例4.3.2查表程序設(shè)計(jì)
若(R2R3)=0182H,(R2R3)×2=0304H,0800H+0304H=0B04H采用左移×2的方法。0800H00H0801H00H0802H00H0803H05H0804H00H0805H0DHx=0x=1x=2例4-5查表子程序如下:設(shè)(R2R3)=0182H,TAB2=0800HLTB2: MOV DPTR,#TAB2 ;(DPTR)=0800H
MOVA,R3 CLRC RLCA ;(A)=04H,Cy=1 MOVR3,A ;(R3)=04H, XCHA,R2 ;(R2)=04H,(A)=01H RLCA ;(A)=03H XCHR2,A ;完成
(R2R3)×2→(R2R3)=0304 ADDA,DPL ;(R2R3)+(DPTR)→(DPTR) MOVDPL,A ;(DPL)=04H MOVA,DPH ;(A)=08H ADDCA,R2 ;(A)=0BH MOVDPH,A ;(DPH)=0BH(DPTR)=0B04H4.3匯編語言程序設(shè)計(jì)舉例4.3.2查表程序設(shè)計(jì)
CLR A MOVCA,@A+DPTR ;查第一字節(jié) MOVR2,A ;第一字節(jié)存入R2中 CLR A
INC DPTR MOVCA,@A+DPTR ;查第二字節(jié) MOVR3,A ;第二字節(jié)存入R3中 RET ORG 0800HTAB2:DW0000H,0005H,000DH,0014H
… ;溫度值表由于使用指令“MOVCA,@A+DPTR”,表TAB2可放入64KB程序存儲(chǔ)器空間的任何位置。4.3匯編語言程序設(shè)計(jì)舉例4.3.2查表程序設(shè)計(jì)
關(guān)鍵字查找就是在表中找到指定的關(guān)鍵字,也稱為數(shù)據(jù)檢索。數(shù)據(jù)檢索有兩種方法:順序檢索和對(duì)分檢索1.順序檢索
從第1項(xiàng)開始逐項(xiàng)順序查找,判斷所取數(shù)據(jù)是否與關(guān)鍵字相等。2.對(duì)分檢索前提:檢索的數(shù)據(jù)表已經(jīng)排好序,如何進(jìn)行數(shù)據(jù)排序,稍后介紹。方法:取數(shù)據(jù)表中間位置的數(shù)與關(guān)鍵字進(jìn)行比較,如相等,則查找到;如果不相等,則在可能的一半中取中間位置的數(shù)與關(guān)鍵字進(jìn)行比較;依此類推,逐漸縮小檢索范圍。這種方法減少次數(shù),大大提高查找速度。4.3匯編語言程序設(shè)計(jì)舉例4.3.3關(guān)鍵字查找程序設(shè)計(jì)例4-6從50個(gè)字節(jié)的無序表中查找一個(gè)關(guān)鍵字11H。順序檢索。 ORG1000H MOV30H,#17 ;關(guān)鍵字11H送30H單元 MOVR1,#50 ;查找次數(shù)送R1 MOVDPTR,#TAB4 ;表首地址送DPTRLOOP: MOVA,#0 ; MOVCA,@A+DPTR ;查表結(jié)果送A CJNEA,30H,LOOP1 ;(30H)≠XXH則,轉(zhuǎn)LOOP1 MOVR2,DPH ;已查到關(guān)鍵字, MOVR3,DPL ;把該字的地址送R2,R3DONE: RET 4.3匯編語言程序設(shè)計(jì)舉例4.3.3關(guān)鍵字查找程序設(shè)計(jì)LOOP1:INC DPTR ;修改數(shù)據(jù)指針DPTR DJNZ R1,LOOP ;R1≠0,未查完,繼續(xù)查找 MOV R2,#00H ;R1=0,清“0”R2和`R3 MOV R3,#00H ;表中50個(gè)數(shù)已查完 AJMP DONE ;從子程序返回TAB4: DB 0,4,10,17,23,29,36,42,47,53 DB 58,63,68,72,76,81,85,90,94,98 DB 103,107,111,115,118,123,127,131,135,139 DB 143,147,151,156,160,165,169,173,178,183 DB 188,192,197,203,209,215,220,226,233,241 END4.3匯編語言程序設(shè)計(jì)舉例4.3.3關(guān)鍵字查找程序設(shè)計(jì)數(shù)據(jù)極值查找就是在指定的數(shù)據(jù)區(qū)中找出最大值(或最小值),主要內(nèi)容就是進(jìn)行數(shù)值大小的比較,找出最大值(或最小值)并存于某一單元中。例4-7片內(nèi)RAM中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設(shè)R0中存首地址,R2中存放字節(jié)數(shù)。程序框圖如圖所示。4.3匯編語言程序設(shè)計(jì)舉例4.3.4數(shù)據(jù)極值查找程序設(shè)計(jì)開始指針指向表首最大數(shù)單元50H清0順序取一個(gè)數(shù)放入A(A)>(50H)?(A)→50HY存最大數(shù)比較結(jié)束?NN返回Y例4-7片內(nèi)RAM中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設(shè)R0中存首地址,R2中存放字節(jié)數(shù)。MOVR2,#n,應(yīng)該放在主程序。SMAX: MOV A,R0 ;存首地址指針 MOV R1,A ;R1作地址指針 MOV 50H,#0 ;臨時(shí)最大值單元放0LOOP: MOV A,@R1 ;一批數(shù)據(jù)中按順序取1個(gè)數(shù)據(jù) CJNE A,50H,$+3 ;與最大值單元的數(shù)比較 JC NEXT ;C=1,A中的數(shù)小,跳轉(zhuǎn)NEXT MOV 50H,A ;C=0,則大數(shù)送50HNEXT: DEC R1 ;指向下一個(gè)數(shù)據(jù)的地址 DJNZ R2,LOOP ;是否比較結(jié)束? MOV @R0,50H ;最大數(shù)存放于首地址中 RET 4.3匯編語言程序設(shè)計(jì)舉例4.3.4數(shù)據(jù)極值查找程序設(shè)計(jì)數(shù)據(jù)排序就是將一批數(shù)由小至大(升序)排列,或由大至小(降序)排列。冒泡法:相鄰數(shù)互換的排序方法,類似水中氣泡上浮。排序時(shí)從前向后進(jìn)行相鄰兩個(gè)數(shù)的比較,次序與要求的順序不符時(shí),就將兩個(gè)數(shù)互換;順序符合要求不互換。冒泡法是最常用的排序方法。4.3匯編語言程序設(shè)計(jì)舉例4.3.5數(shù)據(jù)排序程序設(shè)計(jì)假設(shè)有7個(gè)原始數(shù)據(jù)的排列順序?yàn)椋?、4、1、2、5、7、3。第一次冒泡的過程是:6、4、1、2、5、7、3 ;原始數(shù)據(jù)的排列4、6、1、2、5、7、3 ;逆序,互換4、1、6、2、5、7、3 ;逆序,互換4、1、2、6、5、7、3 ;逆序,互換4、1、2、5、6、7、3 ;逆序,互換4、1、2、5、6、7、3 ;正序,不互換4、1、2、5、6、3、7 ;逆序,互換,第一次冒泡結(jié)束第二次冒泡的過程是:4、1、2、5、6、3、7 ;第一次冒泡結(jié)果1、4、2、5、6、3、7
;逆序,互換······4.3匯編語言程序設(shè)計(jì)舉例4.3.5數(shù)據(jù)排序程序設(shè)計(jì)*****如此進(jìn)行,各次冒泡的結(jié)果如下:第1次冒泡結(jié)果:4、1、2、5、6、3、7第2次冒泡結(jié)果:1、2、4、5、3、6、7第3次冒泡結(jié)果:1、2、4、3、5、6、7第4次冒泡結(jié)果:1、2、3、4、5、6、7;已完成排序第5次冒泡結(jié)果:1、2、3、4、5、6、7第6次冒泡結(jié)果:1、2、3、4、5、6、7對(duì)于n個(gè)數(shù),理論上應(yīng)進(jìn)行(n-1)次冒泡,有時(shí)不到(n-1)次就已完成排序。如何判斷排序是否完成呢?就看各次冒泡中是否有數(shù)據(jù)交換發(fā)生,若有數(shù)據(jù)交換,排序沒有完成;否則已經(jīng)排好序列。在程序設(shè)計(jì)中,常使用設(shè)置互換標(biāo)志的方法,該標(biāo)志的狀態(tài)表示在一次冒泡中是否有互換進(jìn)行。4.3匯編語言程序設(shè)計(jì)舉例4.3.5數(shù)據(jù)排序程序設(shè)計(jì)例4-8一批單字節(jié)無符號(hào)數(shù),以R0為首地址指針,R2中為字節(jié)數(shù),將這批數(shù)進(jìn)行升序排列。即由小到大排列。程序框圖如圖4-2所示。首先,分析冒泡法的關(guān)鍵程序4.3匯編語言程序設(shè)計(jì)舉例4.3.5數(shù)據(jù)排序程序設(shè)計(jì)
MOV A,@R1 ;取第1個(gè)數(shù)LOOP: MOV R3,A ;作比較的數(shù)放R3 INC R1 ;指針指向下一個(gè)地址 CLR C ; MOV A,@R1 ;取比較的另一個(gè)數(shù) SUBB A,R3 ;比較大小 JNC LOOP1 ;(A)大,不需要互換 SETB F0 ;互換標(biāo)志位F0置1 MOV A,R3; ;從R3取出作比較的數(shù) XCH A,@R1 ;(R3)→(R1),((R1))→A DEC R1 ;R1指向第一數(shù)的地址 XCH A,@R1 ;(A)→(R1),實(shí)現(xiàn)兩個(gè)數(shù)互換 INC R1 ;指針恢復(fù)LOOP1: MOV A,@R1 DJNZ R5,LOOP4.3匯編語言程序設(shè)計(jì)舉例4.3.5數(shù)據(jù)排序程序設(shè)計(jì)40H641H442H143H244H545H746H3AR1R3R540H06H06H06H41H04HCy?0FEH101H02H05H07H03H06H04H40H06H06H05H例4-8完整的程序,紅色陰影的部分是已講過的關(guān)鍵部分SORT: MOV A,R0 ;首地址送R1 MOV R1,A MOV A,R2 ;字節(jié)數(shù)送入R5 MOV R5,A CLR F0 ;互換標(biāo)志位F0清零 DEC R5 ;比較次數(shù)為n-1 MOV A,@R1 ;取第1個(gè)數(shù)LOOP: MOV R3,A ;作比較的數(shù)放R3 INC R1 ;指針指向下一個(gè)地址 CLR C ; MOVA,@R1 ;比較大小4.3匯編語言程序設(shè)計(jì)舉例4.3.5數(shù)據(jù)排序程序設(shè)計(jì) SUBBA,R3 ;不影響Cy JNC LOOP1 ;(A)大,不需要互換 SETB F0 ;互換標(biāo)志位F0置1 MOV A,R3; ;從R3取出作比較的數(shù) XCH A,@R1 ;(R3)→(R1),((R1))→A DEC R1 ;R1指向(R3)的地址 XCH A,@R1 ;(A)→(R1),實(shí)現(xiàn)兩個(gè)數(shù)互換 INC R1 ;指針恢復(fù)LOOP1: MOV A,@R1 DJNZ R5,LOOP ;本次比較結(jié)束 JB F0,SORT ;本次比較結(jié)束,F(xiàn)0≠0繼續(xù) RET4.3匯編語言程序設(shè)計(jì)舉例4.3.5數(shù)據(jù)排序程序設(shè)計(jì)*****分支轉(zhuǎn)移程序特點(diǎn)是程序中含有轉(zhuǎn)移指令,轉(zhuǎn)移指令有分為無條件轉(zhuǎn)移和有條件轉(zhuǎn)移,因此分支程序也可分為無條件分支轉(zhuǎn)移程序和有條件分支轉(zhuǎn)移程序。有條件分支轉(zhuǎn)移程序按結(jié)構(gòu)類型來分,又分為單分支轉(zhuǎn)移結(jié)構(gòu)和多分支轉(zhuǎn)移結(jié)構(gòu)。4.3.6分支轉(zhuǎn)移程序設(shè)計(jì)1.單分支轉(zhuǎn)移結(jié)構(gòu)
僅有兩個(gè)出口,兩者選一。例4-9求單字節(jié)有符號(hào)數(shù)的二進(jìn)制補(bǔ)碼。正數(shù)的補(bǔ)碼是其本身,不需要轉(zhuǎn)換,負(fù)數(shù)的補(bǔ)碼需要轉(zhuǎn)換得到,方法是求反后+1。程序框圖如圖4-3所示:4.3匯編語言程序設(shè)計(jì)舉例例4-9參考程序:CMPT: JNB Acc.7,RETURN ;(A)>0,不需轉(zhuǎn)換 MOVC,Acc.7 ;符號(hào)位保存 CPL A ;(A)求反, ADD A,#1 ;加1 MOV Acc.7,C ;符號(hào)位存A的最高位RETURN: RET4.3匯編語言程序設(shè)計(jì)舉例4.3.6分支轉(zhuǎn)移程序設(shè)計(jì)2.多分支轉(zhuǎn)移結(jié)構(gòu)
程序的判別部分有兩個(gè)以上的出口時(shí),為多分支選擇結(jié)構(gòu)。常見的兩種形式。如圖4-6和圖4-7。4.3匯編語言程序設(shè)計(jì)舉例4.3.6分支轉(zhuǎn)移程序設(shè)計(jì)圖4-6圖4-7逐次比較法散轉(zhuǎn)(A)=1(A)=n指令系統(tǒng)提供了非常有用的兩種多分支選擇指令間接轉(zhuǎn)移指令: JMP@A+DPTR ;散轉(zhuǎn)指令比較轉(zhuǎn)移指令: CJNEA,direct,rel; CJNEA,#data,rel; CJNERn,#data,rel; CJNE@Ri,#data,rel;最簡(jiǎn)單的分支轉(zhuǎn)移程序的設(shè)計(jì),一般常采用逐次比較法,就是把所有不同的情況一個(gè)一個(gè)的進(jìn)行比較,發(fā)現(xiàn)符合就轉(zhuǎn)向?qū)?yīng)的處理程序。這種方法的主要缺點(diǎn)是程序太長(zhǎng),有n種可能的情況,就需有n個(gè)判斷和轉(zhuǎn)移。4.3匯編語言程序設(shè)計(jì)舉例4.3.6分支轉(zhuǎn)移程序設(shè)計(jì)例4-10求符號(hào)函數(shù)的值。符號(hào)函數(shù)定義:X存放在40H單元,Y存放在41H單元,程序框圖如圖4-6所示。4.3匯編語言程序設(shè)計(jì)舉例4.3.6分支轉(zhuǎn)移程序設(shè)計(jì)程序如下:SIGNFUC: MOVA,40H CJNE A,#00H,NZEAR AJMP POSINZEAR: JB Acc.7,NEGT MOVA,#01H
AJMPPOSINEGT: MOVA,#81HPOSI: MOV41H,A
ENDANL A,#80HORL A,#01H
實(shí)際應(yīng)用中,經(jīng)常需要采用散轉(zhuǎn)結(jié)構(gòu)形式的分支轉(zhuǎn)移程序設(shè)計(jì):根據(jù)某一單元的內(nèi)容是0,1,……,n,分別轉(zhuǎn)向處理程序0,處理程序1,……處理程序n。
典型例子就是當(dāng)單片機(jī)系統(tǒng)中的鍵盤按下時(shí),就會(huì)得到一個(gè)鍵值,根據(jù)不同的鍵值,跳向不同的鍵處理程序入口。對(duì)于這種情況,可用直接無條件轉(zhuǎn)移指令(LJMP或AJMP指令)組成一個(gè)轉(zhuǎn)移表,然后再利用間接轉(zhuǎn)移指令實(shí)現(xiàn)分支轉(zhuǎn)移。例4-12根據(jù)寄存器R2的內(nèi)容,轉(zhuǎn)向各個(gè)處理程序PRGX(X=0~n)。 (R2)=0,轉(zhuǎn)PRG0 (R2)=1,轉(zhuǎn)PRG1 ┇ (R2)=n,轉(zhuǎn)PRGn4.3匯編語言程序設(shè)計(jì)舉例4.3.6分支轉(zhuǎn)移程序設(shè)計(jì)JMP6: MOV DPTR,#TAB5 ; MOV A,R2 MOV B,#3 ; MUL AB MOV R6,A ; MOV A,B ; ADD A,DPH ; MOV DPH,A ; MOV A,R6 ; JMP @A+DPTR ;
┇TAB5: LJMP PRG0 LJMP PRG1
LJMP PRG2
4.3匯編語言程序設(shè)計(jì)舉例4.3.6分支轉(zhuǎn)移程序設(shè)計(jì)AR2DPTR04H0402H02H00H70HLJMPPRG00405H 02H01H20HLJMPPRG10408H 02H01H90HLJMPPRG2
040BH 02H01HB0HLJMPPRG3
DPHDPLBR602H02H06H03H02H06H00H00H04H06H采用循環(huán)結(jié)構(gòu)可縮短程序長(zhǎng)度;使程序結(jié)構(gòu)緊湊和可讀性變好。1.循環(huán)程序的結(jié)構(gòu)(1).循環(huán)初始化用于完成循環(huán)前的準(zhǔn)備工作。例如,循環(huán)次數(shù)初值設(shè)置、指針起始地址設(shè)置、為變量預(yù)置初值等。(2).循環(huán)處理用于完成實(shí)際的處理工作,是需反復(fù)循環(huán)執(zhí)行的部分,故又稱循環(huán)體。這部分程序的內(nèi)容,取決于實(shí)際處理問題的本身。(3).循環(huán)控制
循環(huán)結(jié)束控制方法分為循環(huán)計(jì)數(shù)控制法和條件控制法,在重復(fù)執(zhí)行循環(huán)體的過程中,要不斷修改循環(huán)控制變量,使循環(huán)能夠結(jié)束。
(4).循環(huán)結(jié)束4.3匯編語言程序設(shè)計(jì)舉例4.3.7循環(huán)程序設(shè)計(jì)
2.循環(huán)結(jié)構(gòu)的控制圖4-8是計(jì)數(shù)循環(huán)控制結(jié)構(gòu),圖4-9是條件控制結(jié)構(gòu)。4.3匯編語言程序設(shè)計(jì)舉例4.3.7循環(huán)程序設(shè)計(jì)
圖4-8圖4-9(1).計(jì)數(shù)循環(huán)結(jié)構(gòu)計(jì)數(shù)循環(huán)控制結(jié)構(gòu)是依據(jù)計(jì)數(shù)器的值來決定循環(huán)次數(shù)。AT89C51的指令系統(tǒng)提供了功能極強(qiáng)的循環(huán)控制指令: DJNZRn,rel ;Rn作控制計(jì)數(shù)器 DJNZdirect,rel ;單元作控制計(jì)數(shù)器。計(jì)數(shù)器的初值是在初始化時(shí)設(shè)定,例如:MOVR7,#8。4.3匯編語言程序設(shè)計(jì)舉例4.3.7循環(huán)程序設(shè)計(jì)
例4-12一組單字節(jié)無符號(hào)數(shù)存放在內(nèi)部RAM50H開始的單元中,求50H開始的n個(gè)單元的數(shù)據(jù)和,雙字節(jié)結(jié)果要求存放在R3R4中。程序設(shè)計(jì)思路(1).初始化: n→R2,0→R3,0→R4,50H→R0(2).循環(huán)處理:4.3匯編語言程序設(shè)計(jì)舉例4.3.7循環(huán)程序設(shè)計(jì)
(R3)(R4)+((R0))↓R40↓R3(3).循環(huán)控制:(R0)+1→R0,(R2)-1→R2,(R2)=0?是,結(jié)束循環(huán)例4-12求50H單元開始的n個(gè)數(shù)據(jù)和,結(jié)果存R3R4。(1).初始化:n→R2,0→R3,0→R4,50H→R0(2).循環(huán)處理:4.3匯編語言程序設(shè)計(jì)舉例4.3.7循環(huán)程序設(shè)計(jì)
ADD1: MOV R2,#n ;循環(huán)次數(shù)n送R2 MOV R3,#0 MOV R4,#0 ;和清0 MOV R0,#50H ;首地址LOOP:MOV A,R4 ADD A,@R0 MOV R4,A CLR A ADDC A,R3 ;(R3)+0+Cy→A MOV R3,A
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年民生銀行蘭州分行社會(huì)招聘?jìng)淇碱}庫及一套參考答案詳解
- 2025-2026 學(xué)年高三 思想政治 學(xué)情調(diào)研 試卷及答案
- 留學(xué)平臺(tái)協(xié)議合同
- 電腦里修改協(xié)議書
- 借地造房協(xié)議書
- 窯爐轉(zhuǎn)讓同協(xié)議書
- 清洗吸污合同范本
- 清洗物品合同范本
- 倉儲(chǔ)代理協(xié)議書
- 房屋共協(xié)議書范本
- 安全崗面試題庫及答案
- 2025年勞動(dòng)合同(兼職設(shè)計(jì)師)
- 2025至2030中國(guó)牙科高速手機(jī)行業(yè)調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 2025年遼寧地區(qū)農(nóng)村電力服務(wù)有限公司聯(lián)合招聘筆試參考試題附答案解析
- 旱獺繁殖生態(tài)學(xué)-洞察及研究
- 2025年監(jiān)理工程師考試《土建案例》真題及答案解析(完整版)
- 土地整治考試試題及答案
- 重慶市大一聯(lián)盟2026屆高三上學(xué)期12月聯(lián)考數(shù)學(xué)試卷(含解析)
- 2026屆上海市寶山區(qū)高三上學(xué)期一模數(shù)學(xué)試卷及答案解析
- 毛筆書法春聯(lián)課程
- DB34∕T 4007-2021 特種設(shè)備作業(yè)人員職業(yè)技能培訓(xùn)機(jī)構(gòu)基本條件
評(píng)論
0/150
提交評(píng)論