




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第四章
80C51單片微機(jī)的程序設(shè)計(jì)
第四章
80C51單片微機(jī)的程序設(shè)計(jì)4.1概述
4.1.1匯編語(yǔ)言格式
1.計(jì)算機(jī)語(yǔ)言——機(jī)器語(yǔ)言、匯編語(yǔ)言與高級(jí)語(yǔ)言
程序:為計(jì)算某一算式或完成某一工作的若干指令的有序集合。計(jì)算機(jī)的全部工作概括起來(lái),就是執(zhí)行這一指令序列的過(guò)程。程序設(shè)計(jì):為計(jì)算機(jī)準(zhǔn)備這一指令序列前的過(guò)程。
⑴機(jī)器語(yǔ)言機(jī)器語(yǔ)言系統(tǒng):用二進(jìn)制代碼表示的指令系統(tǒng),簡(jiǎn)稱(chēng)為機(jī)器語(yǔ)言。直接用機(jī)器語(yǔ)言編寫(xiě)的程序稱(chēng)為手編程序或機(jī)器語(yǔ)言程序。4.1概述
4.1.1匯編語(yǔ)言格式 1.計(jì)算機(jī)語(yǔ)言— ⑵
匯編語(yǔ)言
在機(jī)器語(yǔ)言,這些英文字符被稱(chēng)為助記符。用這種助記符表示指令系統(tǒng)的語(yǔ)言稱(chēng)為匯編語(yǔ)言或符號(hào)語(yǔ)言,用匯編語(yǔ)言編寫(xiě)的程序稱(chēng)為匯編語(yǔ)言程序。特點(diǎn):①助記符指令與機(jī)器指令是--對(duì)應(yīng)的,用匯編語(yǔ)言編寫(xiě)的程序效率高,占用存儲(chǔ)空間小,運(yùn)行速度快,而且能反映計(jì)算機(jī)的實(shí)際運(yùn)行情況,所以用匯編語(yǔ)言能編寫(xiě)出最優(yōu)化的程序。②匯編語(yǔ)言是“面向機(jī)器”的語(yǔ)言,編程比使用高級(jí)語(yǔ)言困難。③匯編語(yǔ)言能直接訪問(wèn)存儲(chǔ)器、輸入與輸出接口及擴(kuò)展的各種芯片(比如A/D、D/A等),也可直接處理中斷,匯編語(yǔ)言能直接管理和控制硬件設(shè)備。 ⑵匯編語(yǔ)言④匯編語(yǔ)言通用性差,匯編語(yǔ)言和機(jī)器語(yǔ)言一樣,都面向一臺(tái)具體的機(jī)器,不同的單片微機(jī)具有不同的指令系統(tǒng),并且不能通用。 不能直接識(shí)別在匯編語(yǔ)言中出現(xiàn)的字母、數(shù)字和符號(hào),需要將其轉(zhuǎn)換成用二進(jìn)制代碼表示的機(jī)器語(yǔ)言程序,才能夠識(shí)別和執(zhí)行。通常把這一轉(zhuǎn)換(翻譯)工作稱(chēng)為匯編。人工匯編:由程序員通過(guò)查指令表把匯編指令程序轉(zhuǎn)換為機(jī)器語(yǔ)言程序的過(guò)程。由專(zhuān)門(mén)的程序來(lái)進(jìn)行匯編,這種程序稱(chēng)為匯編程序。經(jīng)匯編程序匯編而得到的機(jī)器語(yǔ)言程序,計(jì)算機(jī)能夠識(shí)別和執(zhí)行,這一機(jī)機(jī)器語(yǔ)言程序稱(chēng)為目的程序或目標(biāo)程序,而匯編語(yǔ)言程序稱(chēng)為源程序。這3者之間的關(guān)系如圖4–1所示。④匯編語(yǔ)言通用性差,匯編語(yǔ)言和機(jī)器語(yǔ)言一樣,都面向一臺(tái)具體 ⑶高級(jí)語(yǔ)言
比如BASIC、FORTRAN、COBOL及PASCAL等,都是一些參照數(shù)學(xué)語(yǔ)言而設(shè)計(jì)的、近似于人們?nèi)粘S谜Z(yǔ)的語(yǔ)言。通用性強(qiáng),易于移植到不同類(lèi)型的機(jī)器中去。計(jì)算機(jī)也不能直接識(shí)別和執(zhí)行高級(jí)語(yǔ)言,需要將其轉(zhuǎn)換為機(jī)器語(yǔ)言才能識(shí)別和執(zhí)行。對(duì)于高級(jí)語(yǔ)言,這一轉(zhuǎn)換工作通常稱(chēng)為編譯或者解釋。進(jìn)行編譯或者解釋的專(zhuān)用程序稱(chēng)為編譯程序或者解釋程序。 由于高級(jí)語(yǔ)言不受具體機(jī)器的限制,而且使用了許多數(shù)學(xué)公式和習(xí)慣用語(yǔ),從而簡(jiǎn)化了程序設(shè)計(jì)的過(guò)程,因此是一種面向問(wèn)題或者面向過(guò)程的語(yǔ)言。比如,APT、PROLOG、LISP、PL/M以及C語(yǔ)言等。而80C51系列單片微機(jī)作為工業(yè)標(biāo)準(zhǔn)地位,從1985年開(kāi)始就有C語(yǔ)言編譯器,簡(jiǎn)稱(chēng)C51。 ⑶高級(jí)語(yǔ)言 ⒉匯編語(yǔ)言 ⑴匯編語(yǔ)言語(yǔ)句的種類(lèi)和格式
①匯編語(yǔ)言語(yǔ)句的種類(lèi) 指令語(yǔ)句:每1個(gè)指令語(yǔ)句都在匯編時(shí)產(chǎn)生1個(gè)目標(biāo)代碼,對(duì)應(yīng)著機(jī)器的1種操作。 例如:MOVA,#0
偽指令語(yǔ)句:主要是為匯編語(yǔ)言服務(wù)的,在匯編時(shí)沒(méi)有目標(biāo)代碼與之對(duì)應(yīng)。 例如:ONEEQU1
宏指令語(yǔ)句:用以代替匯編語(yǔ)言源程序中重復(fù)使用的程序段的1種語(yǔ)句,由匯編程序在匯編時(shí)產(chǎn)生相應(yīng)的目標(biāo)代碼。 ⒉匯編語(yǔ)言 ②匯編語(yǔ)言語(yǔ)句的格式
指令語(yǔ)句的格式為:【標(biāo)號(hào)(名字)】:助記符(操作碼)【操作數(shù)(參數(shù))】;【注釋】 偽指令語(yǔ)句的格式: 名字定義符參數(shù);注釋各字段之間用1個(gè)空格或字段定界符分隔,常用的字段定界符有冒號(hào)“:”、逗號(hào)“,”和分號(hào)“;”。其中方括號(hào)括起來(lái)的是可選擇部分。 ②匯編語(yǔ)言語(yǔ)句的格標(biāo)號(hào)域: 說(shuō)明指令的地址。標(biāo)號(hào)可以作為L(zhǎng)JMP、AJMP、LCALL及ACALL等指令的操作數(shù)。
在指令語(yǔ)句中,標(biāo)號(hào)位于一個(gè)語(yǔ)句的開(kāi)頭位置,由字母和數(shù)符組成,字母打頭,冒號(hào)“:”結(jié)束。標(biāo)號(hào)中的字符個(gè)數(shù)一般不超過(guò)8個(gè),若超過(guò)8個(gè),則以前面的8個(gè)為有效,后面字符不起作用。
不能使用本匯編語(yǔ)言中已經(jīng)定義了的符號(hào)作標(biāo)號(hào),比如指令助記符(如ADD)、偽指令(如END)
一條語(yǔ)句可以有標(biāo)號(hào),也可以沒(méi)有標(biāo)號(hào)標(biāo)號(hào)域:操作碼域: 是指令的助記符或定義符,用來(lái)表示指令的性質(zhì),規(guī)定這個(gè)指令語(yǔ)句的操作類(lèi)型。偽指令語(yǔ)句中的定義符規(guī)定這個(gè)指令語(yǔ)句的偽操作功能。對(duì)于標(biāo)號(hào)缺省的語(yǔ)句,操作碼域作為一行的開(kāi)始。但在書(shū)寫(xiě)時(shí),應(yīng)與上一行的操作碼對(duì)齊。操作碼域:操作數(shù)域:給出的是參與運(yùn)算或進(jìn)行其它操作的數(shù)據(jù)或這些數(shù)據(jù)的地址。
操作數(shù)與操作碼之間用空格“”分隔,若有兩個(gè)操作數(shù),這兩個(gè)操作數(shù)之間必須用逗號(hào)“,”分開(kāi)。對(duì)于操作數(shù)域出現(xiàn)的常數(shù):若采用十六進(jìn)制數(shù)表示,其末尾必須加“H”說(shuō)明;若十六進(jìn)制數(shù)以A、B、C、D、E、F開(kāi)頭,其前面必須添1個(gè)“0”進(jìn)行引導(dǎo)說(shuō)明。若采用二進(jìn)制數(shù)表示,其末尾必須用“B”說(shuō)明。若采用十進(jìn)制數(shù)表示,可以不加后綴或加“D”說(shuō)明。
操作數(shù)域:
注釋域由分號(hào)“;”引導(dǎo)開(kāi)始,是說(shuō)明語(yǔ)句功能、性質(zhì)以及執(zhí)行結(jié)果的文字。以分號(hào)“;”引導(dǎo)。
注釋域例:把片外存儲(chǔ)器2200H單元中的數(shù)送入片內(nèi)70H單元中。
標(biāo)號(hào)域操作碼域操作數(shù)域注釋域
BEGIN:MOVDPTR,#2200H;(DPTR)=2200H MOVR0,#70H;(R0)=70H MOVXA,@DPTR;(A)=((DPTR)) MOV@R0,A;((R0))=(A)例:把片外存儲(chǔ)器2200H單元中的數(shù)送入片內(nèi)70H單元中。
偽指令:為了便于編程和對(duì)匯編語(yǔ)言程序進(jìn)行匯編,各種匯編程序都提供一些特殊的指令,供人們編程使用。由偽指令確定的操作稱(chēng)為偽操作。偽指令又稱(chēng)匯編程序控制譯碼指令?!皞巍斌w現(xiàn)在匯編時(shí)不產(chǎn)生機(jī)器指令代碼,不影響程序的執(zhí)行,僅指明在匯編時(shí)執(zhí)行一些特殊的操作。
4.1.2偽指令語(yǔ)句
偽指令:為了便于編程和對(duì)匯編語(yǔ)言程序進(jìn)行匯編,各種匯編程序 ⒈O(jiān)RG(ORiGIN)匯編起始地址偽指令 指令格式為:ORG<表達(dá)式> 含義:向匯編程序說(shuō)明,下述程序段的起始地址由表達(dá)式指明。表達(dá)式通常為16進(jìn)制地址碼。
一般規(guī)定,在由ORG偽指令定位時(shí),其地址應(yīng)當(dāng)由小到大,不能重疊。
它的有效范圍一直到下一條ORG偽指令出現(xiàn)為止。
跟在ORG偽指令后面的程序段或數(shù)據(jù)段是絕對(duì)地址還是浮動(dòng)地址段,依賴(lài)于ORG右邊的表達(dá)式性質(zhì)。 ⒈O(jiān)RG(ORiGIN)匯 ORG1000HSTART:MOVA,#12H
含義:通知匯編程序,從START開(kāi)始的程序段,其起始地址由1000H開(kāi)始。由于1000H是立即數(shù)型地址碼,所以還隱含地指明該程序段是絕對(duì)地址段。
假定ORG右邊的表達(dá)式是浮動(dòng)程序段中定義的標(biāo)號(hào)RELOCA,則
ORGRELOCASUBROU:……表明
SUBROU起始于
RELOCA(它是相對(duì)地址)浮動(dòng)地址的程序段。
ORG1000H ⒉END(ENDofassembly)匯編結(jié)束偽指令
匯編結(jié)束偽指令一般有以下兩種格式: 主程序模塊:<標(biāo)號(hào)>END<表達(dá)式> 子程序模塊:<標(biāo)號(hào)>END
含義:通知匯編程序,該程序段匯編至此結(jié)束。END語(yǔ)句應(yīng)設(shè)置在整個(gè)程序(包括偽指令在內(nèi))的后面。 當(dāng)源程序?yàn)橹鞒绦驎r(shí),END偽指令中可有標(biāo)號(hào),這個(gè)標(biāo)號(hào)應(yīng)是主程序第一條指令的符號(hào)地址。若源程序?yàn)樽映绦?,則在END偽指令中不需要帶標(biāo)號(hào)。
⒉END(ENDofas ⒊EQU(EQUate)賦值偽指令
指令格式為:<標(biāo)號(hào)>EQU<表達(dá)式> 含義:把表達(dá)式賦值于標(biāo)號(hào),這里的標(biāo)號(hào)和表達(dá)式是必不可少的。例如:
LOOP EQU 2002H是向匯編程序表明,標(biāo)號(hào)LOOP的值為2002H。又如:
LOOP1EQU LOOP LOOP已賦值為2002H,則相當(dāng)于LOOP1=LOOP,即LOOPI也為2002H,在程序中LOOP和LOOP1可以互換使用。
用EQU語(yǔ)句給一個(gè)標(biāo)號(hào)賦值以后,在整個(gè)源程序中該標(biāo)號(hào)的值是固定的,不能更改。 ⒊EQU(EQUate)賦 ⒋DL定義標(biāo)號(hào)值偽指令
指令格式為:<標(biāo)號(hào)>DL<表達(dá)式>
含義:說(shuō)明標(biāo)號(hào)等值于表達(dá)式。同樣,標(biāo)號(hào)和表達(dá)式是必不可少的。例如;
COUNTDL3000H;S定義標(biāo)號(hào)COUNT的值為 ;3000H COUNTDLCOUNT十1;重新定義COUNT的值為 ;3000H+l
可用DL語(yǔ)句在同一源程序中給同一標(biāo)號(hào)賦予不同的值,即可更改已定義的標(biāo)號(hào)值;而用EQU語(yǔ)句定義的標(biāo)號(hào),在整個(gè)源程序中不能更改。
⒋DL定義標(biāo)號(hào)值偽指令 ⒌DB(DefineByte)定義字節(jié)偽指令
指令格式為:<標(biāo)號(hào)>DB<表達(dá)式或表達(dá)式表>含義:將表達(dá)式或表達(dá)式表所表示的數(shù)據(jù)或數(shù)據(jù)串存入從標(biāo)號(hào)開(kāi)始的連續(xù)存儲(chǔ)單元中。標(biāo)號(hào)為可選項(xiàng),它表示數(shù)據(jù)存儲(chǔ)單元地址。表達(dá)式或表達(dá)式表是指一個(gè)字節(jié)或用逗號(hào)分開(kāi)的字節(jié)數(shù)據(jù)??梢允怯靡?hào)括起來(lái)的字符串。字符串中的字符按ASCII碼存于連續(xù)的ROM中。例如:
ORG 2000HTABLEDB73H,04,100,32,00,-2,“ABC”
表示字節(jié)串?dāng)?shù)據(jù)存入由TABLE標(biāo)號(hào)為起始地址的連續(xù)存儲(chǔ)器單元中。即從2000H存儲(chǔ)單元開(kāi)始依次連續(xù)存放數(shù)據(jù)為:73H,04H,64H,20H,00H,F(xiàn)EH,41H,42H,43H。
⒌DB(DefineB
若不采用ORG偽指令專(zhuān)門(mén)規(guī)定數(shù)據(jù)區(qū)的起始地址,則數(shù)據(jù)區(qū)的起始地址即根據(jù)DB命令前一條指令的地址確定。這時(shí)DB所定義的數(shù)據(jù)字節(jié)的起始地址為DB命令前一條指令的地址加上該指令的字節(jié)數(shù)。
若不采用ORG偽指令專(zhuān)門(mén)規(guī)定數(shù)據(jù)區(qū)的起始地址,則數(shù)據(jù)區(qū)的起 ⒍DW(DefineWord)定義字偽指令指令格式為:<標(biāo)號(hào)>DW<表達(dá)式或表達(dá)式表> 含義:把字或字串值存入由標(biāo)號(hào)開(kāi)始的連續(xù)存儲(chǔ)單元中,且把字的高字節(jié)數(shù)存入低地址單元,低字節(jié)數(shù)存入高地址單元。按順序連續(xù)存放。
DW 100H,3456H,814
表示按順序存入01H,00H,34H,56H,03H,2EH注:DB和DW定義的數(shù)表,數(shù)的個(gè)數(shù)不得超過(guò)80個(gè)。若數(shù)據(jù)的數(shù)目較多時(shí),可以使用多個(gè)定義命令。一般以DB來(lái)定義數(shù)據(jù),以DW來(lái)定義地址。 ⒍DW(DefineWor ⒎DS(DefineStorage)定義存儲(chǔ)區(qū)偽指令
指令格式為:<標(biāo)號(hào)>DS<表達(dá)式>含義:通知匯編程序,在目標(biāo)代碼中,以標(biāo)號(hào)為首地址保留表達(dá)式值的若干存儲(chǔ)單元以備源程序使用。匯編時(shí),對(duì)這些單元不賦值。例如:
BASEDS100H
通知匯編程序,從標(biāo)號(hào)BASE開(kāi)始,保留100H個(gè)存儲(chǔ)單元,以備源程序另用。
注意,對(duì)于80C51單片微機(jī),DB、DW、DS等偽指令只能應(yīng)用于程序存儲(chǔ)器,而不能對(duì)數(shù)據(jù)存儲(chǔ)器使用。
⒎DS(DefineStorage)定義存儲(chǔ)區(qū) ⒏BIT位定義偽指令
命令格式為:<字符名稱(chēng)>BIT<位地址>
含義:給字符名稱(chēng)賦予位地址。其中,位地址可以是絕對(duì)地址,也可以是符號(hào)地址。 例:ABC BIT P3.1
把P3.1位地址賦值給ABC,在后面的編程中,ABC即可作為位地址P3.1使用。
⒏BIT位定義偽指令例1.
偽指令應(yīng)用
ORG8100H BUFFERDS10H DW“AB” DW100H,1ACH,-814說(shuō)明:①?gòu)?100H至810FH為緩沖區(qū)空間
②(8110H)=41H(‘A’) (8111H)=42H(‘B’) ③8112H單元起存放01H、00H、01H、ACH、FCH、D2H
例1.偽指令應(yīng)用4.280C51匯編語(yǔ)言程序設(shè)計(jì)
匯編語(yǔ)言程序設(shè)計(jì),就是采用匯編指令來(lái)編寫(xiě)計(jì)算機(jī)程序。在實(shí)際編程中,如何正確選擇指令、尋址方式和合理使用工作寄存器,包括數(shù)據(jù)存儲(chǔ)器單元,如何對(duì)擴(kuò)展的I/O端口進(jìn)行操作等,都是基本的匯編語(yǔ)言程序設(shè)計(jì)技巧。 程序結(jié)構(gòu)一般采用以下3種基本控制結(jié)構(gòu),即順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)來(lái)組成,再加上使用廣泛的子程序及中斷服務(wù)子程序,共有5種基本結(jié)構(gòu)。
4.280C51匯編語(yǔ)言程序設(shè)計(jì) 匯編語(yǔ)言
按照邏輯操作順序,從某一條指令開(kāi)始逐條順序執(zhí)行,直至某一條指令為止。
例2.數(shù)據(jù)傳送和交換。將R0與R7內(nèi)容互換,R4與內(nèi)存20H單元內(nèi)容互換。
XCHR:MOV A,R0 XCH A,R7XCH A,R0;R0與R7內(nèi)容互換
MOV A,R4 XCH A,20HXCH A,R4 ;R4與20H單元內(nèi)容互換
4.2
.1順序結(jié)構(gòu)程序設(shè)計(jì)
按照邏輯操作順序,從某一條指令開(kāi)始逐條順序執(zhí)行
設(shè)被加數(shù)存放于片內(nèi)RAM的20H(低位字節(jié))、21H(高位字節(jié)),加數(shù)存放于22H(低位字節(jié))和23H(高位字節(jié)),運(yùn)算結(jié)果的和數(shù)存放于20H(低位字節(jié))和21H(高位字節(jié))中。實(shí)現(xiàn)16位相加。START:PUSHACC ;將A中內(nèi)容進(jìn)棧保護(hù)
MOVR0,#20H ;將20H地址送R0MOVR1,#22H ;將22H地址值送R1 MOVA,@R0 ;被加數(shù)低字節(jié)內(nèi)容送A ADDA,@R1 ;低字節(jié)數(shù)相加
MOV@R0,A ;低字節(jié)數(shù)和存20H中
例3.不帶符號(hào)多字節(jié)加法。
設(shè)被加數(shù)存放于片內(nèi)RAM的20H(低位字節(jié))、21H INC R0 ;指向被加數(shù)高位字節(jié)
INCR1 ;指向加數(shù)高位字節(jié)
MOVA,@R0 ;被加數(shù)高位字節(jié)送A
ADDCA,@R1 ;高字節(jié)數(shù)帶進(jìn)位相加
MOV@R0,A ;高字節(jié)數(shù)和存21H中
CLR A ADDC A,#00H MOV 10H,A ;進(jìn)位暫存于10H中
POP ACC ;恢復(fù)A原內(nèi)容
INC R0 ;指向被加數(shù)高位
注意:對(duì)于對(duì)帶符號(hào)數(shù)原碼的減法運(yùn)算,只要先將減數(shù)原碼的符號(hào)位取反,即可把減法運(yùn)算按加法運(yùn)算的原則來(lái)處理。
對(duì)于帶符號(hào)數(shù)的加法運(yùn)算,首先要進(jìn)行兩數(shù)符號(hào)的判定,若兩數(shù)符號(hào)相同,則進(jìn)行兩數(shù)相加,并以被加數(shù)符號(hào)為結(jié)果的符號(hào)。
如果兩數(shù)符號(hào)不同,則進(jìn)行兩數(shù)相減。如果相減結(jié)果為正,則該數(shù)即為最后結(jié)果,并以被減數(shù)符號(hào)為結(jié)果的符號(hào)。如果兩數(shù)相減的結(jié)果為負(fù),則應(yīng)將其差數(shù)取補(bǔ),并把被減數(shù)的符號(hào)取反后作為結(jié)果的符號(hào)。
注意:對(duì)于對(duì)帶符號(hào)數(shù)原碼的減法運(yùn)算,只要先將減數(shù)原碼
多字節(jié)乘法的基礎(chǔ)是加法。分別相乘后對(duì)應(yīng)字節(jié)相加(個(gè)位、十位、百位等分別相加,并考慮低字節(jié)向高字節(jié)的進(jìn)位)。選用工作寄存器暫存中間積。分析:設(shè)被乘數(shù)低字節(jié)(addrl)用A表示,高字節(jié)(addr2)用B表示;乘數(shù)低字節(jié)(addr3)用L表示,高字節(jié)(addr4)用M表示。例.雙字節(jié)乘法。
多字節(jié)乘法的基礎(chǔ)是加法。分別相乘后對(duì)應(yīng)字節(jié)相加(個(gè)位、十位雙字節(jié)相乘的過(guò)程如下:雙字節(jié)相乘的過(guò)程如下:
工作寄存器用來(lái)存放部分積,R2存放(HAL+LBL+LMA),R3存放(HBL+CY+HMA+LBM),R4存放(HBM十CY)。START:PUSH PSW ;PSW、A、B入棧
PUSH ACC PUSH B MOV PSW,#18H;選用工作寄存器組3 MOV R0,#addrl;被乘數(shù)低字節(jié)地址送R0 MOV R1,#addr3;乘數(shù)低字節(jié)地址送R1 MOV A,@R0 ;被乘數(shù)低字節(jié)內(nèi)容送A PUSH A ;被乘數(shù)低字節(jié)內(nèi)容A壓棧 工作寄存器用來(lái)存放部分積,R2存放(HAL+LBL+LMA MOV B,@R1 ;乘數(shù)低字節(jié)內(nèi)容送B MUL AB ;(1)A×L
MOV @R0,A ;積的最低字節(jié)存入addrl中
MOV R2,B ;HAL送R2中
INC R0 ;指向被乘數(shù)高字節(jié)
MOV A,@R0 ;被乘數(shù)高字節(jié)送A MOV B,@R1 ;乘數(shù)低字節(jié)送B MUL AB ;(2)B×L MOV B,@R1 ;乘數(shù)低字節(jié)內(nèi)容
ADD A,R2 ;HAL十LBL MOV R2,A ;HAL十LBI之和送R2 MOV A,B ;HBL送A ADDCA,#00H;HBL+CY MOVR3,A ;HBL送R3 POPA ;被乘數(shù)低字節(jié)內(nèi)容L出棧
INC R1 ;指向ddr4 MOVB,@R1;M送B
ADD A,R2 ;HAL十LB MULAB ;(3)M×A ADDA,R2 ;LMA+(R2)
MOVR2,A;LMA+HAL十LBL之和送R2 MOVA,B ;HMA送A ADDCA,R3 ;HMA十HBL+CY MOVR3,A ;HMA+HBL+CY之和送R3 MOVR4,#0 ;清R4 MULAB ;(3) JNC LOOP ;CY=0,轉(zhuǎn)LOOP INC R4 ;CY=1,則(R4)←R4+lLOOP∶MOVA,@R0;B送A MOVB,@R1 ;M送B MULAB ;(4)M×B ADD A,R3 ;HMA十HBL+LBM MOV R3,A ;HMA+HBL+LBM之和送R3 MOV A,B ;HBM送A ADDC A,R4 ;R4+HBM=RES3 JNC LOOP ;CY=0,轉(zhuǎn)
MOV @R1,A ;RES3存入addr4中
MOV A,R2 ;RES1存入addr2中
MOV @R0,A
DECR1 ;指向addr3 MOVA,R3 ;RES2存入addr3中
MOV
@R1,A
POPB ;B、A、PSW出棧
POPACC POPPSW ……
MOV @R1,A ;RES3存入ad對(duì)于帶符號(hào)數(shù)的乘法,其原則為:原碼相乘,乘積的符號(hào)位為被乘數(shù)與乘數(shù)符號(hào)位的“異或”對(duì)于帶符號(hào)數(shù)的乘法,其原則為:
查表:根據(jù)變量x,在表格中查找對(duì)應(yīng)的y值,使y=f(x)。y與x的對(duì)應(yīng)關(guān)系可有各種形式,而表格也可有各種結(jié)構(gòu)。一般表格常量設(shè)置在程序存儲(chǔ)器的某一區(qū)域內(nèi)。
MOVCA,@A+DPTR ;遠(yuǎn)程查表
MOVCA,@A+PC ;近程查表
例.查表 查表:根據(jù)變量x,在表格中查找對(duì)應(yīng)的y值,使y=f(x)。
設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置,需對(duì)4路輸入進(jìn)行控制,每路設(shè)有一個(gè)最大額定值,為雙字節(jié)數(shù)。控制時(shí)需根據(jù)檢測(cè)的路號(hào)找出該路對(duì)應(yīng)的最大額定值。設(shè)R2用于寄存檢測(cè)路號(hào),查找到的對(duì)應(yīng)的最大額定值存放于31H和32H單元中。查找最大允許額定值子程序如下:設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置,需對(duì)4路輸入進(jìn)行控地址
機(jī)器碼
源程序
注釋
ORG2000H2000EA MOVA,R2 ;檢測(cè)路號(hào)送A20012A ADD A,R2 ;(R2)×22002F531 MOV31H,A ;距表首址偏移量20042408 ADDA,#19H ;偏移量200683 MOVCA,@A+PC ;查表,讀取第1個(gè)字節(jié)內(nèi)容2007C531 XCHA,31H ;第1字節(jié)存入31H單元20092404 ADD A,#15H ;偏移量200B83 MOVCA,@A+PC ;查表,讀取第2字節(jié)200CF532 MOV32H,A ;第2字節(jié)存入32H單元200E… ……地址機(jī)器碼源程序 注釋
ORG 2020H ;最大額定值表2020 1230TABDW1230H, ;路號(hào)02022 1540 DW 1540H ;路號(hào)12024 2340 DW2340H, ;路號(hào)22026 2430 DW2430H ;路號(hào)3 END說(shuō)明:rel計(jì)算 2020H-(2006H+1)=19H (2020H+1)-(200BH+1)=15H ORG 2020H ;最大額定值表
設(shè)表中有1024個(gè)元素,每個(gè)元素為兩個(gè)字節(jié),則表格總長(zhǎng)為2048個(gè)字節(jié)?,F(xiàn)按R4和R5的內(nèi)容從表格中查出對(duì)應(yīng)的數(shù)據(jù)元素值,送存R4和R5中。TBDP1:MOVDPTR,#TBDP2 ;表格首地址值送DPTRMOV A,R5 ;查表參數(shù)低位字節(jié)送ACLR C ;清CYRLC A ;帶進(jìn)位左移一位
XCH A,R4 ;將查表參數(shù)R4內(nèi)容送ARLC A ;帶進(jìn)位左移一位
XCH A,R4 ;R4與R5內(nèi)容互換
例.查表 設(shè)表中有1024個(gè)元素,每個(gè)元素為兩個(gè)字節(jié),則表格總長(zhǎng)為2 ADD A,DPL ;DPL+查表參數(shù)低位字節(jié)
MOVDPL,A ;調(diào)整DPL、DPH MOV A,DPH ;DPH送A ADDCA,R4 ;DPH+查表參數(shù)高位字節(jié)
MOV DPH,A ;相加和存DPH CLR A ;清A
ADD A,DPL ;DPL+ MOVCA,@A+DPTR;查表,讀第1字節(jié)
MOV R4,A ;第1字節(jié)存入R4 CLRA ;清A INC DPTR ;(DPTR)+1 MOVCA,@A+DPTR ;查表,讀第2字節(jié)
MOVR5,A ;第2字節(jié)存入R5 RETTBDP2DW… ;數(shù)據(jù)表
DW… MOVCA,@A+DPTR;查表,讀第1字節(jié)
特點(diǎn):程序執(zhí)行流程中必然包含有條件判斷,符合條件要求和不符合條件要求分別有不同的處理路徑。在程序設(shè)計(jì)時(shí),往往借助程序框圖(判斷框)來(lái)指明程序的走向。
一般情況下,每個(gè)分支均需單獨(dú)一段程序,在程序的起始地址賦予一個(gè)地址標(biāo)號(hào),以便當(dāng)條件滿(mǎn)足時(shí)轉(zhuǎn)向指定地址單元去執(zhí)行,條件不滿(mǎn)足時(shí)仍順序往下執(zhí)行。
4.2.2分支結(jié)構(gòu)程序設(shè)計(jì)
特點(diǎn):程序執(zhí)行流程中必然包含有條件判斷,符合條
⒈單分支結(jié)構(gòu)
程序僅有兩個(gè)出口,兩者選一。 通常用條件判跳指令來(lái)選擇并轉(zhuǎn)移??蓪?shí)現(xiàn)單分支程序轉(zhuǎn)移的指令有位條件轉(zhuǎn)移指令,如:JC、JNC、JB、JNB和JBC等,還有一些條件轉(zhuǎn)移指令,如:JZ、JNZ、DJNZ等。
有3種典型形式(見(jiàn)圖4–2)。 ⒈單分支結(jié)
圖4–2(a),當(dāng)條件滿(mǎn)足時(shí)執(zhí)行分支程序1,否則執(zhí)行分支程序2。
圖4–2(b),當(dāng)條件滿(mǎn)足時(shí)跳過(guò)程序段1,從程序段2開(kāi)始繼續(xù)順序執(zhí)行;否則,順序執(zhí)行程序段1和程序段2。
圖4–2(c),當(dāng)條件滿(mǎn)足時(shí)程序順序執(zhí)行程序段2;否則,重復(fù)執(zhí)行程序段1,直到條件滿(mǎn)足為止。實(shí)際是循環(huán)結(jié)構(gòu)程序。
圖4–2(a),當(dāng)條件滿(mǎn)足時(shí)執(zhí)行分支程序1,否則執(zhí)行分支程
設(shè)對(duì)addrl,addrl+1的雙字節(jié)數(shù)取補(bǔ)后存入addr2和addr2十1單元中,其中高位字節(jié)在高地址單元中。8位微機(jī)對(duì)雙字節(jié)數(shù)取補(bǔ)需分兩次進(jìn)行。首先對(duì)低字節(jié)數(shù)取補(bǔ),然后判其結(jié)果是否為全“0”。若為“0”,則高字節(jié)數(shù)取補(bǔ);否則,高位字節(jié)數(shù)取反。START:MOVR0,#addrl ;原碼低字節(jié)地址碼送R0 MOV R1,#addr2 ;補(bǔ)碼低字節(jié)地址碼送R1 MOV A,@R0 ;原碼低字節(jié)內(nèi)容送A CPL A INC A ;A內(nèi)容取反加l,即取補(bǔ)
MOV @R1,A ;低字節(jié)補(bǔ)碼存addr2單元 例.
求雙字節(jié)補(bǔ)碼程序 設(shè)對(duì)addrl,addrl+1的雙字節(jié)數(shù)取補(bǔ)后存入ad
INC R0 ;指向原碼高字節(jié)
INC R1 ;指向補(bǔ)碼高字節(jié)
JZ LOOP1
;當(dāng)(A)=0,轉(zhuǎn)LOOP1 MOV A,@R0 ;原碼高字節(jié)送A CPL A ;高字節(jié)內(nèi)容取反
MOV @R1,A ;字節(jié)反碼存(addr2十1)單元
SJMP LOOP2 ;轉(zhuǎn)LOOP2,結(jié)束
LOOP1:MOVA,@R0 ;低字節(jié)補(bǔ)碼為0 CPL A ;對(duì)高字節(jié)數(shù)取補(bǔ)
INC A MOV @R1,A ;高字節(jié)補(bǔ)碼存(addr2+1)單元LOOP2:… END ;結(jié)束
INC R0 ;指向原碼高字
Y=a2+b(當(dāng)b≥10時(shí)) Y=a2-b(當(dāng)b<10時(shí))
ORG 0000HSTART:MOVA,#a MOV B,A MUL AB ;(B)(A)=a2
MOV R0,A ;(R1)(R0)=a2
MOV R1,B MOV A,#b CJNE A,#0AH,MMN;b≠10則轉(zhuǎn)移例、試編寫(xiě)計(jì)算下式的程序
Y=a2+b(當(dāng)b≥10時(shí))例、試編寫(xiě)計(jì)算下式的程序
MM:ADD A,R0 ;b≥10,a2+b=Y MOV R0,A MOV A,#00H ADDCA,R1 MOV R1,A SJMP MMNNMMN:JNC MM ;無(wú)借位(即b>10)轉(zhuǎn)MM MOV R3,A ;R3←b MOV A,R0 CLR CMM:ADD A,R0 ;b≥10,a2+b=Y SUBB A,,3
;
(R1)(R0)←a2-b MOV R0,A MOV A,R1 SUBB A,#00H MOV R1,AMMNN:MOVY0,R0
;(Y1)(Y0)←結(jié)果
MOV Y1,R1HERE:AJMP HERE
注:Y1、Y0需用位定義偽指令賦值。
SUBB A,,3 ;(R1)(R0)←a2-
⒉多分支選擇結(jié)構(gòu)
多分支結(jié)構(gòu):程序的判別部分有兩個(gè)以上的出口流向。 通常有兩種形式,參見(jiàn)圖4–3。 分支結(jié)構(gòu)程序允許嵌套.即一個(gè)程序的分支又由另一個(gè)分支程序所組成,從而形成多級(jí)分支程序結(jié)構(gòu)。 ⒉多分支選擇結(jié)構(gòu)80C51設(shè)有兩條多分支選擇指令:散轉(zhuǎn)指令JMP@A+DPTR
散轉(zhuǎn)指令由數(shù)據(jù)指針DPTR決定多分支轉(zhuǎn)移程序的首地址,由累加器A中內(nèi)容動(dòng)態(tài)地選擇對(duì)應(yīng)的分支程序,可從多達(dá)256個(gè)分支中選一。
比較指令CJNEA,direct,rel
比較兩個(gè)數(shù)的大小,必然存在大于、等于、小于3種情況,這時(shí)就需從3個(gè)分支中選一。
另外,還可以使用查地址表的辦法、查轉(zhuǎn)移指令表的辦法或通過(guò)堆棧來(lái)實(shí)現(xiàn)多分支程序轉(zhuǎn)移。
80C51設(shè)有兩條多分支選擇指令:設(shè)分支轉(zhuǎn)移序號(hào)在R3中,分支程序入口地址放在BRTAB表中。
MOV DPTR,#BRTAB ;分支入口地址表首地址
MOV A,R3
RL A ;×2 MOV R1,A INC A ;取低位地址
MOVCA,@A+DPTR PUSHA ;低位地址入棧
MOV A,R1 MOVCA,@A+DPTR ;取高位地址,并入棧
PUSHA RET ;分支入口地址出棧送入PCBRTAB
DWBR0,BR1,…… ;分支程序入口地址表注:RET指令與兩條PUSH指令配對(duì),壓棧時(shí)先“低”后“高”。
而DW偽指令在字節(jié)存放時(shí),先“高”后“低”。
例.通過(guò)堆棧操作實(shí)現(xiàn)分支程序轉(zhuǎn)移設(shè)分支轉(zhuǎn)移序號(hào)在R3中,分支程序入口地址放在BRTAB表中。由40H單元中動(dòng)態(tài)運(yùn)行結(jié)果值來(lái)選擇分支程序 (40H)=0,轉(zhuǎn)處理程序0
(40H)=1,轉(zhuǎn)處理程序1
(40H)=n,轉(zhuǎn)處理程序nSTART:MOVDPTR,#ADDR16;多分支轉(zhuǎn)移指令表首址送 ;DPTRMOV A,40H ;40H單元內(nèi)容送ACLR C ;清CYRLC A ;A內(nèi)容左移一位
例.通過(guò)查轉(zhuǎn)移指令表實(shí)現(xiàn)多分支程序轉(zhuǎn)移
由40H單元中動(dòng)態(tài)運(yùn)行結(jié)果值來(lái)選擇分支程序 JNC TABLE ;若CY=0,轉(zhuǎn)TABEL INC DPH ;若CY=l,DPH內(nèi)容十1TABEL:JMP@A十DPTR
;多分支轉(zhuǎn)移ADDR16:AJMPLOOP0 ;轉(zhuǎn)分支程序0AJMPLOOP1 ;轉(zhuǎn)分支程序1 …AJMPLOOPn ;轉(zhuǎn)分支程序n
由于選用絕對(duì)轉(zhuǎn)移指令A(yù)JMP,每條指令占用兩個(gè)字節(jié),因此,要求A中內(nèi)容為偶數(shù),在程序中將選擇參量(A中內(nèi)容)左移一位。如果最高位為1,則將它加到DPH中,這樣分支量可在0~255中選一。 JNC TABLE ;若CY=
根據(jù)AJMP指令的轉(zhuǎn)移范圍,要求分支程序段和各處理程序入口均位于2KB范圍內(nèi)。如果要求不受此限制,可選用長(zhǎng)跳轉(zhuǎn)指令LJMP,但它需占用3個(gè)字節(jié)。START:MOVDPTR,#ADDR16;分支程序段首址送DPTRMOV A,40H ;選擇參量送AMOV B,#03H ;乘數(shù)3送入BMUL AB ;參量×3MOV R7,A ;乘積低8位暫存R7中 根據(jù)AJMP指令的轉(zhuǎn)移范圍,要求分支程序段和各處理程序入口 MOV A,B ;乘積高8位送A ADD A,DPH ;乘積高8位加到DPH中
MOV DPH,A MOV A,R7 JMP @A+DPTR ;多分支選擇ADDR16:LJMPLOOP0 ;轉(zhuǎn)分支程序0 LJMPLOOP1 ;轉(zhuǎn)分支程序1
…
LJMP LOOPn ;轉(zhuǎn)分支程序n MOV A,B ;乘積高
CLR A ;結(jié)果單元20H~29H清零
MOV R0,#10 MOV R1,#20HLP:MOV @R1,A INC R1 DJNZ R0,LP MOV R0,#100 ;100個(gè)數(shù)的計(jì)數(shù)器READ:MOVA,P1 ;讀入P1
例.對(duì)從P1口輸入的100個(gè)0~9的數(shù)進(jìn)行概率統(tǒng)計(jì)。統(tǒng)計(jì)的數(shù)值分別存入20H~29H中。例.對(duì)從P1口輸入的100個(gè)0~9CHK0:CJNEA,
#0,
CHK1 ;比較,不為“0”,繼續(xù)比較
INC 20H ;是“0”,則“0”計(jì)數(shù)單元加1 SJMP END0 ;是否全部統(tǒng)計(jì)完?CHK1:CJNEA,
#1,
CHK2 INC 21H ;是“1”,則“1”計(jì)數(shù)單元加1 SJMP END0CHK2:CJNEA,
#2,
CHK3 INC 22H ;是“2”,則“2”計(jì)數(shù)單元加1 SJMP END0CHK0:CJNEA,#0,CHK1 ;比較,CHK3:CJNEA,#3,CHK4 INC 23H ;是“3”,則“3”計(jì)數(shù)單元加1 SJMP END0CHK4:CJNEA,
#4,
CHK5 INC 24H ;是“4”,則“4”計(jì)數(shù)單元加1 SJMP END0CHK5:CJNEA,
#5,
CHK6 INC 25H ;是“5”,則“5”計(jì)數(shù)單元加1 SJMP END0CHK3:CJNEA,#3,CHK4CHK6:CJNEA,
#6,
CHK7 INC 26H ;是“6”,則“6”計(jì)數(shù)單元加1 SJMP END0 CHK7:CJNEA,
7,
CHK8 INC 27H ;是“7”,則“7”計(jì)數(shù)單元加1 SJMP END0CHK6:CJNEA,#6,CHK7CHK8:CJNEA,
#8,
CHK9 INC 28H ;是“8”,則“8”計(jì)數(shù)單元加1 SJMP END0CHK9:CJNEA,
#9,
ERR INC 29H ;是“9”,則“9”計(jì)數(shù)單元加1END0:DJNZR0,
READ ;判是否全部統(tǒng)計(jì)完?HERE:SJMP HEREERR:… ;非0~9,出錯(cuò)CHK8:CJNEA,#8,CHK9
循環(huán):強(qiáng)制CPU重復(fù)多次地執(zhí)行一串指令的基本程序結(jié)構(gòu)。循環(huán)程序結(jié)構(gòu)是分支程序中的一個(gè)特殊形式。 計(jì)數(shù)循環(huán)結(jié)構(gòu)如圖4–4所示, 條件循環(huán)結(jié)構(gòu)如圖4-5所示。
4.2.3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán):強(qiáng)制CPU重復(fù)多次地執(zhí)行一串指令的基本程序結(jié)⒈循環(huán)程序的4個(gè)部分
(1)循環(huán)初始化 在進(jìn)入循環(huán)程序體之前所必要的準(zhǔn)備工作:需給用于循環(huán)過(guò)程的工作單元設(shè)置初值,如循環(huán)控制計(jì)數(shù)初值的設(shè)置、地址指針的起始地址的設(shè)置、為變量預(yù)置初值等,有些情況下還要進(jìn)行現(xiàn)場(chǎng)保護(hù)。
⒈循環(huán)程序的4個(gè)部分(2)循環(huán)體 循環(huán)結(jié)構(gòu)程序的核心部分,完成實(shí)際的處理工作,是需反復(fù)循環(huán)執(zhí)行的部分。(2)循環(huán)體
(3)循環(huán)控制 控制循環(huán)程序的循環(huán)與結(jié)束部分,通過(guò)循環(huán)變量和結(jié)束條件進(jìn)行控制。在重復(fù)執(zhí)行循環(huán)體的過(guò)程中,不斷修改循環(huán)變量,直到符合結(jié)束條件,就結(jié)束循環(huán)程序的執(zhí)行。在循環(huán)過(guò)程中,除不斷修改循環(huán)變量外,還需修改地址指針等有關(guān)參數(shù)。實(shí)現(xiàn)方法主要有循環(huán)計(jì)數(shù)控制法和條件控制法。
◆循環(huán)次數(shù)不確定的情況:滿(mǎn)足條件就結(jié)束循環(huán)。采用條件控制法?!粞h(huán)次數(shù)己知的情況:采用計(jì)數(shù)控制法。
(3)循環(huán)控制
(4)結(jié)束部分 對(duì)循環(huán)程序執(zhí)行的結(jié)果進(jìn)行分析、處理和存放。有些情況下需恢復(fù)現(xiàn)場(chǎng)。
◆圖4–4是計(jì)數(shù)循環(huán)結(jié)構(gòu)形式。主機(jī)對(duì)循環(huán)程序的初始化和結(jié)束部分均只執(zhí)行一次,而對(duì)循環(huán)體和循環(huán)控制部分則常需重復(fù)執(zhí)行多次,不管條件如何,它至少執(zhí)行一次循環(huán)體.循環(huán)程序設(shè)計(jì)的重點(diǎn)。
◆圖4–5是條件循環(huán)結(jié)構(gòu)形式。條件循環(huán)先檢查控制條件是否成立,決定循環(huán)程序是否執(zhí)行。 (4)結(jié)束部分
⒉計(jì)數(shù)控制循環(huán)結(jié)構(gòu)
計(jì)數(shù)循環(huán)程序的特點(diǎn)是循環(huán)次數(shù)已知,必須在初始化部分設(shè)定計(jì)數(shù)的初值,循環(huán)控制部分依據(jù)計(jì)數(shù)器的值決定循環(huán)次數(shù)。一般均設(shè)置為減“1”計(jì)數(shù)器,每循環(huán)一次自動(dòng)減“1”,直到回0時(shí)結(jié)束循環(huán)。
DJNZRn,rel ;以工作寄存器作控制計(jì)數(shù)器
DJNZdirect,rel;以直接尋址單元作控制計(jì)數(shù)器
⒉計(jì)數(shù)控制循環(huán)結(jié)構(gòu)
有些情況可以不采用單片微機(jī)內(nèi)的定時(shí)器/計(jì)數(shù)器作定時(shí),而是采用軟件延時(shí)的辦法,執(zhí)行一段循環(huán)程序,而循環(huán)程序執(zhí)行的時(shí)間即為延時(shí)時(shí)間。DELAY:MOVR2#data;預(yù)置計(jì)數(shù)循環(huán)控制常數(shù)DELAY1:DJNZR2,DELAY1;當(dāng)(R2)≠0,轉(zhuǎn)向本身 RET
根據(jù)R2的不同初值(0~FFH),可實(shí)現(xiàn)4~514個(gè)機(jī)器周期的延時(shí)。
例.軟件延時(shí)
有些情況可以不采用單片微機(jī)內(nèi)的定時(shí)器/計(jì)數(shù)器作定時(shí),而是采
⒊條件控制循環(huán)結(jié)構(gòu)
根據(jù)控制循環(huán)結(jié)束的條件,決定是否繼續(xù)循環(huán)程序的執(zhí)行。所謂的結(jié)束條件可以是搜索到某個(gè)參數(shù)(比如回車(chē)符“CR”),也可以是發(fā)生的某種變化(如故障引起電路電平變化)等,什么時(shí)侯結(jié)束循環(huán)是不可預(yù)知的。 一般常用比較轉(zhuǎn)移指令或條件判跳指令進(jìn)行控制和實(shí)現(xiàn)。
⒊條件控制循環(huán)結(jié)構(gòu)
把內(nèi)部RAM中起始地址為DATA的數(shù)據(jù)串傳送到外部RAM以BUFFER為首地址的區(qū)域,直到發(fā)現(xiàn)“$”字符的ASCII碼為止,數(shù)據(jù)串的最大長(zhǎng)度在內(nèi)存20H中。
MOV R0,#DATA ;數(shù)據(jù)區(qū)首地址
MOV DPTR,#BUFFER ;數(shù)據(jù)區(qū)長(zhǎng)度指針LOOP:MOVA,@R0 CJNE A,#24H,LOOP2 ;判是否為“$”符(24H) SJMP LOOP1 ;是“$”符,則結(jié)束LOOP2:MOVA,@R0 ;不是“$”符,則傳送
MOVX@DPTR,A
例把內(nèi)部RAM中起始地址為DATA的數(shù)據(jù)串傳
INC R0
INC DPTR
DJNZ20H,LOOP ;數(shù)據(jù)串未查完,繼續(xù)LOOP1:…注:一個(gè)是條件循環(huán)控制,以找到ASCII碼“$”符為循環(huán)結(jié)束條件;笫二個(gè)是計(jì)數(shù)循環(huán)結(jié)構(gòu),萬(wàn)一找不到ASCII碼“$”符,則由數(shù)據(jù)串的最大長(zhǎng)度作為計(jì)數(shù)循環(huán)控制。
INC R0
⒋循環(huán)嵌套結(jié)構(gòu)
循環(huán)嵌套就是在循環(huán)內(nèi)套循環(huán)的結(jié)構(gòu)形式,也稱(chēng)多重循環(huán)。循環(huán)的執(zhí)行過(guò)程是從內(nèi)向外逐層展開(kāi)的。內(nèi)層執(zhí)行完全部循環(huán)后,外層則完成一次循環(huán),逐次類(lèi)推。層次必須分明,層次之間不能有交叉,否則將產(chǎn)生錯(cuò)誤。
⒋循環(huán)嵌套結(jié)構(gòu)⒈子程序及其調(diào)用
◆子程序是一段由專(zhuān)門(mén)的子程序調(diào)用指令CALL調(diào)用而以子程序返回指令RET結(jié)束的程序段。
◆將那些需多次應(yīng)用的、但完成的運(yùn)算或操作相同的程序段,編制成一個(gè)子程序,并盡量使其標(biāo)準(zhǔn)化,存放于某存儲(chǔ)區(qū)域。
◆調(diào)用子程序的程序稱(chēng)為主程序或調(diào)用程序。
4.2.4子程序設(shè)計(jì)⒈子程序及其調(diào)用4.2.4子程序設(shè)計(jì)
調(diào)用指令自動(dòng)將斷點(diǎn)地址(當(dāng)前PC值)壓入堆棧保護(hù),以便于程序執(zhí)行完畢,正確返回原程序,從斷點(diǎn)處繼續(xù)往下執(zhí)行。
返回指令:RET。設(shè)置在子程序的末尾,表示子程序執(zhí)行完畢。它的功能是自動(dòng)將斷點(diǎn)地址從堆棧彈出送PC,從而實(shí)現(xiàn)程序返回原程序斷點(diǎn)處繼續(xù)往下執(zhí)行。
◆子程序的第一條指令地址,通常稱(chēng)為子程序首地址或入口地址,往往采用標(biāo)號(hào)(可用助記符)加以表示,調(diào)用(轉(zhuǎn)子)指令的下一條指令地址,通常稱(chēng)為返回地址或斷點(diǎn)。 子程序與主程序之間的關(guān)系如圖4-6所示。
調(diào)用指令自動(dòng)將斷點(diǎn)地址(當(dāng)前PC值)壓入堆棧保護(hù),在子程序的執(zhí)行過(guò)程中,可能出現(xiàn)在子程序中再次調(diào)用其它子程序的情況。像這種子程序調(diào)用子程序的現(xiàn)象通常稱(chēng)為子程序嵌套。⑴子程序入口條件
在凋用子程序之前,必須先將數(shù)據(jù)或參數(shù)送到主程序與子程序的某一共享存儲(chǔ)單元或寄存器中,調(diào)用子程序后,子程序從共享存儲(chǔ)單元或寄存器中取得數(shù),在返回主程序之前,子程序還必須把計(jì)算結(jié)果送到共享存儲(chǔ)單元或寄存器中。在子程序的執(zhí)行過(guò)程中,可能出現(xiàn)在子程序中再次調(diào)用其它子程序的 ⑵保護(hù)現(xiàn)場(chǎng)與恢復(fù)現(xiàn)場(chǎng)
在調(diào)用子程序時(shí),單片微機(jī)只是自動(dòng)保護(hù)斷點(diǎn)地址。PSW、A、B等可通過(guò)壓棧指令進(jìn)棧保護(hù)。工作寄存器保護(hù)采用選擇不同工作寄存器組的方式來(lái)達(dá)到的。 當(dāng)子程序執(zhí)行完后,即返回主程序時(shí),應(yīng)先將上述內(nèi)容送回到來(lái)時(shí)的寄存器中去,這后一過(guò)程稱(chēng)為恢復(fù)現(xiàn)場(chǎng)。
◆在編寫(xiě)子程序時(shí),還應(yīng)注意保護(hù)(壓棧)和恢復(fù)(彈出)的順序,即先壓入者后彈出。
⑵保護(hù)現(xiàn)場(chǎng)與恢復(fù)現(xiàn)場(chǎng) ⑶子程序的特性
對(duì)于通用子程序,為便于各種用戶(hù)程序的選用,要求在子程序編制完成后提供一個(gè)說(shuō)明文件,一般包含如下內(nèi)容:
子程序名。標(biāo)明子程序功能的名字。
子程序功能。簡(jiǎn)要說(shuō)明子程序能完成的主要功能。子程序入口條件和出口結(jié)果。說(shuō)明當(dāng)主程序或調(diào)用程序調(diào)用本子程序時(shí)應(yīng)設(shè)置哪些參量,說(shuō)明子程序執(zhí)行結(jié)果及其存儲(chǔ)單元。
子程序所用的寄存器、存儲(chǔ)單元、標(biāo)志位等,提示主程序或調(diào)用程序是否需要在調(diào)用本子程序前對(duì)此進(jìn)行保護(hù)。
子程序嵌套。指明本子程序需調(diào)用哪些子程序。
⑶子
應(yīng)用軟件來(lái)進(jìn)行數(shù)字濾波。中值濾波就是連續(xù)輸入三個(gè)檢測(cè)信號(hào)值,從中選擇一個(gè)中間值為有效信號(hào)。 入口條件:三次采集數(shù)據(jù)分別存儲(chǔ)在內(nèi)部存儲(chǔ)器的20H、 21H和22H中。
出口結(jié)果:中間值在R0寄存器中。 使用資源:累加器A、R0及內(nèi)存20H、21H和22H。
例.中值數(shù)字濾波子程序 應(yīng)用軟件來(lái)進(jìn)行數(shù)字濾波。中值濾波就是連續(xù)輸入三個(gè)檢測(cè)信號(hào)值 ORG 2100HFILLE:PUSH PSW ;PSW及ACC保護(hù)入棧
PUSH ACC MOV A,20H ;取第一個(gè)數(shù)據(jù)
CLR C SUBB A,21H ;與第二個(gè)數(shù)據(jù)比較 ORG 2100H
JNC LOB1 ;第一個(gè)數(shù)據(jù)比第二個(gè)數(shù)據(jù)大,轉(zhuǎn) ;LOB1 MOV A,20H ;第一個(gè)數(shù)據(jù)比第二個(gè)數(shù)據(jù)小,交換 ;二個(gè)數(shù)的位置
XCH A,21H MOV 20H,ALOB1:MOVA,22H CLR C SUBB A,20H ;第三個(gè)數(shù)據(jù)與前二個(gè)數(shù)據(jù)中的較大 ;數(shù)比較
JNC LOB3 ;第三個(gè)數(shù)據(jù)大于前二個(gè)數(shù)據(jù)中的較 ;大數(shù),轉(zhuǎn)LOB3
MOV A,22H CLR C SUBB A,21H;第三個(gè)數(shù)據(jù)與前二個(gè)數(shù)據(jù)中的較小數(shù)比較
JNC LOB4 MOV A,21H MOV R0,ALOB2:POP ACC ;恢復(fù)ACC和PSW POP PSW RET MOV A,22HLOB3:MOV A,20H MOV R0,A AJMP LOB2LOB4:MOV A,22H ;存入中值
MOV R0,A AJMP LOB2LOB3:MOV A,20H
把外部RAM30H~3FH共16個(gè)單元中的ASCII碼依次轉(zhuǎn)換為十六進(jìn)制數(shù),并拼裝壓縮存入內(nèi)部60H~67H共8個(gè)單元中。ASCTOH:MOV R0,#30H ;設(shè)ASCII碼地址指針
MOV R1,#60H ;設(shè)十六進(jìn)制數(shù)地址指針
MOV R7,#08H ;拼裝的十六進(jìn)制數(shù)字節(jié)個(gè)數(shù)。AB:ACALLTRAN
;調(diào)用轉(zhuǎn)換子程序。
SWAPA MOVX@R1,A INC R0
例.碼制轉(zhuǎn)換 把外部RAM30H~3FH共16個(gè)單元中的ASCII碼
ACALLTRAN ;調(diào)用轉(zhuǎn)換子程序。
XCHDA,@R1 INC R0 INC R1 DJNZ R7,ABHALT:SJMPHALT
ACALLTRAN ;調(diào)用轉(zhuǎn)換子程序。TRAN:CLRC ;ASCII碼數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)子程序
MOVXA,@R0 SUBB A,#30H
CJNE A,#0AH,BB AJMPBCBB:JC DONEBC:SUBBA,#07H ;≥0AH,則再減07HDONE:RETTRAN:CLRC ;ASCII碼數(shù)注:轉(zhuǎn)換算法—把欲轉(zhuǎn)換的ASCII碼數(shù)減30H,若小于0則為非十六進(jìn)制數(shù),若為0~9,即為轉(zhuǎn)換結(jié)果。若≥0AH,則應(yīng)再減07H(“41H”—“A”),若在0AH~0FH間,即為轉(zhuǎn)換結(jié)果,若小于0AH或大于0FH,均為非十六進(jìn)制數(shù)。標(biāo)號(hào)為T(mén)RAN的子程序?qū)崿F(xiàn)ASCII碼數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù),調(diào)用前應(yīng)把欲轉(zhuǎn)換的ASCII碼數(shù)放在以R0間接尋址的單元中,轉(zhuǎn)換結(jié)果在累加器A中。
注:轉(zhuǎn)換算法—把欲轉(zhuǎn)換的ASCII碼數(shù)減30H,若小于0則
⒈數(shù)據(jù)排序程序
常用的有插入排序法、冒泡排序法、快速排序法、選擇排序法、堆積排序法、二路歸并排序法及基數(shù)排序法等。 ★冒泡法是一種相鄰數(shù)互換的排序方法。從前向后進(jìn)行相鄰數(shù)比較,若數(shù)據(jù)的大小次序與要求的順序不符時(shí)(逆序),就將二數(shù)互換,正序時(shí)不交換,假定是升序排序,則通過(guò)這種相鄰數(shù)互換方法,使小數(shù)向前移,大數(shù)向后移,從前向后進(jìn)行一次冒泡(相鄰數(shù)互換),把最大數(shù)換到最后,再進(jìn)行一次冒泡,就會(huì)把次大數(shù)排在倒數(shù)第二,直至冒泡結(jié)束。
4.2.5
程序設(shè)計(jì)舉例
⒈數(shù)據(jù)排序程序
4.2.5
程序設(shè)計(jì)舉例假定原始數(shù)據(jù)為 5FH,38H,7H,13H,44H,D8H,22H
冒泡過(guò)程:5FH,38H,7H,13H,44H,D8HH,22H(逆序,則兩數(shù)互換)
38H,5FH,7H,13H,44H,D8H,22H(逆序,則兩數(shù)互換)
38H,7H,5FH,13H,44H,D8H,22H(逆序,則兩數(shù)互換)
38H,7H,13H,5FH,44H,D8H,22H(逆序,則兩數(shù)互換)
38H,7H,13H,44H,5FH,D8H,22H(正序)
38H,7H,13H,44H,5FH,D8H,22H(逆序,則兩數(shù)互換)
假定原始數(shù)據(jù)為 5FH,38H,7H,13H,44H,D8H第一次冒泡結(jié)束:38H,7H,13H,44H,5FH,22H,D8H第二次冒泡結(jié)束:7H,13H,38H,44H,22H,5FH,D8H第三次冒泡結(jié)束:7H,13H,38H,22H,44H,5FH,D8H第四次冒泡結(jié)束:7H,13H,22H,38H,44H,5FH,D8H第五次冒泡結(jié)束:7H,13H,22H,38H,44H,5FH,D8H第一次冒泡結(jié)束:38H,7H,13H,44H,5FH,22說(shuō)明:
⑴每次冒泡都從向后排定了一個(gè)大數(shù)(升序),每次冒泡所需進(jìn)行的比較次數(shù)都遞減,例如有n個(gè)數(shù)排序,則第一次冒泡需比較(n-1)次,第二次冒泡則需(n-2)次,實(shí)際編程中為了簡(jiǎn)化程序,往往把各次比較次數(shù)都固定為(n-1)次。
⑵對(duì)于n個(gè)數(shù),理論上說(shuō)應(yīng)進(jìn)行(n-1)次冒泡才能完成排序,但實(shí)際上往往不到(n-1)次就已排好序。判定排序是否完成的最簡(jiǎn)單方法是每次冒泡中是否有互換發(fā)生,如果有互換發(fā)生,說(shuō)明排序還沒(méi)完成??刂婆判蚪Y(jié)束常不使用計(jì)數(shù)方法,而使用設(shè)置互換標(biāo)志的方法,以其狀態(tài)表示在一次冒泡中有無(wú)數(shù)據(jù)互換進(jìn)行。
說(shuō)明:
在一組測(cè)量數(shù)據(jù)中,挑選出大于標(biāo)準(zhǔn)m的數(shù)值作為合格的產(chǎn)品,而那些小于m的數(shù)值作為不合格產(chǎn)品,則被剔除掉。 設(shè)數(shù)據(jù)組為X1、X2、…、X10共10個(gè)。
ORG 0000H0000HC200 PX:CLR 00 ;設(shè)交換過(guò)標(biāo)志0002H7B09MOV R3,#09H ;10個(gè)數(shù)據(jù)比較,第一次 ;比較兩個(gè)數(shù)據(jù),比較次數(shù)為(n-1)次0004H7850MOV R0,#50H ;10個(gè)單元無(wú)符號(hào)數(shù)存 ;放首址0006HE6 MOV A,@R0
例數(shù)據(jù)排序在一組測(cè)量數(shù)據(jù)中,挑選出大于標(biāo)準(zhǔn)m的數(shù)值0007H08PX1:INCR00008HF9 MOV R1,A 0009H96 SUBB A,
@R0
;DX-DX+1
000AHE9 MOV A,
R1000BH 4006JC PX2
;
DX<DX+1則轉(zhuǎn)PX2,不交換000DHD200SETB00H ;DX>DX+1量交換標(biāo)志位,20H.0=10007H08PX1:INCR0000FH C6 XCH A,
@R0
;DX與DX+1交換0010H 18 DEC R0
0011H C6 XCH AV@R0
0012H 08 INC R0
0013H E6PX2:MOVA,
@R0
;A<DX+10014H DBF1DJNZR3,
PX1 ;比較9次0016H 2000E7JB 00H,
PX ;有交換則再比較一遍0019H 80FE END0:SJMPEND0
執(zhí)行結(jié)果(50H)中為最小數(shù),(59H)中為最大數(shù)。
000FH C6 XCH A,@R0 ;DX與D ⒉
已知采樣值(無(wú)符號(hào)數(shù))存放在外部RAM1000H~100FH中,試編程找出其中的最大值存入內(nèi)部RAM區(qū)的20H中。
ORG 0000H MOV R0,#10H ;采樣值數(shù)據(jù)區(qū)長(zhǎng)度
MOV DPTR,#1000H ;采樣值存放首址
MOV 20H,#00H ;最大值單元初始值設(shè)為最小數(shù)LP:MOVX A,@DPTR ;取采樣值
CJNE A,20H,CHK ;數(shù)值比較
SJMP LP1 ;相等,則轉(zhuǎn)移查找無(wú)符號(hào)數(shù)中最大值程序 ⒉CHK:JC LP1 ;A值小,轉(zhuǎn)移
MOV 20H,A ;A值大,則送20H LP1: INC DPTR DJNZ R0,LP ;繼續(xù)HERE:SJMPHERE ;結(jié)束CHK:JC LP1 ;A值小,轉(zhuǎn)移注:20H中始終存放兩個(gè)數(shù)比較后的大值,比較結(jié)束后存放的即是最大值。
*若要尋找最小值,只要在初始化時(shí),把可能的最大值放入最小值存放單元,比較轉(zhuǎn)移用的標(biāo)志位由C改為NC即可。
注:20H中始終存放兩個(gè)數(shù)比較后的大值,比較結(jié)束后存放的即是 3.數(shù)據(jù)搜索程序
在數(shù)據(jù)區(qū)中尋找關(guān)鍵字,稱(chēng)為數(shù)據(jù)搜索。常用的方法有兩種,即順序搜索和對(duì)分搜索。順序搜索:把關(guān)鍵字與數(shù)據(jù)區(qū)中的數(shù)據(jù)逐個(gè)比較,相等者即為找到的關(guān)鍵字。對(duì)分搜索:按對(duì)分原則進(jìn)行取數(shù)與關(guān)鍵字比較,但前提是數(shù)據(jù)區(qū)中的數(shù)已排好序,這樣搜索一次后,搜索的數(shù)據(jù)區(qū)范圍縮小一半,搜索速度快
3.數(shù)據(jù)搜索程序
已知數(shù)據(jù)區(qū)內(nèi)有16個(gè)數(shù),從內(nèi)部RAM30H開(kāi)始存放,要搜索的關(guān)鍵字在20H中,若數(shù)據(jù)區(qū)中搜索到關(guān)鍵字,則在21H中記錄關(guān)鍵字在數(shù)據(jù)區(qū)中的序號(hào),若數(shù)據(jù)區(qū)中沒(méi)有搜索到關(guān)鍵字,則置用戶(hù)標(biāo)志F0為1。
ORG 0000H MOV R0,#30H ;數(shù)據(jù)區(qū)首址
MOV R1,#16 ;數(shù)據(jù)區(qū)長(zhǎng)度
MOV 20H,#KEY ;關(guān)鍵字送20H單元
CLR F0 ;清用戶(hù)標(biāo)志位
MOV 21H,#01 ;序號(hào)置1例.搜索關(guān)鍵字已知數(shù)據(jù)區(qū)內(nèi)有16個(gè)數(shù),從內(nèi)部RAM30H開(kāi)LP:MOV A,@R0 ;取數(shù)
CJNE A,20H,LP1HERE:SJMPHERE ;找到關(guān)鍵字,結(jié)束LP1:INC 21H ;序號(hào)加1 INC R0 ;數(shù)據(jù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度舊家電回收及再利用合同
- 2025年度旅游景區(qū)專(zhuān)業(yè)保安服務(wù)合同
- 2025年度科技園區(qū)物業(yè)用房移交及創(chuàng)新企業(yè)孵化服務(wù)合同
- 二零二五年度海洋資源開(kāi)發(fā)合作經(jīng)營(yíng)分成協(xié)議
- 二零二五年度專(zhuān)業(yè)洗衣保姆雇傭服務(wù)協(xié)議
- 二零二五年度騰訊游戲與體育組織合作舉辦電競(jìng)賽事合同
- 2025年度火鍋加盟店員工培訓(xùn)及服務(wù)標(biāo)準(zhǔn)合同
- 二零二五年度建筑公司勞務(wù)人員工資發(fā)放及調(diào)整協(xié)議
- 2025年度高端制造業(yè)個(gè)人廠房租賃協(xié)議
- 烏魯木齊首期場(chǎng)地處理工程施工組織設(shè)計(jì)
- 零信任網(wǎng)絡(luò)安全模型:原理與實(shí)踐
- 《哲學(xué)概論(第2版)》-課件 第2、3章 哲學(xué)的特性、方法;哲學(xué)的價(jià)值
- 無(wú)人機(jī)在公安領(lǐng)域的應(yīng)用
- (完整word版)中醫(yī)病證診斷療效標(biāo)準(zhǔn)
- 鋰電池過(guò)充過(guò)放析銅析鋰產(chǎn)氣成分及原理0
- 生產(chǎn)建設(shè)項(xiàng)目土壤流失量測(cè)算導(dǎo)則計(jì)算程序
- 國(guó)家重點(diǎn)保護(hù)古生物化石及產(chǎn)地名錄(2011年)
- GB/T 28621-2023安裝于現(xiàn)有建筑物中的新電梯制造與安裝安全規(guī)范
- 校園超市經(jīng)營(yíng)投標(biāo)方案(完整技術(shù)標(biāo))
- 煤矸石填溝造地項(xiàng)目實(shí)施方案
- 大課間跑操評(píng)分表
評(píng)論
0/150
提交評(píng)論