版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
會(huì)計(jì)學(xué)1第04章匯編語言程序設(shè)計(jì)第4章匯編語言程序設(shè)計(jì)第一節(jié)匯編語言概述4.1匯編語言概述匯編語言是面向機(jī)器硬件的語言,要求程序設(shè)計(jì)者對(duì)MCS-51單片機(jī)具有很好的“軟,硬結(jié)合”的功底。第1頁/共67頁第4章匯編語言程序設(shè)計(jì)1.匯編語言與匯編的概念
1.機(jī)器語言(machinelanguage)2.匯編語言(assemblylanguage)由助記符、保留字和偽指令等組成,容易被人們識(shí)別、記憶和讀寫,也稱為符號(hào)語言或匯編語言。將匯編語言程序轉(zhuǎn)換成為二進(jìn)制代碼表示的機(jī)器語言程序稱為匯編程序。經(jīng)匯編程序“匯編(翻譯)”得到的機(jī)器語言程序稱為目標(biāo)程序,原來的匯編語言程序稱為源程序。3.高級(jí)語言(high-levellanguage)
第一節(jié)匯編語言概述第2頁/共67頁第4章匯編語言程序設(shè)計(jì)2.匯編語言源程序的格式
采用匯編語言編寫的程序稱為匯編語言源程序。程序不能被計(jì)算機(jī)直接識(shí)別和執(zhí)行,需人工或機(jī)器翻譯成機(jī)器語言才能被計(jì)算機(jī)執(zhí)行。為了使機(jī)器能識(shí)別和正確匯編,用戶在程序設(shè)計(jì)時(shí)必須嚴(yán)格遵循匯編語言格式和語法規(guī)則,才能編寫符合要求的匯編語言源程序。
對(duì)MCS-51來說,匯編語言源程序有兩種基本類型:指令語句和偽指令語句。
第一節(jié)匯編語言概述第3頁/共67頁第4章匯編語言程序設(shè)計(jì)(1)指令語句
已在第3章介紹每一條指令語句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼――機(jī)器代碼。
(2)偽指令語句
是為匯編服務(wù)的,在匯編時(shí)沒有機(jī)器代碼與之對(duì)應(yīng)。第一節(jié)匯編語言概述第4頁/共67頁第4章匯編語言程序設(shè)計(jì)(3)MCS-51的匯編語言中每條語句典型的四分段格式
標(biāo)號(hào)字段:操作碼字段,操作數(shù)字段;注釋字段規(guī)則:標(biāo)號(hào)字段和操作字碼段之間要有冒號(hào)“:”相隔;2)操作碼字段和操作數(shù)字段間的分界符是空格;3)雙操作數(shù)之間用逗號(hào)相隔;4)操作數(shù)字段和注釋字段之間的分界符用分號(hào)“;”相隔。操作碼字段為必選項(xiàng),其余各段為任選項(xiàng)。
第一節(jié)匯編語言概述第5頁/共67頁第4章匯編語言程序設(shè)計(jì)(3)MCS-51的匯編語言中每條語句典型的四分段格式
例:ORG0080HSTART:MOVA,#00H;0→AMOVR1,#0AH;10→R1MOVR2,#00000011B;3→R2LOOP:ADDA,R2;A+R2→ADJNZR1,LOOP;R1內(nèi)容減1不為零,則循環(huán)
NOPHERE:SJMPHEREEND程序共由9條語句組成,第1、9兩條是指示性語句(偽指令),其余為指令性語句。第2、5兩條是四分段齊全的語句,第3、4、6、7等四條是缺省標(biāo)號(hào)段的語句,第7、9兩條只有操作碼字段。第一節(jié)匯編語言概述第6頁/共67頁第4章匯編語言程序設(shè)計(jì)(4)基本語法規(guī)則
1)標(biāo)號(hào)字段位于一條語句的開頭,是語句所在內(nèi)存單元地址的標(biāo)志符號(hào)。(1)標(biāo)號(hào)后邊必須跟以冒號(hào)“:”;(2)由1~8個(gè)ASCII字符組成(3)同一標(biāo)號(hào)在一個(gè)程序中只能定義一次(4)不能使用匯編語言已經(jīng)定義的符號(hào)作為標(biāo)號(hào)
第一節(jié)匯編語言概述第7頁/共67頁第4章匯編語言程序設(shè)計(jì)(4)基本語法規(guī)則
2)操作碼字段是指令的保留字(如上述程序中的MOV、ADD和NOP等),也可以是偽指令和宏指令的助記符(如ORG和END)。匯編語言指令中唯一不能空缺的部分,匯編程序就是根據(jù)這一字段來生成機(jī)器代碼的。
第一節(jié)匯編語言概述第8頁/共67頁第4章匯編語言程序設(shè)計(jì)(4)基本語法規(guī)則
3)操作數(shù)字段用于存放指令的操作數(shù)或操作數(shù)地址,可以采用字母和數(shù)字等形式。通常有單操作數(shù),雙操作數(shù)和無操作數(shù)三種情況。如果是雙操作數(shù),則操作數(shù)之間,要以逗號(hào)隔開。(1)十六進(jìn)制、二進(jìn)制和十進(jìn)制形式的操作數(shù)表示。(2)工作寄存器和特殊功能寄存器的表示。采用工作寄存器和特殊功能寄存器的代號(hào)來表示,也可用其地址來表示。(3)采用符號(hào)$。美元符號(hào)$常在轉(zhuǎn)移類指令的操作數(shù)字段中使用用于表示該轉(zhuǎn)移指令操作碼所在的存儲(chǔ)單元地址。4)注釋字段
第一節(jié)匯編語言概述第9頁/共67頁第4章匯編語言程序設(shè)計(jì)3.偽指令
指示性語句又稱偽指令,簡(jiǎn)稱偽指令。每種匯編語言都有自己的偽指令,偽指令和指令是完全不同的,偽指令不是真正的指令。是用來對(duì)匯編語言過程進(jìn)行某種控制,或者對(duì)符號(hào)和標(biāo)號(hào)進(jìn)行賦值等,也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽指令,經(jīng)過匯編得到目標(biāo)程序(機(jī)器代碼),偽指令沒有相應(yīng)的機(jī)器代碼產(chǎn)生。
第一節(jié)匯編語言概述第10頁/共67頁第4章匯編語言程序設(shè)計(jì)(1)匯編起始地址偽指令ORG(ORiGin)
指令格式:ORG16位地址或標(biāo)號(hào);規(guī)定下面的目標(biāo)程序的起始地址常用于匯編語言源程序或數(shù)據(jù)塊的開頭,用一條ORG偽指令來實(shí)現(xiàn)規(guī)定程序的起始地址。在一個(gè)源程序中,可以多次使用ORG指令,用來規(guī)定不同程序段的起始地址。但,規(guī)定的地址必須是從小到大,不容許各程序段之間地址重疊。一個(gè)源程序如不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開始。
例:
ORG3000HSTART:MOVA,#12H;規(guī)定標(biāo)號(hào)START代表地址為3000H開始存放。
第一節(jié)匯編語言概述第11頁/共67頁第4章匯編語言程序設(shè)計(jì)(2)
匯編結(jié)束偽指令END(ENDofassembly)
指令格式:END;
END標(biāo)號(hào);END指令是匯編語言源程序的結(jié)束標(biāo)志,用于終止源程序的匯編工作。一個(gè)源程序只能有一個(gè)END命令,且位于程序的最后,在END以后寫的指令,匯編程序都不給予處理。第一節(jié)匯編語言概述第12頁/共67頁第4章匯編語言程序設(shè)計(jì)(3)定義字節(jié)命令DB(DefineByte)
指令格式:[標(biāo)號(hào):]DB八位二進(jìn)制數(shù)表;從標(biāo)號(hào)指定的地址單元開始,定義若干個(gè)8位內(nèi)存單元的內(nèi)容。
例:
ORG3000HTABL:DB30H,31H,32H,33H,34H;0~4的ASCII碼匯編后:3000H=30H,3001H=31H,3002H=32H,3003H=33H,3004H=34H。第一節(jié)匯編語言概述第13頁/共67頁第4章匯編語言程序設(shè)計(jì)(4)定義數(shù)據(jù)字命令DW(DefineWord)
指令格式:[標(biāo)號(hào):]DW十六位二進(jìn)制數(shù)表;從標(biāo)號(hào)指定的地址單元開始,定義若干個(gè)16位數(shù)據(jù)。一個(gè)16位數(shù)占據(jù)兩個(gè)內(nèi)存單元,其中,高8位存入低地址字節(jié),低8位存入高地址字節(jié)。
例:
ORG3010HTAB:DW1234H,5678H,2010H匯編后從3010H開始連續(xù)6個(gè)存儲(chǔ)單元的內(nèi)容為:3010H=12H,3011H=34H,3012H=56H,3013H=78H,3014H=20H,3015H=10H。
第一節(jié)匯編語言概述第14頁/共67頁第4章匯編語言程序設(shè)計(jì)(5)
賦值命令EQU(EQUate)
指令格式:變量名稱EQU數(shù)或匯編符號(hào);將一個(gè)數(shù)或者特定的匯編符號(hào)賦予規(guī)定的變量名稱。
“變量名稱”不是標(biāo)號(hào),不能用“:”來做分隔符。用EQU賦值以后的變量可以用做數(shù)據(jù)地址、代碼地址、位地址或者單做一個(gè)立即數(shù)來用。變量需賦值以后方可以使用,不能先使用后賦值。同時(shí),變量名稱不能和匯編語言關(guān)鍵字同名。例:TESTEQU2010H表示標(biāo)號(hào)TEST=2010H,在匯編時(shí),凡是遇到標(biāo)號(hào)TEST時(shí),均以2000H來代替。
第一節(jié)匯編語言概述第15頁/共67頁第4章匯編語言程序設(shè)計(jì)4.源程序的匯編
匯編語言源程序“翻譯”成機(jī)器代碼(指令代碼)的過程稱為“匯編”。匯編可分為手工匯編和機(jī)器匯編兩類:(1)手工匯編
人工查表翻譯指令。但遇到的相對(duì)轉(zhuǎn)移指令的偏移量的計(jì)算,要根據(jù)轉(zhuǎn)移的目標(biāo)地址計(jì)算偏移量,不但麻煩,且容易出錯(cuò)。兩次匯編過程。第一次匯編:確定地址,翻譯成各條機(jī)器碼,字符標(biāo)號(hào)原樣寫出;第二次匯編:標(biāo)號(hào)代真,將字符標(biāo)號(hào)用所計(jì)算出的具體地址值或偏移量代換。
第一節(jié)匯編語言概述第16頁/共67頁第4章匯編語言程序設(shè)計(jì)(2)機(jī)器匯編
用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)ASCII碼文件,擴(kuò)展名為“.ASM"”。然后在微計(jì)算機(jī)上運(yùn)行匯編程序,把匯編語言源程序翻譯成機(jī)器代碼。兩次掃描過程。第一次掃描:檢查語法錯(cuò)誤,確定符號(hào)名字;建立使用的全部符號(hào)名字表;每一符號(hào)名字后跟一對(duì)應(yīng)值(地址或數(shù))。第二次掃描:是在第一次掃描基礎(chǔ)上,將符號(hào)地址轉(zhuǎn)換成地址(代真);利用操作碼表將助記符轉(zhuǎn)換成相應(yīng)的目標(biāo)碼。
第一節(jié)匯編語言概述第17頁/共67頁第4章匯編語言程序設(shè)計(jì)第二節(jié)匯編語言程序的結(jié)構(gòu)4.2匯編語言程序的結(jié)構(gòu)1.匯編語言程序設(shè)計(jì)步驟匯編語言設(shè)計(jì)一個(gè)程序大致上可分為以下幾個(gè)步驟。
1)分析題意,明確要求。解決問題之前,首先要明確所要解決的問題和要達(dá)到的目的、技術(shù)指標(biāo)等。
2)確定算法。根據(jù)實(shí)際問題的要求、給出的條件及特點(diǎn),找出規(guī)律性,最后確定所采用的計(jì)算公式和計(jì)算方法,這就是一般所說的算法。算法是進(jìn)行程序設(shè)計(jì)的依據(jù),它決定了程序的正確性和程序的指令。
第18頁/共67頁第4章匯編語言程序設(shè)計(jì)1.匯編語言程序設(shè)計(jì)步驟3)畫程序流程圖,用圖解來描述和說明解題步驟。4)分配內(nèi)存工作單元,確定程序與數(shù)據(jù)區(qū)的存放地址。5)編寫源程序。6)程序優(yōu)化。7)
上機(jī)調(diào)試、修改和最后確定源程序。
第二節(jié)匯編語言程序的結(jié)構(gòu)第19頁/共67頁第4章匯編語言程序設(shè)計(jì)2.順序程序結(jié)構(gòu)
順序結(jié)構(gòu)程序是一種最簡(jiǎn)單、最基本的程序(也稱為簡(jiǎn)單程序),它是一種無分支的直線形程序,按照程序編寫的順序依次執(zhí)行。
第二節(jié)匯編語言程序的結(jié)構(gòu)例:編寫程序,將外部RAM單元中40H單元4位BCD數(shù)轉(zhuǎn)換成ASCII碼,送到內(nèi)部RAM單元60H61H之中。解:根據(jù)ASCII字符表,十進(jìn)制數(shù)09的ASCII碼和它的BCD碼之間僅相差30H,本題需要把一個(gè)字節(jié)的兩位BCD數(shù)進(jìn)行拆分,然后分別和30H相加,即得到相應(yīng)的ASCII碼。程序如下:
第20頁/共67頁第4章匯編語言程序設(shè)計(jì)2.順序程序結(jié)構(gòu)
第二節(jié)匯編語言程序的結(jié)構(gòu)
ORG0000HADDR1DATA0040HADDR2EQUMOVDPTR,#ADDR1;源地址=>DPTRMOVR0,#ADDR2;目標(biāo)地址=>R0MOV@R0,#00H;目標(biāo)地址單元清零MOVXA,@DPTR;源地址單元中BCD數(shù)送AMOVB,A;ANLA,#0FH;ORLA,#30H;完成低位BCD數(shù)轉(zhuǎn)換MOV@R0,A;存入60HINCR0MOVA,BANLA,#0F0HSWAPA;高位BCD數(shù)送低4位ORLA,#30H;完成高位BCD數(shù)轉(zhuǎn)換MOV@R0,A;存入61HSJMP$END第21頁/共67頁第4章匯編語言程序設(shè)計(jì)3.分支程序結(jié)構(gòu)
分支程序的特點(diǎn)是改變程序的執(zhí)行順序,跳過一些指令,去執(zhí)行另外一些指令。應(yīng)注意:對(duì)每一個(gè)分支都要單獨(dú)編寫一段程序,每一分支的開始地址賦給一個(gè)標(biāo)號(hào)。在編寫分支程序時(shí),關(guān)鍵是如何判斷分支的條件。在MCS-51系列單片機(jī)中可以直接用來判斷分支條件的指令并不多,只有累加器為零(或不為零)、比較條件轉(zhuǎn)移指令CJNE等,MCS-51單片機(jī)還提供了位條件轉(zhuǎn)移指令,如JC,JB等。把這些指令結(jié)合在一起使用,就可以完成各種各樣的條件判斷。
第二節(jié)匯編語言程序的結(jié)構(gòu)第22頁/共67頁第4章匯編語言程序設(shè)計(jì)3.分支程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)例:設(shè)計(jì)比較兩個(gè)無符號(hào)8位二進(jìn)制數(shù)大小,并將較大數(shù)存入高地址中的程序。設(shè)兩數(shù)分別存入30H和31H中。并設(shè)30H=42H,31H=30H。
解:程序流程圖如圖所示,為選擇結(jié)構(gòu)程序中的單分支程序流程圖。匯編語言程序如下:
第23頁/共67頁第4章匯編語言程序設(shè)計(jì)3.分支程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)解:ORG 0000H LJMP STAR ORG 2000HSTAR:MOV 30H,#42H ;30H←42H MOV 31H,#30H;31H←30HCLR C ;C←0MOV A,30H ;A←30H SUBB A,31H ;作減法比較兩數(shù)
JC NEXT ;31H≥30H轉(zhuǎn)
MOV A,30H ;30H大則
XCH A,31H;大數(shù)存入31H中
MOV 30H,A ;小數(shù)存入30H中NEXT:SJMP $END第24頁/共67頁第4章匯編語言程序設(shè)計(jì)4.循環(huán)程序結(jié)構(gòu)順序程序和分支程序中的指令,最多只執(zhí)行一次。在實(shí)際問題中重復(fù)地做某些事的情況是很多的,用計(jì)算機(jī)來做這些事就要重復(fù)地執(zhí)行某些指令。重復(fù)地執(zhí)行某些指令,最好用循環(huán)程序?qū)崿F(xiàn)。第二節(jié)匯編語言程序的結(jié)構(gòu)第25頁/共67頁第4章匯編語言程序設(shè)計(jì)4.循環(huán)程序結(jié)構(gòu)循環(huán)程序一般由4部分組成。(1)置循環(huán)初值。即設(shè)置循環(huán)過程中有關(guān)工作單元的初始值,如置循環(huán)次數(shù)、地址指針及工作單元清零等。(2)循環(huán)體。即循環(huán)的工作部分,完成主要的計(jì)算或操作任務(wù),是重復(fù)執(zhí)行的程序段。(3)循環(huán)修改。每循環(huán)一次,就要修改循環(huán)次數(shù)、數(shù)據(jù)及地址指針等。(4)循環(huán)控制。根據(jù)循環(huán)結(jié)束條件,判斷是否結(jié)束循環(huán)。
第二節(jié)匯編語言程序的結(jié)構(gòu)第26頁/共67頁第4章匯編語言程序設(shè)計(jì)4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)第27頁/共67頁第4章匯編語言程序設(shè)計(jì)4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)例:多個(gè)單字節(jié)數(shù)求知。已知有10個(gè)單字節(jié)數(shù),依次存放在內(nèi)部RAM40H單元開始的數(shù)據(jù)存儲(chǔ)區(qū)中,求和并將結(jié)果存人寄存器R2、R3中(高位存R2,低位存R3)。解:要重復(fù)進(jìn)行加法運(yùn)算,因此采用循環(huán)結(jié)構(gòu)程序。循環(huán)次數(shù)就是數(shù)據(jù)塊字節(jié)數(shù),這是已知的。在置初值時(shí),將數(shù)據(jù)塊長(zhǎng)度置人寄存器R5;將數(shù)據(jù)塊首地址送人寄存器R0,即以R0作為數(shù)據(jù)塊的地址指針,采用間接尋址方式:每做一次加法之后,修改地址指針,以便取出下一個(gè)數(shù)來相加,并且使計(jì)數(shù)器R5減l。到R5減為0時(shí),求和結(jié)束。
:第28頁/共67頁第4章匯編語言程序設(shè)計(jì)4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)解:
ORG2000H
SUM:MOVR0,#40H;設(shè)地址指針
MOVR5,#0AH;計(jì)數(shù)器初值送R5SUM:MOVA,#00H
MOVR2,A
LP:ADDA,@R0
JNCLP1
INCR2;若有進(jìn)位,和的高八位+1LP1:INCR0;地址指針+1
DJNZR5,LP;判循環(huán)結(jié)束條件
MOVR3,A;存和的低八位
END
第29頁/共67頁第4章匯編語言程序設(shè)計(jì)4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)解:
ORG2000H
SUM:MOVR0,#40H;設(shè)地址指針
MOVR5,#0AH;計(jì)數(shù)器初值送R5SUM:MOVA,#00H
MOVR2,A
LP:ADDA,@R0
JNCLP1
INCR2;若有進(jìn)位,和的高八位+1LP1:INCR0;地址指針+1
DJNZR5,LP;判循環(huán)結(jié)束條件
MOVR3,A;存和的低八位
END
第30頁/共67頁第4章匯編語言程序設(shè)計(jì)4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)例:已知內(nèi)部RAM的BLOCK單元開始有一無符號(hào)數(shù)據(jù)塊,塊長(zhǎng)在LEN單元。請(qǐng)編出求數(shù)據(jù)塊中各數(shù)累加和、并存入SUM單元的程序。
為了使讀者對(duì)兩種循環(huán)結(jié)構(gòu)有一個(gè)全面了解,以便進(jìn)行分析比較,現(xiàn)給出兩種設(shè)計(jì)方案。求累加和參考程序:
第31頁/共67頁第4章匯編語言程序設(shè)計(jì)4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)解:1.先判斷后處理(見圖4-6(a))
ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;A清零
MOVR2,LEN;塊長(zhǎng)送R2MOVR1,#BLOCK;塊始地址送R1INCR2;塊長(zhǎng)+1SJMPCHECKLOOP:ADDA,@R1;A+(R1)送AINCR1;修改數(shù)據(jù)塊指針R1CHECK:DJNZR2,LOOP;若未完,則轉(zhuǎn)LOOPMOVSUM,A;存累加和
SJMP$END第32頁/共67頁第4章匯編語言程序設(shè)計(jì)4.循環(huán)程序結(jié)構(gòu)第二節(jié)匯編語言程序的結(jié)構(gòu)解:2.先處理后判斷(見圖4-6(b))
ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;A清零
MOVR2,LEN;塊長(zhǎng)送R2MOVR1,#BLOCK;數(shù)據(jù)始地址送R1NEXT:ADDA,@R1;A+(R1)送AINCR1;修改數(shù)據(jù)塊指針R1DJNZR2,NEXT;若未完,則轉(zhuǎn)NEXTMOVSUM,A;存累加和
SJMP$END第33頁/共67頁第4章匯編語言程序設(shè)計(jì)5.主程序調(diào)用子程序結(jié)構(gòu)
匯編語言編程時(shí),應(yīng)考慮到恰當(dāng)?shù)厥褂米映绦颍拐麄€(gè)程序的結(jié)構(gòu)清楚,而且閱讀和理解方便。使用子程序還可以減少源程序和目標(biāo)程序的長(zhǎng)度。在多次調(diào)用同樣的程序段時(shí),采用子程序就不必每次重復(fù)書寫同樣的指令,而只需書寫一次。當(dāng)然從程序的執(zhí)行來看,每調(diào)用一次子程序都要附加保護(hù)斷點(diǎn)、進(jìn)棧和出棧等操作,增加程序的執(zhí)行時(shí)間。但一般來說,付出這些代價(jià)總是值得的。
在匯編語言源程序中使用子程序時(shí),一般要注意兩個(gè)問題:參數(shù)傳遞和現(xiàn)場(chǎng)保護(hù)第二節(jié)匯編語言程序的結(jié)構(gòu)第34頁/共67頁第4章匯編語言程序設(shè)計(jì)5.主程序調(diào)用子程序結(jié)構(gòu)
第二節(jié)匯編語言程序的結(jié)構(gòu)參數(shù)傳遞一般可采用以下方法:·傳遞數(shù)據(jù)?!魉偷刂贰!ねㄟ^堆棧傳遞參數(shù)。·通過位地址傳送參數(shù)。第35頁/共67頁第4章匯編語言程序設(shè)計(jì)5.主程序調(diào)用子程序結(jié)構(gòu)
第二節(jié)匯編語言程序的結(jié)構(gòu)例:設(shè)計(jì)一程序,由它的主程序循環(huán)調(diào)用子程序SHY。子程序SHY使連接到單片機(jī)P1口上的8個(gè)LED燈中的某個(gè)閃爍5次。主程序中的指令RLA將確定某個(gè)LED燈閃爍。
解:本例中的子程序入口地址是標(biāo)號(hào)SHY地址,子程序返回指令是RET,主程序調(diào)用該子程序的調(diào)用指令是ACALLSKY。為觀察到LED燈的閃爍,要求狀態(tài)時(shí)鐘信號(hào)頻率低,為此,單片機(jī)可采用頻率很低的外部振蕩器信號(hào)。
第36頁/共67頁第4章匯編語言程序設(shè)計(jì)5.主程序調(diào)用子程序結(jié)構(gòu)
第二節(jié)匯編語言程序的結(jié)構(gòu)解:ORG0000HMOVA,#0FEH;燈亮初值STAR:ACALLSKY ;調(diào)用閃爍子程序
RLA;左移
SJMPSTAR;短跳到STAR,循環(huán);以上程序段為主程序,以下程序段為子程序,標(biāo)號(hào)SHY為其入口SKY:MOVR2,#5;閃爍子程序,閃爍5次計(jì)數(shù)SKY1:MOVP1,A;點(diǎn)亮
NOP;延時(shí)
MOVPL,#0FFH;熄滅
NOP ;延時(shí)
DJNZR2,SHY1;循環(huán)
RET ;子程序返回
END第37頁/共67頁第4章匯編語言程序設(shè)計(jì)5.主程序調(diào)用子程序結(jié)構(gòu)
第二節(jié)匯編語言程序的結(jié)構(gòu)例:將內(nèi)部數(shù)據(jù)存儲(chǔ)器某一單元中的一個(gè)字節(jié)的十六進(jìn)制數(shù)轉(zhuǎn)換成兩位ASCII碼,結(jié)果存放在內(nèi)部數(shù)據(jù)存儲(chǔ)器的兩個(gè)連續(xù)單元中。假設(shè)一個(gè)字節(jié)的十六進(jìn)制數(shù)在內(nèi)部數(shù)據(jù)存儲(chǔ)器40H單元,結(jié)果存于41H、42H單元中,用堆棧進(jìn)行參數(shù)傳遞。
第38頁/共67頁第4章匯編語言程序設(shè)計(jì)5.主程序調(diào)用子程序結(jié)構(gòu)
第二節(jié)匯編語言程序的結(jié)構(gòu)解:
MAIN:MOVSP,#55H
MOVR1,#41H;R1為存結(jié)果指針
MOVA,40H;取要轉(zhuǎn)換的數(shù)據(jù)
SWAPA;先轉(zhuǎn)換高位字節(jié)
PUSHACC;壓棧
LCALLHEASC;調(diào)用低半字節(jié)轉(zhuǎn)換成
第39頁/共67頁第4章匯編語言程序設(shè)計(jì)5.主程序調(diào)用子程序結(jié)構(gòu)
第二節(jié)匯編語言程序的結(jié)構(gòu)解:ASCII碼程序
POPACC;要轉(zhuǎn)換的數(shù)據(jù)出棧
MOV@R1,A;存高半字節(jié)轉(zhuǎn)換結(jié)果
INCR1
PUSH40H
LCALLHEASC
POPACC
MOV@R1,A;存低半字節(jié)轉(zhuǎn)換結(jié)果
ENDHEASC:MOVR0,SP
DECR0
DECR0
XCHA,@R0;取被轉(zhuǎn)換數(shù)據(jù)
ANDA,#0FH;保留低半字節(jié)
ADDA,#2;修改A
MOVCA,@A+PC;查表
XCHA,@R0;結(jié)果送回堆棧
RETTAB:DB30H,31H,32H,…第40頁/共67頁第4章匯編語言程序設(shè)計(jì)第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)4.3算術(shù)運(yùn)算程序設(shè)計(jì)1.加法程序51指令系統(tǒng)中有加、減、乘、除、加1、減1等指令,可通過設(shè)計(jì)程序來處理一般不大復(fù)雜的算術(shù)運(yùn)算。設(shè)計(jì)中要注意程序執(zhí)行對(duì)PSW的影響。
多字節(jié)加、減運(yùn)算是應(yīng)用程序設(shè)計(jì)中經(jīng)常要進(jìn)行的一種運(yùn)算,加、減運(yùn)算程序可以分為無符號(hào)多字節(jié)數(shù)加減運(yùn)算和帶符號(hào)多字節(jié)數(shù)加減運(yùn)算程序兩種。第41頁/共67頁第4章匯編語言程序設(shè)計(jì)1.加法程序例:兩個(gè)無符號(hào)雙字節(jié)數(shù)相加。設(shè)被加數(shù)存放在內(nèi)部存儲(chǔ)器40H(高位字節(jié))、41H(低位字節(jié))單元,加數(shù)存放在內(nèi)部存儲(chǔ)器50H(高位字節(jié))、51H(低位字節(jié))單元,和存入40H(高位字節(jié))、41H(低位字節(jié))單元。
第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第42頁/共67頁第4章匯編語言程序設(shè)計(jì)1.加法程序解:ORG
0000H
CLR
C;將C清零
MOV
R0,#41H;送被加數(shù)首址
MOV
R1,#51H;送加數(shù)首址
MOV
A,@R0;取被加數(shù)低字節(jié)
ADD
A,@R1;兩個(gè)低字節(jié)相加
MOV
@R0,A;低字節(jié)和存人被加數(shù)低字節(jié)
DEC
R0;修改指針,指向被加數(shù)高字節(jié)
DEC
R1;修改指針,指向加數(shù)高字節(jié)
MOV
A,@R0;取被加數(shù)高字節(jié)
ADDC
A,@R1;高字節(jié)相加
MOV
@R0,A;存結(jié)果
END
第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第43頁/共67頁第4章匯編語言程序設(shè)計(jì)1.加法程序例:設(shè)在BLOCK和BLOCK+1單元中有兩個(gè)補(bǔ)碼形式的帶符號(hào)數(shù)。請(qǐng)編出求兩數(shù)之和,并把它放在SUM和SUM+1單元(低8位在SUM單元)的子程序。
解:在兩個(gè)8位二進(jìn)制帶符號(hào)數(shù)相加時(shí),其和很可能會(huì)超過8位數(shù)能表示的范圍而需要采用16位數(shù)形式來表示,因此,在進(jìn)行加法時(shí),可以預(yù)先把這兩個(gè)加數(shù)擴(kuò)張成16位二進(jìn)制補(bǔ)碼形式,然后對(duì)它完成雙字節(jié)相加。
因此,一個(gè)8位二進(jìn)制正數(shù)擴(kuò)張成16位時(shí)只要把它的高8位變成全“0”,一個(gè)8位二進(jìn)制負(fù)數(shù)擴(kuò)張成16位時(shí)需要把它的高8位變成全“1”。據(jù)此,我們?cè)诰幊虝r(shí)應(yīng)在加減運(yùn)算前先對(duì)加數(shù)和被加數(shù)進(jìn)行擴(kuò)張,然后完成求和。設(shè)R2和R3分別用來存放被加數(shù)和加數(shù)高8位
第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第44頁/共67頁第4章匯編語言程序設(shè)計(jì)1.加法程序解:ORG1000HSBADD:PUSHACCPUSHPSW;保護(hù)現(xiàn)場(chǎng)
MOVPSW,#08H MOVR0,#BLOCK;R0指向一個(gè)加數(shù)
MOVR1,#SUM;R1指向和單元
MOVR2,#00H;高位先令其為零
MOVR3,#00HMOVA,@R0;一個(gè)加數(shù)
JNBACC.7,POS1;若為正數(shù),則轉(zhuǎn)POS1MOVR2,#0FFH;若為負(fù)數(shù),則全“1”送R2第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第45頁/共67頁第4章匯編語言程序設(shè)計(jì)1.加法程序POS1:INCR0;R0指向下一個(gè)加數(shù)
MOVB,@R0;取第二加數(shù)到BJNBB.7,POS2;若是正數(shù),則轉(zhuǎn)POS2MOVR3,#0FFH;若是負(fù)數(shù),則全“1”送R3POS2:ADDA,B;低8位相加
MOV@R1,A;存低8位和
INCR1;R1指向SUM+1單元
MOVA,R2ADDCA,R3;完成高8位求和
MOV@R1,A;存高8位和
POPPSW;恢復(fù)現(xiàn)場(chǎng)
POPACCRETEND第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第46頁/共67頁第4章匯編語言程序設(shè)計(jì)2.減法程序例:已知BLOCK1和BLOCK2為起始地址的存儲(chǔ)區(qū)中分別有5字節(jié)無符號(hào)被減數(shù)和減數(shù)(低位在前,高位在后)。請(qǐng)編制一個(gè)減法子程序,令它們相減,并把差值放入BLOCK1為起始地址的存儲(chǔ)單元。解:用減法指令從低字節(jié)開始相減。相應(yīng)程序?yàn)椋?/p>
第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第47頁/共67頁第4章匯編語言程序設(shè)計(jì)2.減法程序解:ORG1000HSBYTESUB:MOVR0,#BLOCK1;被減數(shù)始址送R0MOVR1,#BLOCK2;減數(shù)始址送R1MOVR2,#05H;字長(zhǎng)送R2LOOP:CLRC;Cy清零
MOVA,@R0;被減數(shù)送ASUBBA,@R1;相減
MOV@R0,A;存差
INCR0;修改被減數(shù)地址指針
INCR1;修改減數(shù)地址指針
DJNZR2,LOOP;若未完,則LOOPRETEND第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第48頁/共67頁第4章匯編語言程序設(shè)計(jì)2.減法程序MCS-51指令系統(tǒng)中只有十進(jìn)制加法調(diào)整指令DAA,也即該指令只有在加法指令(ADD、ADDC)后,才能得到正確的結(jié)果。為了用十進(jìn)制加法調(diào)整指令對(duì)十進(jìn)制減法進(jìn)行調(diào)整,必須采用補(bǔ)碼相加的辦法,用9AH減去減數(shù)即得到以十為模的減數(shù)的補(bǔ)碼。例:多字節(jié)十進(jìn)制BCD碼減法子程序如下:
入口:被減數(shù)低字節(jié)地址在R1,減數(shù)低字節(jié)地址在R0,字節(jié)數(shù)在R2。出口:差(補(bǔ)碼)的低字節(jié)地址在R0,字節(jié)數(shù)在R3。07H為符號(hào)位,“0”為正,“1”為負(fù)。第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第49頁/共67頁第4章匯編語言程序設(shè)計(jì)2.減法程序程序?yàn)椋篛RG1000HSBCD:MOVR3,#00H;差字節(jié)數(shù)置0CLR07H;符號(hào)位清0CLRC;借位位清0SBCD1:MOVA,#9AH;減數(shù)對(duì)100求補(bǔ)碼
SUBBA,@R0ADDA,@R1;補(bǔ)碼相加
DAA;十進(jìn)制相加調(diào)整
MOV@R0,A;存結(jié)果
INCR0;地址值增加1INCR1INCR3;差字節(jié)增加1CPLC;進(jìn)位位求反,以形成正確的借位
DJNZR2,SBCD1;未減完,轉(zhuǎn)SBCD1,繼續(xù)
JNCSBCD2;無借位,轉(zhuǎn)SBCD2SETB07H;有借位,置“1”符號(hào)位SBCD2:RET;返回主程序第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第50頁/共67頁第4章匯編語言程序設(shè)計(jì)3.乘除法程序例:設(shè)R0和R1中有兩個(gè)補(bǔ)碼形式的帶符號(hào)數(shù),試編寫出求兩數(shù)之積并把積送入R3R2(R3內(nèi)為積的高8位)中的程序。
解:MCS-51乘法指令是對(duì)兩個(gè)無符號(hào)數(shù)求積的。若要對(duì)兩個(gè)帶符號(hào)數(shù)求積,則可采用對(duì)符號(hào)位單獨(dú)處理的辦法。相應(yīng)處理步驟如下:?jiǎn)为?dú)處理被乘數(shù)和乘數(shù)的符號(hào)位。求被乘數(shù)和乘數(shù)的絕對(duì)值,并使兩絕對(duì)值相乘而獲得積的絕對(duì)值。對(duì)積進(jìn)行處理。若積為正,則對(duì)積不作處理;若它為負(fù),則對(duì)積求補(bǔ),使之變?yōu)檠a(bǔ)碼形式。
8位帶符號(hào)數(shù)乘法程序如下:第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第51頁/共67頁第4章匯編語言程序設(shè)計(jì)3.乘除法程序解:ORG1000HSBITBIT20H.0SBIT1BIT20H.1SBIT2BIT20H.2MOVA,R0;被乘數(shù)送ARLCA;被乘數(shù)符號(hào)送CyMOVSBIT1,C;送入SBIT1MOVA,R1;乘數(shù)送ARLCA;乘數(shù)符號(hào)送CyMOVSBIT2,C;送入SBIT2ANLC,SBIT1;SBIT1∧SBIT2送CyMOVSBIT,C;送入SBITMOVC,SBIT1;SBIT1送CyANLC,/SBIT2;SBIT1∧SBIT2送CyORLC,SBIT;積的符號(hào)位送CyMOVSBIT,C;送入SBITMOVA,R0;處理被乘數(shù)
JNBSBIT1,NCH1;若它為正,則轉(zhuǎn)NCH1CPLA;若它為負(fù),則求補(bǔ)得絕對(duì)值
INCA第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第52頁/共67頁第4章匯編語言程序設(shè)計(jì)3.乘除法程序續(xù)解:ORG1000HSBITBIT20H.0SBIT1BIT20H.1SBIT2BIT20H.2MOVA,R0;被乘數(shù)送ARLCA;被乘數(shù)符號(hào)送CyMOVSBIT1,C;送入SBIT1MOVA,R1;乘數(shù)送ARLCA;乘數(shù)符號(hào)送CyMOVSBIT2,C;送入SBIT2ANLC,SBIT1;SBIT1∧SBIT2送CyMOVSBIT,C;送入SBITMOVC,SBIT1;SBIT1送CyANLC,/SBIT2;SBIT1∧SBIT2送CyORLC,SBIT;積的符號(hào)位送CyMOVSBIT,C;送入SBITMOVA,R0;處理被乘數(shù)
JNBSBIT1,NCH1;若它為正,則轉(zhuǎn)NCH1CPLA;若它為負(fù),則求補(bǔ)得絕對(duì)值
INCA第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第53頁/共67頁第4章匯編語言程序設(shè)計(jì)3.乘除法程序續(xù):NCH1:MOVB,A;被乘數(shù)絕對(duì)值送BMOVA,R1;處理乘數(shù)
JNBSBIT2,NCH2;若它為正,則轉(zhuǎn)NCH2CPLA;若它為負(fù),則求補(bǔ)得絕對(duì)值
ADDA,#01HNCH2:MULAB;求積的絕對(duì)值
JNBSBIT,NCH3;若它為正,則轉(zhuǎn)NCH3CPLA;若它為負(fù),則低字節(jié)求補(bǔ)
ADDA,#01HNCH3:MOVR2,A;積的低字節(jié)存入R2MOVA,B;積的高字節(jié)送AJNBSBIT,NCH4;若它為正,則轉(zhuǎn)NCH4CPLA;若它為負(fù),則高字節(jié)求補(bǔ)
ADDCA,#00HNCH4:MOVR3,A;積的高字節(jié)存入R3SJMP$;結(jié)束
END第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第54頁/共67頁第4章匯編語言程序設(shè)計(jì)3.乘除法程序例:多字節(jié)無符號(hào)BCD碼除法子程序如下:入口:30H為被除數(shù)低字節(jié)地址
40H為除數(shù)低字節(jié)地址
R3存除數(shù)字節(jié)數(shù)出口:50H為商低字節(jié)地址
30H為余數(shù)低字節(jié)地址
74存商字節(jié)數(shù)第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第55頁/共67頁第4章匯編語言程序設(shè)計(jì)3.乘除法程序解:ORG2000HDIVB:MOVR0,#40H;除數(shù)低字節(jié)地址送R0MOV74H,#01H;商字節(jié)數(shù)賦初值
MOV73H,R3;除數(shù)字節(jié)數(shù)送73HDIV1:MOVA,@R0;判除數(shù)為0?
JNZDIV2;除數(shù)非0,轉(zhuǎn)DIV2INCR0;除數(shù)為0,轉(zhuǎn)DIV4,返回主程序
DJNZR3,DIV1SJMPDIV4DIV2:MOV R3,73H MOV R0,#50HDIV3:MOV@R0,#00H;商單元清0INCR0DJNZR3,DIV3MOVR3,73H;除數(shù)BCD碼取補(bǔ)
MOVR0,#40HMOVR1,#60HCLRCMOVA,#9AH
第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第56頁/共67頁第4章匯編語言程序設(shè)計(jì)3.乘除法程序續(xù):DIV5:SUBBA,@R0MOV@R1,AINCR1INCR0MOVA,#99HDJNZR3,DIV5DIV6:MOVR0,#30H;被除數(shù)與除數(shù)補(bǔ)碼相加
MOVR3,73HMOVR1,#60HMOVR5,74H第三節(jié)算術(shù)運(yùn)算程序設(shè)計(jì)第57頁/共67頁第4章匯編語言程序設(shè)計(jì)第四節(jié)非數(shù)值操作程序設(shè)計(jì)4.4非數(shù)值操作程序設(shè)計(jì)
1.碼制轉(zhuǎn)換程序在單片機(jī)應(yīng)用程序的設(shè)計(jì)中,經(jīng)常涉及到各種碼制的轉(zhuǎn)換問題。在單片機(jī)系統(tǒng)內(nèi)部進(jìn)行數(shù)據(jù)計(jì)算和存儲(chǔ)時(shí),多采用二進(jìn)制碼。二進(jìn)制碼具有運(yùn)算方便、存儲(chǔ)量小的特點(diǎn)。在輸入/輸出中,按照人的習(xí)慣多采用代表十進(jìn)制數(shù)的BCD碼(用4位二進(jìn)制數(shù)表示的十進(jìn)制數(shù))表示。第58頁/共67頁第4章匯編語言程序設(shè)計(jì)1.碼制轉(zhuǎn)換程序1)二進(jìn)制(或十六進(jìn)制)數(shù)轉(zhuǎn)換成BCD碼十進(jìn)制數(shù)常用BCD碼表示。而BCD碼又有兩種形式:一種是1個(gè)字節(jié)放1位BCD碼,一種是壓縮的BCD碼,【例4-17】將單字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換成BCD碼第四節(jié)非數(shù)值操作程序設(shè)計(jì)第59頁/共67頁第4章匯編語言程序設(shè)計(jì)1.碼制轉(zhuǎn)換程序解:ORG0000H MOV A,#89H ;十六進(jìn)制數(shù)89H送A中
MOV B,#100 ;100作為除數(shù)送入B中
DIV AB ;十六進(jìn)制除以100 MOV R3,A ;百位數(shù)送R3,余數(shù)在B中
MOV A,#10 ;分離十位和個(gè)位數(shù)
XCH A,B;余數(shù)送入A中,除數(shù)10在B中
DIV AB ;分離出十位在A中個(gè)位在B中
SWAP A ;十位數(shù)交換到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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《偵查策略》課件
- 外陰濕疹的臨床護(hù)理
- 孕期中暑的健康宣教
- 傳導(dǎo)性耳鳴的健康宣教
- 這位廳官的講話火了
- 雙曲線定義課件
- 你們想錯(cuò)了課件
- 化膿性腮腺炎的健康宣教
- 科學(xué)探究:物質(zhì)的比熱容課件滬科
- 鼻毛孔粗大伴白色分泌物的臨床護(hù)理
- 布加綜合征護(hù)理
- 燃?xì)飧呖兆鳂I(yè)專項(xiàng)施工方案
- 收購(gòu)公司法律盡職調(diào)查合同(2篇)
- 第六單元多邊形的面積 (單元測(cè)試)-2024-2025學(xué)年五年級(jí)上冊(cè)數(shù)學(xué)人教版
- 青島市衛(wèi)生健康委員會(huì)直屬事業(yè)單位招聘人員筆試真題2023
- 期末試卷(試題)-2024-2025學(xué)年三年級(jí)上冊(cè)數(shù)學(xué)蘇教版
- 天津市南開區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期期末英語試題
- 期末考試-公共財(cái)政概論-章節(jié)習(xí)題
- 初中語文部編版七年級(jí)上冊(cè)期末復(fù)習(xí)詞語成語運(yùn)用練習(xí)題(附參考答案)
- 2024年內(nèi)蒙古包鋼公司招聘筆試參考題庫含答案解析
- 專題四“挺膺擔(dān)當(dāng)”主題團(tuán)課
評(píng)論
0/150
提交評(píng)論