




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第4 4章章 AT89S51AT89S51匯編語(yǔ)匯編語(yǔ) 言程序設(shè)計(jì)言程序設(shè)計(jì)12 第第4章章 目錄目錄4.1 匯編語(yǔ)言程序設(shè)計(jì)概述匯編語(yǔ)言程序設(shè)計(jì)概述 4.1.1 單片機(jī)編程語(yǔ)言 4.1.2 匯編語(yǔ)言語(yǔ)句和格式 4.1.3 偽指令4.2 匯編語(yǔ)言源程序的匯編匯編語(yǔ)言源程序的匯編 4.2.1 手工匯編 4.2.2 機(jī)器匯編34.3 AT89S51匯編語(yǔ)言程序設(shè)計(jì)舉例匯編語(yǔ)言程序設(shè)計(jì)舉例 4.3.1 子程序的設(shè)計(jì) 4.3.2 查表程序設(shè)計(jì) 4.3.3 關(guān)鍵字查找程序設(shè)計(jì) 4.3.4 數(shù)據(jù)極值查找程序設(shè)計(jì) 4.3.5 數(shù)據(jù)排序程序設(shè)計(jì) 4.3.6 分支轉(zhuǎn)移程序設(shè)計(jì) 4.3.7 循環(huán)程序設(shè)計(jì)4內(nèi)容概
2、要內(nèi)容概要匯編語(yǔ)言能匯編語(yǔ)言能直接控制單片機(jī)硬件直接控制單片機(jī)硬件的的編程語(yǔ)言編程語(yǔ)言。因此,要求程序設(shè)計(jì)者要因此,要求程序設(shè)計(jì)者要 “軟、硬結(jié)合軟、硬結(jié)合” 。本章介紹匯編語(yǔ)言程序設(shè)計(jì)的本章介紹匯編語(yǔ)言程序設(shè)計(jì)的基本知識(shí)基本知識(shí), ,以及一些以及一些基本的基本的程序設(shè)計(jì)程序設(shè)計(jì)。4.1 匯編語(yǔ)言程序設(shè)計(jì)概述匯編語(yǔ)言程序設(shè)計(jì)概述程序是指令的有序集合。程序是指令的有序集合。單片機(jī)運(yùn)行就是執(zhí)行指令序列的過(guò)程。單片機(jī)運(yùn)行就是執(zhí)行指令序列的過(guò)程。編寫這一指令序列的過(guò)程稱為編寫這一指令序列的過(guò)程稱為程序設(shè)計(jì)。程序設(shè)計(jì)。4.1.1 4.1.1 單片機(jī)編程語(yǔ)言單片機(jī)編程語(yǔ)言常用的編程語(yǔ)言是常用的編程語(yǔ)言是匯
3、編語(yǔ)言匯編語(yǔ)言和和高級(jí)語(yǔ)言高級(jí)語(yǔ)言。1 1匯編語(yǔ)言匯編語(yǔ)言用英文字符來(lái)代替機(jī)器語(yǔ)言,這些英文字符被稱為用英文字符來(lái)代替機(jī)器語(yǔ)言,這些英文字符被稱為助記符助記符匯編語(yǔ)言:匯編語(yǔ)言:用助記符表示的指令。用助記符表示的指令。匯編語(yǔ)言源程序:匯編語(yǔ)言源程序:用匯編語(yǔ)言編寫的程序。用匯編語(yǔ)言編寫的程序?!皡R編匯編”:匯編語(yǔ)言源程序需匯編語(yǔ)言源程序需轉(zhuǎn)換(翻譯)轉(zhuǎn)換(翻譯)成為二進(jìn)制代成為二進(jìn)制代碼表示的機(jī)器語(yǔ)言程序,才能識(shí)別和執(zhí)行。碼表示的機(jī)器語(yǔ)言程序,才能識(shí)別和執(zhí)行。完成完成“翻譯翻譯”的程序稱為的程序稱為匯編程序匯編程序。經(jīng)匯編程序。經(jīng)匯編程序“匯編匯編”得到的以得到的以“0 0”、“1 1”代碼形
4、式表示的機(jī)器語(yǔ)言程序稱為代碼形式表示的機(jī)器語(yǔ)言程序稱為目標(biāo)程序目標(biāo)程序。5優(yōu)點(diǎn):優(yōu)點(diǎn):用匯編語(yǔ)言編寫程序效率高,占用存儲(chǔ)空間小,運(yùn)行用匯編語(yǔ)言編寫程序效率高,占用存儲(chǔ)空間小,運(yùn)行速度快,能編寫出最優(yōu)化的程序,速度快,能編寫出最優(yōu)化的程序,缺點(diǎn):缺點(diǎn):可讀性差,離不開(kāi)具體的硬件,是面向可讀性差,離不開(kāi)具體的硬件,是面向“硬件硬件”的語(yǔ)的語(yǔ)言通用性差。言通用性差。2 2高級(jí)語(yǔ)言高級(jí)語(yǔ)言不受具體不受具體“硬件硬件”的限制,的限制,優(yōu)點(diǎn):優(yōu)點(diǎn):通用性強(qiáng),直觀、易懂、通用性強(qiáng),直觀、易懂、易學(xué),可讀性好。易學(xué),可讀性好。目前多數(shù)的目前多數(shù)的51單片機(jī)用戶單片機(jī)用戶使用使用C語(yǔ)言(語(yǔ)言(C51)來(lái)進(jìn)行程序
5、設(shè)來(lái)進(jìn)行程序設(shè)計(jì),已公認(rèn)為高級(jí)語(yǔ)言中高效簡(jiǎn)潔而又貼近計(jì),已公認(rèn)為高級(jí)語(yǔ)言中高效簡(jiǎn)潔而又貼近51單片機(jī)硬件的編單片機(jī)硬件的編程語(yǔ)言。程語(yǔ)言。將將C語(yǔ)言向單片機(jī)上移植,始于語(yǔ)言向單片機(jī)上移植,始于20世紀(jì)世紀(jì)80年代的中后期。年代的中后期。6經(jīng)過(guò)十幾年努力,經(jīng)過(guò)十幾年努力,C51C51已成為單片機(jī)的實(shí)用高級(jí)編程語(yǔ)言。已成為單片機(jī)的實(shí)用高級(jí)編程語(yǔ)言。盡管目前已有不少設(shè)計(jì)人員使用盡管目前已有不少設(shè)計(jì)人員使用C51C51來(lái)進(jìn)行程序開(kāi)發(fā),但在來(lái)進(jìn)行程序開(kāi)發(fā),但在對(duì)對(duì)程序的程序的空間空間和和時(shí)間時(shí)間要求較高的場(chǎng)合,匯編語(yǔ)言仍必不可少。要求較高的場(chǎng)合,匯編語(yǔ)言仍必不可少。在這種場(chǎng)合下,可使用在這種場(chǎng)合下,可使
6、用C C語(yǔ)言和匯編語(yǔ)言混合編程。在很多語(yǔ)言和匯編語(yǔ)言混合編程。在很多需要直接控制硬件且對(duì)實(shí)時(shí)性要求較高的場(chǎng)合,則更是非用匯需要直接控制硬件且對(duì)實(shí)時(shí)性要求較高的場(chǎng)合,則更是非用匯編語(yǔ)言不可。編語(yǔ)言不可。掌握匯編語(yǔ)言并能進(jìn)行程序設(shè)計(jì),是學(xué)習(xí)和掌握單片機(jī)程序掌握匯編語(yǔ)言并能進(jìn)行程序設(shè)計(jì),是學(xué)習(xí)和掌握單片機(jī)程序設(shè)計(jì)的設(shè)計(jì)的基本功之一基本功之一。4.1.2 4.1.2 匯編語(yǔ)言語(yǔ)句和格式匯編語(yǔ)言語(yǔ)句和格式兩種基本語(yǔ)句:兩種基本語(yǔ)句:指令語(yǔ)句指令語(yǔ)句和和偽指令語(yǔ)句偽指令語(yǔ)句。78(1 1)指令語(yǔ)句)指令語(yǔ)句已在第已在第3 3章介紹。每一指令語(yǔ)句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼章介紹。每一指令語(yǔ)句在匯編時(shí)都產(chǎn)生一
7、個(gè)指令代碼(機(jī)器代碼),執(zhí)行該指令代碼對(duì)應(yīng)著機(jī)器的一種操作。(機(jī)器代碼),執(zhí)行該指令代碼對(duì)應(yīng)著機(jī)器的一種操作。(2 2)偽指令語(yǔ)句)偽指令語(yǔ)句是控制匯編(翻譯)過(guò)程的一些是控制匯編(翻譯)過(guò)程的一些控制命令控制命令。在匯編時(shí)。在匯編時(shí)沒(méi)有機(jī)沒(méi)有機(jī)器代碼器代碼與之對(duì)應(yīng)。與之對(duì)應(yīng)。下面介紹指令語(yǔ)句格式。偽指令語(yǔ)句將在下面介紹指令語(yǔ)句格式。偽指令語(yǔ)句將在4.1.34.1.3節(jié)介紹。節(jié)介紹。匯編語(yǔ)言語(yǔ)句是符合典型的匯編語(yǔ)言的匯編語(yǔ)言語(yǔ)句是符合典型的匯編語(yǔ)言的四分段四分段格式格式:標(biāo)號(hào)字段標(biāo)號(hào)字段和和操作碼字段操作碼字段之間要有之間要有冒號(hào)冒號(hào)“:”分隔;分隔;操作碼字段操作碼字段和和操作數(shù)字段間操作數(shù)
8、字段間的分界符是的分界符是空格空格;雙操作數(shù)雙操作數(shù)之間用之間用逗號(hào)逗號(hào)相隔;相隔;操作數(shù)字段操作數(shù)字段和和注釋字段注釋字段之間的分界符用之間的分界符用分號(hào)分號(hào)“;”。任何語(yǔ)句都必須有操作碼字段任何語(yǔ)句都必須有操作碼字段,其余各段為任選項(xiàng)。,其余各段為任選項(xiàng)。9標(biāo)號(hào)字段標(biāo)號(hào)字段(LABLE)操作碼字段操作碼字段(OPCODE)操作數(shù)字段操作數(shù)字段(OPRAND)注釋字段注釋字段(COMMENT)【例例4-1】下面是一段程序的下面是一段程序的四分段四分段書(shū)寫格式。書(shū)寫格式。標(biāo)號(hào)字段標(biāo)號(hào)字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段START:MOVA,#00H ;0A MOV
9、R1,#10 ;10R1MOVR2,#00000011B ;03HR2LOOP: ADDA,R2 ;(A)+(R2)ADJNZR1,LOOP ;R1減減1不為零,則跳不為零,則跳LOOP處處NOPHERE: SJMPHERE上述上述4個(gè)字段應(yīng)該遵守的個(gè)字段應(yīng)該遵守的基本語(yǔ)法規(guī)則基本語(yǔ)法規(guī)則如下。如下。101 1標(biāo)號(hào)字段標(biāo)號(hào)字段語(yǔ)句所在地址的標(biāo)志符號(hào),才能被訪問(wèn)。如標(biāo)號(hào)語(yǔ)句所在地址的標(biāo)志符號(hào),才能被訪問(wèn)。如標(biāo)號(hào)“STARTSTART”和和“LOOPLOOP”等。有關(guān)標(biāo)號(hào)規(guī)定如下:等。有關(guān)標(biāo)號(hào)規(guī)定如下:(1 1)標(biāo)號(hào)后必須跟冒號(hào)標(biāo)號(hào)后必須跟冒號(hào)“:”。(2 2)標(biāo)號(hào)由標(biāo)號(hào)由1 18 8個(gè)個(gè)ASCI
10、IASCII碼字符組成,第一個(gè)字符必須是碼字符組成,第一個(gè)字符必須是字母。字母。(3 3)同一標(biāo)號(hào)在一個(gè)程序中只能定義一次,不能重復(fù)定同一標(biāo)號(hào)在一個(gè)程序中只能定義一次,不能重復(fù)定義。義。(4 4)不能使用匯編語(yǔ)言已經(jīng)定義的符號(hào)作為標(biāo)號(hào),如指不能使用匯編語(yǔ)言已經(jīng)定義的符號(hào)作為標(biāo)號(hào),如指令助記符、偽指令以及寄存器的符號(hào)名稱等。令助記符、偽指令以及寄存器的符號(hào)名稱等。(5 5)標(biāo)號(hào)的有無(wú),取決于本程序中的其他語(yǔ)句是否訪標(biāo)號(hào)的有無(wú),取決于本程序中的其他語(yǔ)句是否訪1112問(wèn)該條語(yǔ)句。如無(wú)其他語(yǔ)句訪問(wèn),則該語(yǔ)句前不需標(biāo)號(hào)。問(wèn)該條語(yǔ)句。如無(wú)其他語(yǔ)句訪問(wèn),則該語(yǔ)句前不需標(biāo)號(hào)。2 2操作碼字段操作碼字段操作碼字
11、段規(guī)定了語(yǔ)句執(zhí)行的操作,操作碼是匯編語(yǔ)言指令中操作碼字段規(guī)定了語(yǔ)句執(zhí)行的操作,操作碼是匯編語(yǔ)言指令中唯一不能空缺的部分。唯一不能空缺的部分。3 3操作數(shù)字段操作數(shù)字段指令的操作數(shù)或操作數(shù)地址。指令的操作數(shù)或操作數(shù)地址。在本字段中,在本字段中,操作數(shù)的個(gè)數(shù)因指令的不同而不同。操作數(shù)的個(gè)數(shù)因指令的不同而不同。通常有單操通常有單操作數(shù)、雙操作數(shù)和無(wú)操作數(shù)三種情況。作數(shù)、雙操作數(shù)和無(wú)操作數(shù)三種情況。如果是多操作數(shù),則操作數(shù)之間要以如果是多操作數(shù),則操作數(shù)之間要以逗號(hào)逗號(hào)隔開(kāi)。隔開(kāi)。操作數(shù)表示操作數(shù)表示時(shí),幾種情況需注意:時(shí),幾種情況需注意:(1 1)十六進(jìn)制、二進(jìn)制和十進(jìn)制形式的操作數(shù)表示)十六進(jìn)制、
12、二進(jìn)制和十進(jìn)制形式的操作數(shù)表示多數(shù)情況,操作數(shù)或操作數(shù)地址是采用多數(shù)情況,操作數(shù)或操作數(shù)地址是采用十六進(jìn)制十六進(jìn)制形式來(lái)表形式來(lái)表示的。則需加示的。則需加后綴后綴“H H”。在某些特殊場(chǎng)合用在某些特殊場(chǎng)合用二進(jìn)制二進(jìn)制表示,需加表示,需加后綴后綴“B B”若操作數(shù)采用若操作數(shù)采用十進(jìn)制十進(jìn)制形式,則需加形式,則需加后綴后綴“D D”,也可省略。,也可省略。若十六進(jìn)制若十六進(jìn)制操作數(shù)操作數(shù)以以字符字符A AF F開(kāi)頭開(kāi)頭,需在它,需在它前面加一個(gè)前面加一個(gè) “ “0 0”,以便匯編時(shí)把它和,以便匯編時(shí)把它和字符字符A AF F區(qū)別區(qū)別開(kāi)。開(kāi)。13(2 2)工作寄存器和特殊功能寄存器的表示)工作寄
13、存器和特殊功能寄存器的表示 當(dāng)操作數(shù)為工作寄存器或特殊功能寄存器時(shí),允許用當(dāng)操作數(shù)為工作寄存器或特殊功能寄存器時(shí),允許用工作寄存器和特殊功能寄存器的工作寄存器和特殊功能寄存器的代號(hào)表示代號(hào)表示。 例如,例如,工作寄存器用工作寄存器用R7R7R0R0,累加器用,累加器用A A(或(或AccAcc)表)表示。另外,工作寄存器和特殊功能寄存器也可用其地址來(lái)示。另外,工作寄存器和特殊功能寄存器也可用其地址來(lái)表示,如累加器表示,如累加器A A可用其地址可用其地址E0HE0H來(lái)表示。來(lái)表示。4 4注釋字段注釋字段用于解釋指令或程序的含義,對(duì)可讀性非常有用。用于解釋指令或程序的含義,對(duì)可讀性非常有用。使用時(shí)
14、使用時(shí)須以分號(hào)開(kāi)頭須以分號(hào)開(kāi)頭,長(zhǎng)度不限,一行寫不下,長(zhǎng)度不限,一行寫不下可換行可換行書(shū)寫,但注意也要以分號(hào)開(kāi)頭。書(shū)寫,但注意也要以分號(hào)開(kāi)頭。14 匯編時(shí),遇到匯編時(shí),遇到“;” ” 就停止就停止“翻譯翻譯”。因此,注釋字。因此,注釋字段不會(huì)產(chǎn)生機(jī)器代碼。段不會(huì)產(chǎn)生機(jī)器代碼。4.1.3 4.1.3 偽指令偽指令 在匯編語(yǔ)言源程序中應(yīng)有在匯編語(yǔ)言源程序中應(yīng)有向匯編程序發(fā)出的指示信息向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過(guò)告訴它如何完成匯編工作,這是通過(guò)偽指令偽指令來(lái)實(shí)現(xiàn)。來(lái)實(shí)現(xiàn)。 偽指令不屬于指令系統(tǒng)中的匯編語(yǔ)言指令,它偽指令不屬于指令系統(tǒng)中的匯編語(yǔ)言指令,它是程序員是程序員發(fā)
15、給匯編程序的發(fā)給匯編程序的命令命令,也稱為,也稱為匯編程序控制命令匯編程序控制命令。 只有在匯編前的源程序中才有偽指令。只有在匯編前的源程序中才有偽指令。 “偽偽”體現(xiàn)在體現(xiàn)在匯編后,偽指令匯編后,偽指令沒(méi)有相應(yīng)的機(jī)器代碼產(chǎn)生。沒(méi)有相應(yīng)的機(jī)器代碼產(chǎn)生。 偽指令具有控制匯編程序的輸入偽指令具有控制匯編程序的輸入/ /輸出、定義數(shù)據(jù)和符輸出、定義數(shù)據(jù)和符號(hào)、條件匯編、分配存儲(chǔ)空間等功能。號(hào)、條件匯編、分配存儲(chǔ)空間等功能。15不同匯編語(yǔ)言的偽指令有所不同,但基本內(nèi)容相同。不同匯編語(yǔ)言的偽指令有所不同,但基本內(nèi)容相同。介紹介紹常用的偽指令常用的偽指令。1ORG(ORiGin)匯編起始地址命令)匯編起始
16、地址命令源程序的開(kāi)始,用一條源程序的開(kāi)始,用一條ORG偽指令規(guī)定偽指令規(guī)定程序的起始地程序的起始地址址。如果不用如果不用ORG,則匯編得到的目標(biāo)程序,則匯編得到的目標(biāo)程序?qū)膶?000H地地址開(kāi)始。例如:址開(kāi)始。例如:ORG2000HSTART:MOVA,#00H 即規(guī)定標(biāo)號(hào)即規(guī)定標(biāo)號(hào)START代表地址為代表地址為2000H開(kāi)始。開(kāi)始。在一源程序中,可多次用在一源程序中,可多次用ORG指令,規(guī)定不同的程序段的指令,規(guī)定不同的程序段的起始地址。但是,起始地址。但是,地址必須由小到大排列,且不能交叉、地址必須由小到大排列,且不能交叉、重疊。例如:重疊。例如:ORG2000HORG2500HORG
17、3000H這種順序是正確的。若按下面順序的排列則是錯(cuò)誤的,因?yàn)榈刂烦霈F(xiàn)了交叉。ORG2500HORG2000HORG3000H172. 2. END(END of Assembly)END(END of Assembly)匯編終止命令匯編終止命令源程序源程序結(jié)束標(biāo)志結(jié)束標(biāo)志,終止源程序的匯編工作。終止源程序的匯編工作。整個(gè)源程序整個(gè)源程序中只能有一條中只能有一條ENDEND命令,且命令,且位于程序的最后位于程序的最后。如果。如果ENDEND出現(xiàn)出現(xiàn)在程序中間,其后的源程序,將不進(jìn)行匯編處理。在程序中間,其后的源程序,將不進(jìn)行匯編處理。3 3EQUEQU(EQUateEQUate)標(biāo)號(hào)賦值命令)
18、標(biāo)號(hào)賦值命令用于用于給標(biāo)號(hào)賦值給標(biāo)號(hào)賦值。賦值后,標(biāo)號(hào)值在整個(gè)程序有效。賦值后,標(biāo)號(hào)值在整個(gè)程序有效。例如:例如:TESTTEST: EQU 2000HEQU 2000H表示表示TEST=2000HTEST=2000H,匯編時(shí),凡是遇到,匯編時(shí),凡是遇到TESTTEST時(shí),均以時(shí),均以2000H2000H來(lái)代替。來(lái)代替。184DB(Define Byte)定義數(shù)據(jù)字節(jié)命令)定義數(shù)據(jù)字節(jié)命令用于從指定的地址開(kāi)始,在程序存儲(chǔ)器連續(xù)單元中定義用于從指定的地址開(kāi)始,在程序存儲(chǔ)器連續(xù)單元中定義字節(jié)數(shù)據(jù)。例如:字節(jié)數(shù)據(jù)。例如:ORG 2000HDB30H,40H,24,C,B匯編后匯編后(2000H)=3
19、0H(2001H)=40H(2002H)=18H(十進(jìn)制數(shù)十進(jìn)制數(shù)24)(2003H)=43H(字符字符“C”的的ASCII碼碼)(2004H)=42H(字符字符“B”的的ASCII碼碼)1920顯然,顯然,DB功能是從指定單元開(kāi)始定義(存儲(chǔ))若干字節(jié),功能是從指定單元開(kāi)始定義(存儲(chǔ))若干字節(jié),十進(jìn)制數(shù)自然轉(zhuǎn)換成十六進(jìn)制數(shù),字母按十進(jìn)制數(shù)自然轉(zhuǎn)換成十六進(jìn)制數(shù),字母按ASCII碼存儲(chǔ)。碼存儲(chǔ)。5DW(Define Word)定義數(shù)據(jù)字命令)定義數(shù)據(jù)字命令該命令用于從指定的地址開(kāi)始,在程序存儲(chǔ)器的連續(xù)單元中該命令用于從指定的地址開(kāi)始,在程序存儲(chǔ)器的連續(xù)單元中定義定義16位的數(shù)據(jù)字。例如:位的數(shù)據(jù)字
20、。例如:ORG2000HDW1246H,7BH,10匯編后(2000H)=12H;第1個(gè)字(2001H)=46H(2002H)=00H;第2個(gè)字(2003H)=7BH(2004H)=00H;第;第3個(gè)字個(gè)字(2005H)=0AH6DS(Define Storage)定義存儲(chǔ)區(qū)命令)定義存儲(chǔ)區(qū)命令從指定地址開(kāi)始,保留指定數(shù)目的字節(jié)單元作為存儲(chǔ)區(qū),從指定地址開(kāi)始,保留指定數(shù)目的字節(jié)單元作為存儲(chǔ)區(qū),供程序運(yùn)行使用。供程序運(yùn)行使用。例如:例如:TABEL:DS10表示從表示從TABEL代表的地址開(kāi)始,保留代表的地址開(kāi)始,保留10個(gè)連續(xù)的地址單個(gè)連續(xù)的地址單元。元。又例如又例如:ORG2000HDS10
21、 H表示從表示從2000H地址開(kāi)始,保留地址開(kāi)始,保留16個(gè)連續(xù)地址單元。個(gè)連續(xù)地址單元。21注意:注意:DBDB、DWDW和和DSDS命令命令只能對(duì)程序存儲(chǔ)器有效,只能對(duì)程序存儲(chǔ)器有效,不能對(duì)不能對(duì)數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器使用。使用。7 7BIT BIT 位定義命令位定義命令用于給字符名稱賦以位地址,位地址可以是絕對(duì)位地用于給字符名稱賦以位地址,位地址可以是絕對(duì)位地址,也可是符號(hào)地址。例如:址,也可是符號(hào)地址。例如:QAQABIT P1.6BIT P1.6功能是把功能是把P1.6P1.6的位地址賦給變量的位地址賦給變量QAQA。4.2 4.2 匯編語(yǔ)言源程序的匯編匯編語(yǔ)言源程序的匯編“匯編匯編”
22、-可分為可分為手工匯編手工匯編和和機(jī)器匯編機(jī)器匯編兩類。兩類。224.2.1 4.2.1 手工匯編手工匯編 通過(guò)查指令的通過(guò)查指令的機(jī)器代碼表(表機(jī)器代碼表(表3-23-2),),逐個(gè)把助記符指令逐個(gè)把助記符指令“翻譯翻譯”成機(jī)器代碼,再進(jìn)行調(diào)試和運(yùn)行。成機(jī)器代碼,再進(jìn)行調(diào)試和運(yùn)行。 手工匯編手工匯編遇到相對(duì)轉(zhuǎn)移偏移量的計(jì)算時(shí),較麻煩,易出遇到相對(duì)轉(zhuǎn)移偏移量的計(jì)算時(shí),較麻煩,易出錯(cuò),只有小程序或受條件限制時(shí)才使用。實(shí)際中,多采用錯(cuò),只有小程序或受條件限制時(shí)才使用。實(shí)際中,多采用“匯匯編程序編程序”來(lái)自動(dòng)完成匯編。來(lái)自動(dòng)完成匯編。234.2.2 4.2.2 機(jī)器匯編機(jī)器匯編 用微型計(jì)算機(jī)上的用微
23、型計(jì)算機(jī)上的軟件軟件( (匯編程序匯編程序) )來(lái)代替手工匯編。在微來(lái)代替手工匯編。在微機(jī)上用編輯軟件進(jìn)行源程序編輯,然后生成一個(gè)機(jī)上用編輯軟件進(jìn)行源程序編輯,然后生成一個(gè)ASCIIASCII碼文件,碼文件,擴(kuò)展名為擴(kuò)展名為 “ “.ASM.ASM”。在微機(jī)上運(yùn)行匯編程序,譯成機(jī)器碼。在微機(jī)上運(yùn)行匯編程序,譯成機(jī)器碼。 機(jī)器碼通過(guò)微機(jī)的串口(或并口)傳送到用戶樣機(jī)(或在機(jī)器碼通過(guò)微機(jī)的串口(或并口)傳送到用戶樣機(jī)(或在線仿真器),進(jìn)行程序的調(diào)試和運(yùn)行。線仿真器),進(jìn)行程序的調(diào)試和運(yùn)行。 有時(shí),在分析某些產(chǎn)品的程序的機(jī)器代碼時(shí),有時(shí),在分析某些產(chǎn)品的程序的機(jī)器代碼時(shí),需將需將機(jī)器代機(jī)器代碼碼翻譯
24、成翻譯成匯編語(yǔ)言源程序匯編語(yǔ)言源程序,稱為,稱為“反匯編反匯編”。24【例例4-2】 表4-1是一段源程序的匯編結(jié)果,可查表3-2,手工匯編,來(lái)驗(yàn)證下面的匯編結(jié)果是否正確。機(jī)器碼從1000H單元開(kāi)始存放。254.3 AT89S514.3 AT89S51匯編語(yǔ)言程序設(shè)計(jì)舉例匯編語(yǔ)言程序設(shè)計(jì)舉例 介紹常用的匯編語(yǔ)言程序的設(shè)計(jì)。介紹常用的匯編語(yǔ)言程序的設(shè)計(jì)。4.3.1 4.3.1 子程序的設(shè)計(jì)子程序的設(shè)計(jì) 將那些需多次應(yīng)用的、完成相同的某種基本運(yùn)算或操作將那些需多次應(yīng)用的、完成相同的某種基本運(yùn)算或操作的程序段從整個(gè)程序中獨(dú)立出來(lái),單獨(dú)編成一個(gè)程序段,的程序段從整個(gè)程序中獨(dú)立出來(lái),單獨(dú)編成一個(gè)程序段,
25、需要時(shí)進(jìn)行調(diào)用。這樣的程序段稱為需要時(shí)進(jìn)行調(diào)用。這樣的程序段稱為子程序子程序。 優(yōu)點(diǎn):優(yōu)點(diǎn):采用子程序可使程序結(jié)構(gòu)簡(jiǎn)單,縮短程序的設(shè)計(jì)采用子程序可使程序結(jié)構(gòu)簡(jiǎn)單,縮短程序的設(shè)計(jì)時(shí)間,減少占用的程序存儲(chǔ)空間。時(shí)間,減少占用的程序存儲(chǔ)空間。 子程序在程序設(shè)計(jì)中非常重要,讀者應(yīng)熟練掌握子程序子程序在程序設(shè)計(jì)中非常重要,讀者應(yīng)熟練掌握子程序的設(shè)計(jì)方法。的設(shè)計(jì)方法。261 1子程序的設(shè)計(jì)原則和應(yīng)注意的問(wèn)題子程序的設(shè)計(jì)原則和應(yīng)注意的問(wèn)題編寫子程序應(yīng)注意以下問(wèn)題:編寫子程序應(yīng)注意以下問(wèn)題: (1 1)子程序的入口地址,前必須有標(biāo)號(hào)。)子程序的入口地址,前必須有標(biāo)號(hào)。 (2 2)主程序調(diào)用子程序,是通過(guò)調(diào)用指
26、令來(lái)實(shí)現(xiàn)。有)主程序調(diào)用子程序,是通過(guò)調(diào)用指令來(lái)實(shí)現(xiàn)。有兩兩條子程序調(diào)用指令條子程序調(diào)用指令: 絕對(duì)調(diào)用指令絕對(duì)調(diào)用指令A(yù)CALL addr11ACALL addr11。雙字節(jié),。雙字節(jié),addr11addr11指出了指出了調(diào)用的目的地址,調(diào)用的目的地址,PCPC中中1616位地址中的高位地址中的高5 5位不變,被調(diào)用的位不變,被調(diào)用的子程序的首地址與絕對(duì)調(diào)用指令的下一條指令的高子程序的首地址與絕對(duì)調(diào)用指令的下一條指令的高5 5位地址位地址相同,即只能在同一個(gè)相同,即只能在同一個(gè)2KB2KB區(qū)內(nèi)。區(qū)內(nèi)。 長(zhǎng)調(diào)用指令長(zhǎng)調(diào)用指令LCALL addr16LCALL addr16。三字節(jié),三字節(jié),ad
27、dr16addr16為直接調(diào)為直接調(diào)用的目的地址,子程序可放在用的目的地址,子程序可放在64KB64KB程序存儲(chǔ)器區(qū)任意位置。程序存儲(chǔ)器區(qū)任意位置。27(3 3)子程序結(jié)構(gòu)中必須用到)子程序結(jié)構(gòu)中必須用到堆棧堆棧,用來(lái)進(jìn)行斷點(diǎn)和現(xiàn)場(chǎng)的,用來(lái)進(jìn)行斷點(diǎn)和現(xiàn)場(chǎng)的保護(hù)。保護(hù)。(4 4)子程序返回主程序時(shí),)子程序返回主程序時(shí),最后一條指令必須是最后一條指令必須是RETRET指令指令,功能是把功能是把堆棧中的斷點(diǎn)地址堆棧中的斷點(diǎn)地址彈出送入彈出送入PCPC指針中,從而實(shí)現(xiàn)子程指針中,從而實(shí)現(xiàn)子程序返回后從主程序斷點(diǎn)處繼續(xù)執(zhí)行主程序。序返回后從主程序斷點(diǎn)處繼續(xù)執(zhí)行主程序。(5 5)子程序可以)子程序可以嵌
28、套嵌套,即主程序可以調(diào)用子程序,子程序,即主程序可以調(diào)用子程序,子程序又可以調(diào)用另外的子程序。又可以調(diào)用另外的子程序。282子程序的基本結(jié)構(gòu)子程序的基本結(jié)構(gòu)典型的子程序的基本結(jié)構(gòu)如下:MAIN: ;MAIN為主程序入口標(biāo)號(hào)LCALL SUB;調(diào)用子程序SUB 子程序SUB:PUSH PSW;現(xiàn)場(chǎng)保護(hù) PUSH AccPOP Acc ;現(xiàn)場(chǎng)恢復(fù),注意要先進(jìn)后出POP PSW RET;最后一條指令必須為RET29子程序處理程序段子程序子程序 注意:注意:上述子程序結(jié)構(gòu)中,現(xiàn)場(chǎng)保護(hù)與現(xiàn)場(chǎng)恢復(fù)不是必需上述子程序結(jié)構(gòu)中,現(xiàn)場(chǎng)保護(hù)與現(xiàn)場(chǎng)恢復(fù)不是必需的,要根據(jù)實(shí)際情況而定。的,要根據(jù)實(shí)際情況而定。4.3.2
29、 4.3.2 查表程序設(shè)計(jì)查表程序設(shè)計(jì) 查表程序是一種常用程序查表程序是一種常用程序, ,避免避免復(fù)雜的運(yùn)算或轉(zhuǎn)換過(guò)程,復(fù)雜的運(yùn)算或轉(zhuǎn)換過(guò)程,可完成數(shù)據(jù)補(bǔ)償、修正、計(jì)算、轉(zhuǎn)換等各種功能,具有程序可完成數(shù)據(jù)補(bǔ)償、修正、計(jì)算、轉(zhuǎn)換等各種功能,具有程序簡(jiǎn)單、執(zhí)行速度快等簡(jiǎn)單、執(zhí)行速度快等優(yōu)點(diǎn)優(yōu)點(diǎn)。 查表查表是根據(jù)是根據(jù)自變量自變量x x,在表格,在表格尋找尋找y y,使,使y y = =f f( (x x) )。單片機(jī)。單片機(jī)中,數(shù)據(jù)表格存放于中,數(shù)據(jù)表格存放于程序存儲(chǔ)器程序存儲(chǔ)器內(nèi),在執(zhí)行查表指令時(shí),發(fā)內(nèi),在執(zhí)行查表指令時(shí),發(fā)出讀程序存儲(chǔ)器選通脈沖出讀程序存儲(chǔ)器選通脈沖 。兩條兩條極為有用的查表指
30、令如下:極為有用的查表指令如下:(1 1)MOVC MOVC A A,A+DPTRA+DPTR(2 2)MOVC MOVC A A,A+PCA+PC30兩條指令的功能完全相同,具體使用有差別。兩條指令的功能完全相同,具體使用有差別。指令指令“MOVC AMOVC A,A+DPTRA+DPTR” 把把A A中內(nèi)容與中內(nèi)容與DPTRDPTR中的內(nèi)容相加中的內(nèi)容相加,結(jié)果為某一程序存儲(chǔ)單元的地址,然后把該地址單元的內(nèi)容,結(jié)果為某一程序存儲(chǔ)單元的地址,然后把該地址單元的內(nèi)容送到送到A A中。中。指令指令“MOVC AMOVC A,A+PCA+PC” ,PCPC的內(nèi)容與的內(nèi)容與A A的內(nèi)容相加后所得的內(nèi)
31、容相加后所得的數(shù)作為某一程序存儲(chǔ)器單元的地址,根據(jù)地址取出程序存儲(chǔ)的數(shù)作為某一程序存儲(chǔ)器單元的地址,根據(jù)地址取出程序存儲(chǔ)器相應(yīng)單元中的內(nèi)容送到累加器器相應(yīng)單元中的內(nèi)容送到累加器A A,指令執(zhí)行后,指令執(zhí)行后,PCPC的內(nèi)容不發(fā)的內(nèi)容不發(fā)生變化,仍指向該查表指令的下一條指令。生變化,仍指向該查表指令的下一條指令。優(yōu)點(diǎn):優(yōu)點(diǎn):在于預(yù)處理較少且不影響其他特殊功能寄存器的值,在于預(yù)處理較少且不影響其他特殊功能寄存器的值,不必保護(hù)其他特殊功能寄存器。不必保護(hù)其他特殊功能寄存器。3132缺點(diǎn):缺點(diǎn):在于該表格只能存放在這條指令的地址在于該表格只能存放在這條指令的地址X3X2X1X0X3X2X1X0以下以下
32、00H00HFFHFFH之中,即只能存放在地址范圍之中,即只能存放在地址范圍X3X2X1X0+1X3X2X1X0+1X3X2X1X0+100HX3X2X1X0+100H中,這就使得表格所在的程序空間受到了中,這就使得表格所在的程序空間受到了限制。限制。下面說(shuō)明下面說(shuō)明查表指令的用法查表指令的用法和和計(jì)算偏移量計(jì)算偏移量應(yīng)注意的問(wèn)題。應(yīng)注意的問(wèn)題。【例例4-3】 設(shè)計(jì)一子程序,功能是根據(jù)累加器A中的數(shù)x(09之間)查x的平方表y,根據(jù)x的值查出相應(yīng)的平方y(tǒng)。本例中的x和y均為單字節(jié)數(shù)。 地地 址址 子程序子程序Y3Y2Y1Y0ADD A,#01HY3Y2Y1Y0+2MOVC A,A+PCY3Y2
33、Y1Y0+3RETY3Y2Y1Y0+4DB 00H,01H,04H,09H,10HDB 19H,24H,31H,40H,51H;數(shù)09的平方表33指令指令“ADD AADD A,#01H#01H”的作用的作用是是A A中的內(nèi)容加上中的內(nèi)容加上 “01H01H”, “ “01H01H”即為查表指令與平方表之間的即為查表指令與平方表之間的“RETRET”指令所占的字節(jié)數(shù)。加上指令所占的字節(jié)數(shù)。加上 “ “01H01H”后,可保證后,可保證PCPC指向表首指向表首,累加器,累加器A A中原來(lái)的內(nèi)容僅是從表首開(kāi)始向下查找多少個(gè)中原來(lái)的內(nèi)容僅是從表首開(kāi)始向下查找多少個(gè)單元。單元。在進(jìn)入程序前,在進(jìn)入程序
34、前,A A的內(nèi)容在的內(nèi)容在000009H09H之間,如之間,如A A中的內(nèi)容中的內(nèi)容為為02H02H,它的平方為,它的平方為04H04H,可根據(jù),可根據(jù)A A的內(nèi)容查出的內(nèi)容查出x x的平方的平方指令指令“MOVC AMOVC A,A+DPTRA+DPTR” 應(yīng)用范圍較廣,使用該指應(yīng)用范圍較廣,使用該指令時(shí)不必計(jì)算偏移量,優(yōu)點(diǎn)是表格可以設(shè)在令時(shí)不必計(jì)算偏移量,優(yōu)點(diǎn)是表格可以設(shè)在64KB64KB程序存儲(chǔ)程序存儲(chǔ)器空間內(nèi)的任何地方,而不像器空間內(nèi)的任何地方,而不像“MOVC AMOVC A,A+PCA+PC”那樣只那樣只設(shè)在設(shè)在PCPC下面的下面的256256個(gè)單元中,所以使用較方便。個(gè)單元中,所
35、以使用較方便。34如果DPTR已被使用,則在查表前必須保護(hù)DPTR,且結(jié)束后恢復(fù)DPTR,例4-3可改成如下形式: PUSH DPH ;保存DPH PUSH DPL ;保存DPL MOV DPTR,#TAB1MOVC A,A+DPTRPOP DPL ;恢復(fù)DPLPOP DPH ;恢復(fù)DPHRETTAB1: DB 00H,01H,04H,09H,10H;平方表 DB 19H,24H,31H,40H,51H實(shí)際查表,有時(shí)x為單字節(jié)數(shù),y為雙字節(jié)數(shù)。來(lái)看下例。35【例例4-4】有一巡回檢測(cè)報(bào)警裝置,需對(duì)16路(x)輸入進(jìn)行檢測(cè),每路有一個(gè)最大允許值(y),為雙字節(jié)數(shù)。需根據(jù)測(cè)量的路數(shù)(x),查表找出
36、對(duì)應(yīng)該路的最大允許值(y),看輸入值是否大于最大允許值,如果大于就報(bào)警。取路數(shù)為x(0 x15),y為最大允許值,放在表格中。設(shè)進(jìn)入查表程序前,假設(shè)路數(shù)x已放于R2中,查表后該路的最大允許值y放于R3R4中。查表的程序如下:36 TB3: MOV A,R2ADDA,R2 ;(R2)*2(A)MOV R3,A ;保存指針 ADDA,#6 ;加偏移量MOVC A,A+PC ;查第一字節(jié)XCH A,R3 ADD A,#3 MOVC A,A+PC ;查第二字節(jié) MOVR4,ARETTAB3: DW 1520,3721,42645,7580 ;最大值表 DW 3483,32657,883,9943DW
37、10000,40511,6758,8931DW 4468,5871,13284,2780837表格長(zhǎng)度不能超過(guò)表格長(zhǎng)度不能超過(guò)256B256B,且表格只能存放于,且表格只能存放于“MOVC AMOVC A,A+PCA+PC”指令以下的指令以下的256256個(gè)單元中,如需把表格放在程序存儲(chǔ)個(gè)單元中,如需把表格放在程序存儲(chǔ)器空間的任何地方,應(yīng)使用指令器空間的任何地方,應(yīng)使用指令“ “ MOVC AMOVC A,A+DPTRA+DPTR”。【例例4-54-5】 以以AT89S51AT89S51為核心的溫度控制器,溫度傳感器為核心的溫度控制器,溫度傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸出的電壓已
38、由輸出的電壓與溫度為非線性關(guān)系,傳感器輸出的電壓已由A/DA/D轉(zhuǎn)換為轉(zhuǎn)換為1010位二進(jìn)制數(shù)。測(cè)得的不同溫度下的電壓值數(shù)據(jù)位二進(jìn)制數(shù)。測(cè)得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個(gè)表,表中溫度值為構(gòu)成一個(gè)表,表中溫度值為y y(雙字節(jié)無(wú)符號(hào)數(shù)),(雙字節(jié)無(wú)符號(hào)數(shù)),x x(雙字(雙字節(jié)無(wú)符號(hào)數(shù))為電壓值數(shù)據(jù)。設(shè)測(cè)得電壓值節(jié)無(wú)符號(hào)數(shù))為電壓值數(shù)據(jù)。設(shè)測(cè)得電壓值x x放入放入R2R3R2R3中,中,根據(jù)根據(jù)電壓值電壓值x x,查找對(duì)應(yīng)的,查找對(duì)應(yīng)的溫度值溫度值y y,仍放入,仍放入R2R3R2R3中。參考程中。參考程序:序:38 LTB2: MOVDPTR,#TAB2MOVA,R3CLRC RLCA MO
39、VR3,A XCHA,R2 RLCA XCHR2,A ADDA,DPL ;(R2R3)+(DPTR)(DPTR) MOVDPL,A MOVA,DPH ADDC A,R2 MOVDPH,A CLRA39MOVC A,A+DPTR ;查第一字節(jié)MOVR2,A ;第一字節(jié)存入R2中CLRAINCDPTRMOVC A,A+DPTR ;查第二字節(jié)MOVR3,A ;第二字節(jié)存入R3中RETTAB2: DW, , ;溫度值表由于使用了指令“MOVC A,A+DPTR”,表TAB2可放入64KB程序存儲(chǔ)器空間任何位置,表格的長(zhǎng)度可大于256B。404.3.3 關(guān)鍵字查找程序設(shè)計(jì)關(guān)鍵字查找程序設(shè)計(jì)在表中查找關(guān)鍵
40、字的操作,也稱為數(shù)據(jù)檢索。有兩種方法,即順序檢索和對(duì)分檢索。1順序檢索順序檢索要檢索的表是無(wú)序無(wú)序的,檢索時(shí)只能從第只能從第1項(xiàng)開(kāi)始逐項(xiàng)查項(xiàng)開(kāi)始逐項(xiàng)查找找,判斷所取數(shù)據(jù)是否與關(guān)鍵字相等。【例例4-6】 從50個(gè)字節(jié)的無(wú)序表中查找一個(gè)關(guān)鍵字“xxH”。ORG1000HMOV30H,#xxH;關(guān)鍵字xxH送30H單元MOVR1,#50;查找次數(shù)送R1MOVA,#14H;修正值送AMOV DPTR,#TAB4 ;表首地址送DPTR41LOOP: PUSH AccMOVC A, A+PC;查表結(jié)果送A CJNE A,30H,LOOP1;(30H)不等于關(guān)鍵字則轉(zhuǎn)LOOP1 MOV R2,DPH;查到關(guān)
41、鍵字,把地址送R2,R3MOV R3,DPLDONE: RETLOOP1:POP Acc;修正值彈出INC A;A+1AINC DPTR;修改數(shù)據(jù)指針DPTRDJNZ R1,LOOP;R10,未查完,繼續(xù)查找MOVR2,#00H;R1=0,R2和R3清0MOVR3,#00H;表中50個(gè)數(shù)已查完AJMPDONE;從子程序返回 TAB4: DB ,;50個(gè)無(wú)序數(shù)據(jù)表422對(duì)分檢索對(duì)分檢索對(duì)分檢索的前提是檢索的數(shù)據(jù)表已經(jīng)排好序已經(jīng)排好序,以便于按照對(duì)分原則取數(shù)。如何進(jìn)行數(shù)據(jù)排序,稍后介紹。對(duì)分檢索的方法對(duì)分檢索的方法:取數(shù)據(jù)表中間位置的數(shù)與關(guān)鍵字進(jìn)行比較,如相等,則查找結(jié)束。如果取數(shù)大于關(guān)鍵字取數(shù)大
42、于關(guān)鍵字,則下次對(duì)分檢索的范圍是從數(shù)據(jù)區(qū)起點(diǎn)到本次取數(shù)處。如果取數(shù)小于關(guān)鍵字取數(shù)小于關(guān)鍵字,則下次對(duì)分檢索的范圍是從本次取數(shù)數(shù)據(jù)區(qū)起點(diǎn)到數(shù)據(jù)區(qū)終點(diǎn)。依此類推,逐漸縮小檢索范圍,減少次數(shù),大大提高查找速度。43444.3.4 數(shù)據(jù)極值查找程序設(shè)計(jì)數(shù)據(jù)極值查找程序設(shè)計(jì)進(jìn)行數(shù)值大小的比較,從一批數(shù)據(jù)中找出最大最大值(或最小值最小值)并存于某一單元中?!纠?-7】片內(nèi)RAM中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設(shè)R0中存放首地址,R2中存放字節(jié)數(shù),程序框圖見(jiàn)圖4-1。程序如下:MOV R2,n;n為要比較的數(shù)據(jù)字節(jié)數(shù)MOV A,R0;存首地址指針MOV R1,ADEC R2MOV A,R1L
43、OOP: MOV R3, ADEC R1CLR CSUBB A,R1;兩個(gè)數(shù)比較JNC LOOP1;C=0,A中數(shù)大,跳LOOP1MOV A,R1;C=1,則大數(shù)送ASJMP LOOP2LOOP1:MOV A,R3 LOOP2:DJNZ R2, LOOP;是否比較結(jié)束?MOV R0, A;存最大數(shù) RET454.3.5 數(shù)據(jù)排序程序設(shè)計(jì)數(shù)據(jù)排序程序設(shè)計(jì)將一批數(shù)由小到大(升序升序)排列,或由大到?。ń敌蚪敌颍┡帕小W畛S玫臄?shù)據(jù)排序算法是冒泡法冒泡法,是相鄰數(shù)互換的排序方法,因其過(guò)程類似水中氣泡上浮,故稱冒泡法。排序時(shí),從前向后進(jìn)行相鄰兩個(gè)數(shù)的比較從前向后進(jìn)行相鄰兩個(gè)數(shù)的比較,如果數(shù)據(jù)的大數(shù)據(jù)的大
44、小次序小次序與要求的順序不符時(shí)要求的順序不符時(shí),就將兩個(gè)數(shù)互換兩個(gè)數(shù)互換;否則,順序符合要求就不互換。如果進(jìn)行升序排序,應(yīng)通過(guò)這種相鄰數(shù)互換方法,使小數(shù)向前移,大數(shù)向后移。如此從前向后進(jìn)行一次次相鄰數(shù)互換(冒泡),(冒泡),就會(huì)把這批數(shù)據(jù)的最大數(shù)排到最后,次大數(shù)排在倒數(shù)第二的位置,46從而實(shí)現(xiàn)一批數(shù)據(jù)由小到大的排列。 假設(shè)有7個(gè)原始數(shù)據(jù)的排列順序?yàn)?、4、1、2、5、7、3。第一次冒泡的過(guò)程是: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 ;逆序,互
45、換4、1、2、5、6、7、3 ;正序,不互換4、1、2、5、6、3、7 ;逆序,互換,第一次冒泡結(jié)束47如此進(jìn)行,各次冒泡的結(jié)果如下:如此進(jìn)行,各次冒泡的結(jié)果如下:第第1次冒泡結(jié)果:次冒泡結(jié)果:4、1、2、5、6、3、7第第2次冒泡結(jié)果:次冒泡結(jié)果:1、2、4、5、3、6、7第第3次冒泡結(jié)果:次冒泡結(jié)果:1、2、4、3、5、6、7第第4次冒泡結(jié)果:次冒泡結(jié)果:1、2、3、4、5、6、7 ;已完成排序;已完成排序第第5次冒泡結(jié)果:次冒泡結(jié)果:1、2、3、4、5、6、7第第6次冒泡結(jié)果:次冒泡結(jié)果:1、2、3、4、5、6、7對(duì)于對(duì)于n個(gè)數(shù)個(gè)數(shù),理論上應(yīng)進(jìn)行(理論上應(yīng)進(jìn)行(n-1)次冒泡)次冒泡才能
46、完成排序,才能完成排序,實(shí)際上有時(shí)不到實(shí)際上有時(shí)不到(n-1)次)次就已完成排序。就已完成排序。4849例如,上面的例如,上面的7個(gè)數(shù)個(gè)數(shù),應(yīng)進(jìn)行,應(yīng)進(jìn)行6次次冒泡冒泡,但,但實(shí)際上實(shí)際上第第4次次冒泡時(shí)冒泡時(shí)就已經(jīng)完成就已經(jīng)完成排序。排序。如何判定排序是否已經(jīng)完成如何判定排序是否已經(jīng)完成?就是看各次冒泡中?就是看各次冒泡中是否有是否有互換互換發(fā)發(fā)生生,如果有,則排序,如果有,則排序還沒(méi)完成還沒(méi)完成;否則就表示已經(jīng)排好序。;否則就表示已經(jīng)排好序。在程序設(shè)計(jì)中,常用在程序設(shè)計(jì)中,常用設(shè)置互換標(biāo)志設(shè)置互換標(biāo)志的方法,用標(biāo)志的狀態(tài)表示的方法,用標(biāo)志的狀態(tài)表示是否有互換進(jìn)行。是否有互換進(jìn)行?!纠?-
47、8】一批單字節(jié)無(wú)符號(hào)數(shù),以一批單字節(jié)無(wú)符號(hào)數(shù),以R0為首地址指針,為首地址指針,R2中為中為字節(jié)數(shù),將這批數(shù)進(jìn)行升序排列。程序框圖如字節(jié)數(shù),將這批數(shù)進(jìn)行升序排列。程序框圖如圖圖4-2所示。所示。程序如下:程序如下:SORT: MOV A,R0 MOV R1,AMOV A,R2;字節(jié)數(shù)送入R5MOV R5,ACLR F0;互換標(biāo)志位F0清0DEC R5MOV A,R1 LOOP: MOV R3,AINC R1CLR CMOV A,R1;比較大小50SUBB A,R3JNC LOOP1SETB F0;互換標(biāo)志位F0置1MOV A,R3;XCH A,R1;兩個(gè)數(shù)互換DEC R1XCH A,R1INC
48、 R1LOOP1:MOV A,R1DJNZ R5,LOOPJB F0,SORT RET5152圖圖4-24-2 單字節(jié)無(wú)符號(hào)數(shù)排序程序框圖4.3.6 分支轉(zhuǎn)移程序設(shè)計(jì)分支轉(zhuǎn)移程序設(shè)計(jì)分為無(wú)條件轉(zhuǎn)移分為無(wú)條件轉(zhuǎn)移和和有條件轉(zhuǎn)移有條件轉(zhuǎn)移。無(wú)條件分支轉(zhuǎn)移程序很簡(jiǎn)單,不討論。有條件分支轉(zhuǎn)移程序無(wú)條件分支轉(zhuǎn)移程序很簡(jiǎn)單,不討論。有條件分支轉(zhuǎn)移程序按結(jié)構(gòu)類型來(lái)分,又分為按結(jié)構(gòu)類型來(lái)分,又分為單分支單分支選擇結(jié)構(gòu)選擇結(jié)構(gòu)和和多分支多分支選擇結(jié)構(gòu)選擇結(jié)構(gòu)。1單分支選擇結(jié)構(gòu)單分支選擇結(jié)構(gòu) 僅有僅有兩個(gè)出口兩個(gè)出口,兩者選一兩者選一。一般根據(jù)運(yùn)算結(jié)果的狀態(tài)標(biāo)志,。一般根據(jù)運(yùn)算結(jié)果的狀態(tài)標(biāo)志,用用條件判跳指令條件
49、判跳指令來(lái)選擇并轉(zhuǎn)移。來(lái)選擇并轉(zhuǎn)移?!纠?-9】 求單字節(jié)有符號(hào)數(shù)的二進(jìn)制補(bǔ)碼求單字節(jié)有符號(hào)數(shù)的二進(jìn)制補(bǔ)碼正數(shù)補(bǔ)碼正數(shù)補(bǔ)碼是其本身,是其本身,負(fù)數(shù)補(bǔ)碼負(fù)數(shù)補(bǔ)碼是其是其反碼加反碼加1。因此,應(yīng)首先。因此,應(yīng)首先判被轉(zhuǎn)換數(shù)的符號(hào),負(fù)數(shù)進(jìn)行轉(zhuǎn)換,正數(shù)本身即為補(bǔ)碼。判被轉(zhuǎn)換數(shù)的符號(hào),負(fù)數(shù)進(jìn)行轉(zhuǎn)換,正數(shù)本身即為補(bǔ)碼。53設(shè)二進(jìn)制數(shù)放在A中,其補(bǔ)碼放回到A中,框圖如圖圖4-3所所示示。參考程序如下: CMPT: JNB Acc.7,RETURN ;(A)0,不需轉(zhuǎn)換 MOV C,Acc.7;符號(hào)位保存 CPL A;(A)求反,加1 ADD A,#1 MOV Acc.7,C;符號(hào)位存在A的最高位RETUR
50、N:RET5455圖圖4-34-3 求單字節(jié)有符號(hào)二進(jìn)制數(shù)補(bǔ)碼的框圖求單字節(jié)有符號(hào)二進(jìn)制數(shù)補(bǔ)碼的框圖此外,單分支選擇結(jié)構(gòu)還有圖圖4-4、圖圖4-5所示的幾種形式。56圖4-4 單分支選擇結(jié)構(gòu)2 圖4-5 單分支選擇結(jié)構(gòu)32多分支選擇結(jié)構(gòu)多分支選擇結(jié)構(gòu)當(dāng)程序的判別部分有兩個(gè)以上兩個(gè)以上的出口出口時(shí),為多分支選擇結(jié)構(gòu)。有兩種形式,如圖4-6和圖圖4-7所示。57 圖圖4-64-6 多分支選擇結(jié)構(gòu)1 1 圖圖4-74-7 多分支選擇結(jié)構(gòu)2指令系統(tǒng)提供了非常有用的指令系統(tǒng)提供了非常有用的兩種多分支選擇指令兩種多分支選擇指令:間接轉(zhuǎn)移指令間接轉(zhuǎn)移指令 JMP A+DPTR比較轉(zhuǎn)移指令比較轉(zhuǎn)移指令 CJN
51、E A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel間接轉(zhuǎn)移指令間接轉(zhuǎn)移指令“JMP A+DPTR”由數(shù)據(jù)指針由數(shù)據(jù)指針DPTR決定多決定多分支轉(zhuǎn)移分支轉(zhuǎn)移程序的程序的首地址首地址,由,由A的內(nèi)容選擇對(duì)應(yīng)分支的內(nèi)容選擇對(duì)應(yīng)分支。4條條比較轉(zhuǎn)移指令比較轉(zhuǎn)移指令CJNE能對(duì)兩個(gè)欲比較的單元內(nèi)容進(jìn)能對(duì)兩個(gè)欲比較的單元內(nèi)容進(jìn)行比較,當(dāng)行比較,當(dāng)不相等不相等時(shí),程序?qū)崿F(xiàn)相對(duì)轉(zhuǎn)移;若時(shí),程序?qū)崿F(xiàn)相對(duì)轉(zhuǎn)移;若兩者相等兩者相等,則順序往下執(zhí)行。則順序往下執(zhí)行。58簡(jiǎn)單的分支轉(zhuǎn)移程序的設(shè)計(jì),常采用逐次比較法逐次比較法,就是把所有不
52、同的情況一個(gè)一個(gè)地進(jìn)行比較,發(fā)現(xiàn)符合就轉(zhuǎn)向?qū)?yīng)的處理程序。缺點(diǎn)是程序太長(zhǎng),有n種可能的情況,就需有n個(gè)判斷和轉(zhuǎn)移?!纠?-10】 求符號(hào)函數(shù)的值。符號(hào)函數(shù)定義如下:X存放在40H單元,Y存放在41H單元,如圖4-6所示。59Y=1X 0X 0X = 00-1程序如下:程序如下:SIGNFUC:MOV A,40HCJNE A,#00H,NZEARAJMP NEGTNZEAR:JB Acc.7, POSIMOV A,#01HAJMPNEGTPOSI:MOVA,#81HNEGT:MOV41H, AEND60實(shí)際中,經(jīng)常遇到圖4-7的分支轉(zhuǎn)移程序設(shè)計(jì),典型例子典型例子就是當(dāng)單片機(jī)系統(tǒng)中的鍵盤按下時(shí),就
53、會(huì)得到一個(gè)鍵值,根據(jù)不同的鍵值,跳向不同的鍵處理程序入口。此時(shí),可用直接轉(zhuǎn)移指令(LJMP或AJMP指令)組成一個(gè)轉(zhuǎn)移表,然后把該單元的內(nèi)容讀入累加器A,轉(zhuǎn)移表首地址放入DPTR中,再利用間接轉(zhuǎn)移指令實(shí)現(xiàn)分支轉(zhuǎn)移?!纠?-11】 根據(jù)寄存器R2的內(nèi)容,轉(zhuǎn)向各個(gè)處理程序PRGX(X=0n)。(R2)=0,轉(zhuǎn)PRG0(R2)=1,轉(zhuǎn)PRG1 (R2)=n,轉(zhuǎn)PRGn61程序如下:JMP6:MOVDPTR,#TAB5 ;轉(zhuǎn)移表首地址送DPTRMOV A,R2;分支轉(zhuǎn)移參量送AMOV B,#03H;乘數(shù)3送BMUL AB ;分支轉(zhuǎn)移參量乘3MOV R6, A;乘積的低8位暫存R6MOV A,B ;乘
54、積的高8位送AADD A ,DPH ;乘積的高8位加到DPH中MOV DPH, A MOV A, R6JMP A+DPTR;多分支轉(zhuǎn)移選擇 62TAB5: LJMP PRG0 ;多分支轉(zhuǎn)移表LJMP PRG1 LJMP PRGnR2中的分支轉(zhuǎn)移參量乘3是由于長(zhǎng)跳轉(zhuǎn)指令LJMP要占3個(gè)單元。本例程序可位于64KB程序存儲(chǔ)器空間的任何區(qū)域。4.3.7 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)程序中含有可以反復(fù)執(zhí)行的程序段,稱循環(huán)體循環(huán)體。例如,求100個(gè)數(shù)的累加和,沒(méi)必要連續(xù)安排100條加法指令,用一條加法指令使其循環(huán)執(zhí)行100次。因此可縮短程序長(zhǎng)縮短程序長(zhǎng)度度和程序所占的內(nèi)存單元數(shù)量更少占的內(nèi)存單元數(shù)量更少,使程序結(jié)構(gòu)緊湊程序結(jié)構(gòu)緊湊。631循環(huán)程序的結(jié)構(gòu)循環(huán)程序的結(jié)構(gòu)主要由以下四部分組成。(1)循環(huán)初始化)循環(huán)初始化完成循環(huán)前的準(zhǔn)備工作。例如,循環(huán)控制計(jì)數(shù)初值的設(shè)置、地址指針的起始地址的設(shè)置、為變量預(yù)置初值等。(2)循環(huán)處理)循環(huán)處理完成實(shí)際的處理工作,反復(fù)循環(huán)執(zhí)行的部分,故又稱循環(huán)體。(3)循環(huán)控制)循環(huán)控制在重復(fù)執(zhí)行循環(huán)體的過(guò)程中,不
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ù)理核心要點(diǎn)與實(shí)踐體系
- 古詩(shī)詞鑒賞之品味煉字(學(xué)生版)-2024小升初語(yǔ)文專項(xiàng)復(fù)習(xí)講義
- 高中物理專項(xiàng)復(fù)習(xí):功和功率
- 高頻考點(diǎn)漫畫類作文(有例文和解析) 押題練-2025年高考語(yǔ)文三輪復(fù)習(xí)
- 《高精密冷軋不銹鋼帶生產(chǎn)工藝規(guī)范》征求意見(jiàn)稿
- 高考數(shù)學(xué)復(fù)習(xí):重難點(diǎn)題型之立體幾何中求角度、距離類型(原卷版)
- 專題06咨詢求助信應(yīng)用文-2025年高考英語(yǔ)二輪復(fù)習(xí)話題寫作高頻熱點(diǎn)通關(guān)(解析版)
- 專題02投稿信應(yīng)用文-2025年高考英語(yǔ)話題寫作高頻熱點(diǎn)通關(guān)攻略(原卷版)
- 歐洲飲食文化課件
- 黨史期末考試題庫(kù)及答案
- T/CHES 113-2023生產(chǎn)建設(shè)項(xiàng)目水土保持監(jiān)測(cè)無(wú)人機(jī)應(yīng)用技術(shù)導(dǎo)則
- 2025-2030中國(guó)軍用機(jī)器人行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- excel計(jì)算機(jī)考試試題及答案
- 料倉(cāng)維修合同協(xié)議書(shū)
- 2025河南開(kāi)放大學(xué)人力資源管理050504期末在線考試答案
- 餐廳投資協(xié)議書(shū)
- 超市食品安全管理制度手冊(cè)
- 海鮮水餃供貨合同協(xié)議
- 公共組織績(jī)效評(píng)估-形考任務(wù)二(占10%)-國(guó)開(kāi)(ZJ)-參考資料
- GA/T 2185-2024法庭科學(xué)步態(tài)信息采集通用技術(shù)規(guī)范
- 2024年河北省安平縣事業(yè)單位公開(kāi)招聘村務(wù)工作者筆試題帶答案
評(píng)論
0/150
提交評(píng)論