




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1第4章目錄4.1匯編語言程序設計概述
4.1.1單片機編程語言
4.1.2匯編語言語句和格式
4.1.3偽指令4.2匯編語言源程序的匯編
4.2.1手工匯編
4.2.2機器匯編24.351匯編語言程序設計舉例
4.3.1子程序的設計
4.3.2查表程序設計
4.3.3關鍵字查找程序設計
4.3.4數(shù)據(jù)極值查找程序設計
4.3.5數(shù)據(jù)排序程序設計
4.3.6分支轉移程序設計
4.3.7循環(huán)程序設計3內(nèi)容概要匯編語言能直接控制單片機硬件的編程語言。因此,要求程序設計者要“軟、硬結合”。本章介紹匯編語言程序設計的基本知識,以及一些基本的程序設計。4.1匯編語言程序設計概述程序是指令的有序集合。單片機運行就是執(zhí)行指令序列的過程。編寫這一指令序列的過程稱為程序設計。4.1.1單片機編程語言常用的編程語言是匯編語言和高級語言。1.匯編語言用英文字符來代替機器語言,這些英文字符被稱為助記符匯編語言:用助記符表示的指令。匯編語言源程序:用匯編語言編寫的程序?!皡R編”:匯編語言源程序需轉換(翻譯)成為二進制代碼表示的機器語言程序,才能識別和執(zhí)行。完成“翻譯”的程序稱為匯編程序。經(jīng)匯編程序“匯編”得到的以“0”、“1”代碼形式表示的機器語言程序稱為目標程序。4優(yōu)點:用匯編語言編寫程序效率高,占用存儲空間小,運行速度快,能編寫出最優(yōu)化的程序,缺點:可讀性差,離不開具體的硬件,是面向“硬件”的語言通用性差。2.高級語言不受具體“硬件”的限制,優(yōu)點:通用性強,直觀、易懂、易學,可讀性好。目前多數(shù)的51單片機用戶使用C語言(C51)來進行程序設計,已公認為高級語言中高效簡潔而又貼近51單片機硬件的編程語言。將C語言向單片機上移植,始于20世紀80年代的中后期。5經(jīng)過十幾年努力,C51已成為單片機的實用高級編程語言。盡管目前已有不少設計人員使用C51來進行程序開發(fā),但在對程序的空間和時間要求較高的場合,匯編語言仍必不可少。在這種場合下,可使用C語言和匯編語言混合編程。在很多需要直接控制硬件且對實時性要求較高的場合,則更是非用匯編語言不可。掌握匯編語言并能進行程序設計,是學習和掌握單片機程序設計的基本功之一。4.1.2匯編語言語句和格式兩種基本語句:指令語句和偽指令語句。67(1)指令語句每一指令語句在匯編時都產(chǎn)生一個指令代碼(機器代碼),執(zhí)行該指令代碼對應著機器的一種操作。(2)偽指令語句是控制匯編(翻譯)過程的一些控制命令。在匯編時沒有機器代碼與之對應。下面介紹指令語句格式。偽指令語句將在4.1.3節(jié)介紹。匯編語言語句是符合典型的匯編語言的四分段格式:標號字段和操作碼字段之間要有冒號“:”分隔;操作碼字段和操作數(shù)字段間的分界符是空格;雙操作數(shù)之間用逗號相隔;操作數(shù)字段和注釋字段之間的分界符用分號“;”。任何語句都必須有操作碼字段,其余各段為任選項。8標號字段(LABLE)操作碼字段(OPCODE)操作數(shù)字段(OPRAND)注釋字段(COMMENT)【例4-1】下面是一段程序的四分段書寫格式。標號字段操作碼字段操作數(shù)字段注釋字段START:MOV A,#00H ;0→A
MOV R1,#10 ;10→R1 MOV R2,#00000011B ;03H→R2LOOP:ADD A,R2 ;(A)+(R2)→A DJNZ R1,LOOP;R1減1不為零,則跳LOOP處 NOPHERE:SJMP HERE上述4個字段應該遵守的基本語法規(guī)則如下。91.標號字段 語句所在地址的標志符號,如標號“START”和“LOOP”等。有關標號規(guī)定如下:(1)標號后必須跟冒號“:”。(2)標號由1~8個ASCII碼字符組成,第一個字符必須是字母。(3)同一標號在一個程序中只能定義一次,不能重復定義。(4)不能使用匯編語言已經(jīng)定義的符號作為標號,如指令助記符、偽指令以及寄存器的符號名稱等。(5)標號的有無,取決于本程序中的其他語句是否訪問該條語句。如無其他語句訪問,則該語句前不需標號。10112.操作碼字段操作碼字段規(guī)定了語句執(zhí)行的操作,操作碼是匯編語言指令中唯一不能空缺的部分。3.操作數(shù)字段指令的操作數(shù)或操作數(shù)地址。在本字段中,操作數(shù)的個數(shù)因指令的不同而不同。通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是多操作數(shù),則操作數(shù)之間要以逗號隔開。操作數(shù)表示時,幾種情況需注意:(1)十六進制、二進制和十進制形式的操作數(shù)表示 多數(shù)情況,操作數(shù)或操作數(shù)地址是采用十六進制形式來表示的。則需加后綴“H”。 在某些特殊場合用二進制表示,需加后綴“B” 若操作數(shù)采用十進制形式,則需加后綴“D”,也可省略。若十六進制操作數(shù)以字符A~F開頭,需在它前面加一個“0”,以便匯編時把它和字符A~F區(qū)別開。12(2)工作寄存器和特殊功能寄存器的表示當操作數(shù)為工作寄存器或特殊功能寄存器時,允許用工作寄存器和特殊功能寄存器的代號表示。例如,工作寄存器用R7~R0,累加器用A(或Acc)表示。另外,工作寄存器和特殊功能寄存器也可用其地址來表示,如累加器A可用其地址E0H來表示。4.注釋字段 用于解釋指令或程序的含義,對可讀性非常有用。 使用時須以分號開頭,長度不限,一行寫不下可換行書寫,但注意也要以分號開頭。13匯編時,遇到“;”就停止“翻譯”。因此,注釋字段不會產(chǎn)生機器代碼。4.1.3偽指令在匯編語言源程序中應有向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過偽指令來實現(xiàn)。偽指令不屬于指令系統(tǒng)中的匯編語言指令,它是程序員發(fā)給匯編程序的命令,也稱為匯編程序控制命令。只有在匯編前的源程序中才有偽指令?!皞巍斌w現(xiàn)在匯編后,偽指令沒有相應的機器代碼產(chǎn)生。偽指令具有控制匯編程序的輸入/輸出、定義數(shù)據(jù)和符號、條件匯編、分配存儲空間等功能。14常用的偽指令。1.ORG(ORiGin)匯編起始地址命令 源程序的開始,用一條ORG偽指令規(guī)定程序的起始地址。如果不用ORG,則匯編得到的目標程序將從0000H地址開始。例如:
ORG 2000HSTART:
MOV A,#00H
……即規(guī)定標號START代表地址為2000H開始。在一源程序中,可多次用ORG指令,規(guī)定不同的程序段的起始地址。地址必須由小到大排列,且不能交叉、重疊。ORG 2000H……ORG 2500H……ORG 3000H……這種順序是正確的。若按下面順序的排列則是錯誤的,因為地址出現(xiàn)了交叉。ORG 2500H……ORG 2000H……ORG 3000H……162.
END(ENDofAssembly)匯編終止命令源程序結束標志,終止源程序的匯編工作。整個源程序中只能有一條END命令,且位于程序的最后。如果END出現(xiàn)在程序中間,其后的源程序,將不進行匯編處理。3.EQU(EQUate)標號賦值命令用于給標號賦值。賦值后,標號值在整個程序有效。例如:TEST
EQU2000H
表示TEST=2000H,匯編時,凡是遇到TEST時,均以2000H來代替。174.DB(DefineByte)定義數(shù)據(jù)字節(jié)命令用于從指定的地址開始,在程序存儲器連續(xù)單元中定義字節(jié)數(shù)據(jù)。例如: ORG 2000HSEG1:DB 30H,40H,24,"C","B"匯編后(2000H)=30H(2001H)=40H(2002H)=18H(十進制數(shù)24)(2003H)=43H(字符“C”的ASCII碼)(2004H)=42H(字符“B”的ASCII碼)1819顯然,DB功能是從指定單元開始定義(存儲)若干字節(jié),十進制數(shù)自然轉換成十六進制數(shù),字母按ASCII碼存儲。5.DW(DefineWord)定義數(shù)據(jù)字命令該命令用于從指定的地址開始,在程序存儲器的連續(xù)單元中定義16位的數(shù)據(jù)字。例如: ORG 2000H TAB:DW 1246H,7BH,10匯編后(2000H)=12H ;第1個字(2001H)=46H(2002H)=00H ;第2個字(2003H)=7BH(2004H)=00H ;第3個字(2005H)=0AH6.DS(DefineStorage)定義存儲區(qū)命令從指定地址開始,保留指定數(shù)目的字節(jié)單元作為存儲區(qū),例如:
TABEL:DS 10表示從TABEL代表的地址開始,保留10個連續(xù)的地址單元
20注意:DB、DW和DS命令只能對程序存儲器有效,不能對數(shù)據(jù)存儲器使用。7.BIT位定義命令用于給字符名稱賦以位地址,位地址可以是絕對位地址,也可是符號地址。例如:
QA BITP1.6功能是把P1.6的位地址賦給變量QA。4.2匯編語言源程序的匯編“匯編”:匯編可分為手工匯編和機器匯編兩類。214.2.1手工匯編通過查指令的機器代碼表(表3-2),逐個把助記符指令“翻譯”成機器代碼,再進行調(diào)試和運行。手工匯編遇到相對轉移偏移量的計算時,較麻煩,易出錯,只有小程序或受條件限制時才使用。實際中,多采用“匯編程序”來自動完成匯編。224.2.2機器匯編用微型計算機上的軟件(匯編程序)來代替手工匯編。在微機上用編輯軟件進行源程序編輯,然后生成一個ASCII碼文件,擴展名為“.ASM”。在微機上運行匯編程序,譯成機器碼。機器碼通過微機的串口(或并口)傳送到用戶樣機(或在線仿真器),進行程序的調(diào)試和運行。反之,在分析產(chǎn)品的程序的機器代碼時,需將機器代碼翻譯成匯編語言源程序,稱為“反匯編”。23【例4-2】
表4-1是一段源程序的匯編結果,可查表3-2,手工匯編,來驗證下面的匯編結果是否正確。機器碼從1000H單元開始存放。244.351匯編語言程序設計舉例介紹常用的匯編語言程序的設計。4.3.1子程序的設計將那些需多次應用的、完成相同的某種基本運算或操作的程序段從整個程序中獨立出來,單獨編成一個程序段,需要時進行調(diào)用。這樣的程序段稱為子程序。優(yōu)點:采用子程序可使程序結構簡單,縮短程序的設計時間,減少占用的程序存儲空間。25261.子程序的基本結構典型的子程序的基本結構如下:MAIN:
……
;MAIN為主程序入口標號 ……QQQ: LCALL SUB ;調(diào)用子程序SUB,3字節(jié)機器代碼DISTU: …… ……子程序SUB:
PUSH PSW ;現(xiàn)場保護
PUSH Acc POP Acc ;現(xiàn)場恢復,注意要先進后出 POP PSW RET ;最后一條指令必須為RET26子程序處理程序段子程序2.子程序的設計原則和調(diào)用應注意的問題主程序調(diào)用子程序,是通過調(diào)用指令來實現(xiàn)。兩條子程序調(diào)用指令:②長調(diào)用指令LCALLaddr16。三字節(jié),addr16為直接調(diào)用的目的地址,子程序可放在64KB程序存儲器區(qū)任意位置。①絕對調(diào)用指令ACALLaddr11。雙字節(jié),addr11指出了調(diào)用的目的地址,PC中16位地址中的高5位不變,被調(diào)用的子程序的首地址與絕對調(diào)用指令的下一條指令的高5位地址相同,即只能在同一個2KB區(qū)內(nèi)。
2728 LCALL SUB硬件自動將斷點DISTU入棧保存。斷點的低位字節(jié)先入棧,高位字節(jié)后入棧。 斷點是如何計算的?堆棧指針有何變化?
PC=SUB
(1)子程序的入口地址,前必須有標號。(2)子程序入口處,一般用到堆棧指令,進行現(xiàn)場的保護PSW當前內(nèi)容;子程序中要用到的寄存器,必須在子程序使用前將其當前內(nèi)容入棧保存(3)子程序最后一條指令必須是RET指令,執(zhí)行后把堆棧中的斷點地址彈出送入PC指針中,從而實現(xiàn)子程序返回后從主程序斷點處繼續(xù)執(zhí)行主程序。(4)子程序可以嵌套,即主程序可以調(diào)用子程序,子程序又可以調(diào)用另外的子程序。294.3.2查表程序設計查表程序是一種常用程序,避免復雜的運算或轉換過程,可完成數(shù)據(jù)補償、修正、計算、轉換等各種功能,具有程序簡單、執(zhí)行速度快等優(yōu)點。查表是根據(jù)自變量x,在表格尋找y,使y=f(x)。單片機中,數(shù)據(jù)表格存放于程序存儲器內(nèi)。兩條查表指令如下:(1)MOVC A,@A+DPTR(2)MOVC A,@A+PC3031MOVCA,@A+DPTR把A中內(nèi)容與DPTR中的內(nèi)容相加,結果為某一程序存儲單元的地址,然后把該地址單元的內(nèi)容送到A中?!纠?-3】
設計一子程序,功能是根據(jù)累加器A中的數(shù)x(0~9之間)查x的平方表,根據(jù)x的值查出相應的平方y(tǒng)。本例中的x和y均為單字節(jié)數(shù)。32
PUSHDPH ;保存DPH PUSHDPL ;保存DPL
MOVDPTR,#TAB1 MOVA,#3 MOVC A,@A+DPTR POPDPL ;恢復DPL POPDPH ;恢復DPH RETTAB1:
DB 00H,01H,04H,09H,10H;平方表
DB 19H,24H,31H,40H,51H A=09H3233表格可以設在64KB程序存儲器空間內(nèi)的任何地方。如果DPTR已被使用,則在查表前必須保護DPTR,且結束后恢復DPTR.34MOVCA,@A+PCPC當前值與A的內(nèi)容相加后所得的數(shù)作為某一程序存儲器單元的地址,根據(jù)地址取出程序存儲器相應單元中的內(nèi)容送到累加器A。指令執(zhí)行后,PC的內(nèi)容不發(fā)生變化,仍指向該查表指令的下一條指令。MOVCA,@A+PC
子程序
MOVA,#03H ADDA,#01H; 累加偏移量 MOVCA,@A+PC RET; 1字節(jié)機器代碼 DB00H,01H,04H,09H,10H DB19H,24H,31H,40H,51H
;數(shù)0~9的平方表A=09H35指令“ADDA,#01H”的作用PC當前值+偏移量指向表首。偏移量為查表指令的下一條指令與表之間的所有指令翻譯成機器代碼后所占的字節(jié)數(shù)之和。表格所在的程序空間受到限制,表格必須存放在查表指令的下一條指令起始地址+00H~FFH范圍內(nèi)。364.3.3關鍵字查找程序設計在表中查找關鍵字的操作,也稱為數(shù)據(jù)檢索。有兩種方法,即順序檢索和對分檢索。1.順序檢索要檢索的表是無序的,檢索時只能從第1項開始逐項查找,判斷所取數(shù)據(jù)是否與關鍵字相等?!纠?-6】從50個字節(jié)的無序表中查找一個關鍵字“xxH”。ORG 1000HMOV 30H,#xxH
;關鍵字xxH送30H單元MOV R1,#50 ;查找次數(shù)送R1MOV A,#14 ;修正值送AMOVDPTR,#TAB4 ;表首地址送DPTR37LOOP: PUSHAcc MOVCA,@A+PC ;查表結果送A CJNEA,40H,LOOP1;(40H)不等于關鍵字則轉LOOP1 MOVR2,DPH ;查到關鍵字,把地址送R2,R3 MOVR3,DPL DONE:
RETLOOP1:POP Acc ;修正值彈出 INC A ;A+1→A INC DPTR ;修改數(shù)據(jù)指針DPTR DJNZR1,LOOP ;R1≠0,未查完,繼續(xù)查找 MOV R2,#00H ;R1=0,R2和R3清0 MOV R3,#00H ;表中50個數(shù)已查完 AJMP DONE ;從子程序返回
TAB4: DB …,…,…
;50個無序數(shù)據(jù)表382.對分檢索對分檢索的前提是檢索的數(shù)據(jù)表已經(jīng)排好序,以便于按照對分原則取數(shù)。如何進行數(shù)據(jù)排序,稍后介紹。對分檢索的方法:取數(shù)據(jù)表中間位置的數(shù)與關鍵字進行比較,如相等,則查找結束。如果取數(shù)大于關鍵字,則下次對分檢索的范圍是從數(shù)據(jù)區(qū)起點到本次取數(shù)處。如果取數(shù)小于關鍵字,則下次對分檢索的范圍是從本次取數(shù)數(shù)據(jù)區(qū)起點到數(shù)據(jù)區(qū)終點。依此類推,逐漸縮小檢索范圍,減少次數(shù),大大提高查找速度。39404.3.4數(shù)據(jù)極值查找程序設計進行數(shù)值大小的比較,從一批數(shù)據(jù)中找出最大值(或最小值)并存于某一單元中?!纠?-7】片內(nèi)RAM中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設R0中存放首地址,R2中存放字節(jié)數(shù),程序框圖見圖4-1。程序如下:
MOV R2,n ;n為要比較的數(shù)據(jù)字節(jié)數(shù) MOV A,R0 ;存首地址指針
MOV R1,A DEC R2 MOV A,@R1LOOP: MOV R3,
A DEC R1 CLR C SUBBA,@R1 ;兩個數(shù)比較 JNC LOOP1 ;C=0,A中數(shù)大,跳LOOP1 MOVA,@R1 ;C=1,則大數(shù)送A SJMPLOOP2LOOP1:MOV A,R3LOOP2:DJNZ R2,
LOOP ;是否比較結束? MOV @R0,
A ;存最大數(shù)
RET414.3.5數(shù)據(jù)排序程序設計將一批數(shù)由小到大(升序)排列,或由大到小(降序)排列。最常用的數(shù)據(jù)排序算法是冒泡法,是相鄰數(shù)互換的排序方法,因其過程類似水中氣泡上浮,故稱冒泡法。排序時,從前向后進行相鄰兩個數(shù)的比較,如果數(shù)據(jù)的大小次序與要求的順序不符時,就將兩個數(shù)互換;否則,順序符合要求就不互換。如果進行升序排序,應通過這種相鄰數(shù)互換方法,使小數(shù)向前移,大數(shù)向后移。如此從前向后進行一次次相鄰數(shù)互換(冒泡),就會把這批數(shù)據(jù)的最大數(shù)排到最后,次大數(shù)排在倒數(shù)第二的位置,42從而實現(xiàn)一批數(shù)據(jù)由小到大的排列。假設有7個原始數(shù)據(jù)的排列順序為6、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
;逆序,互換,第一次冒泡結束43如此進行,各次冒泡的結果如下:第1次冒泡結果:4、1、2、5、6、3、7第2次冒泡結果:1、2、4、5、3、6、7第3次冒泡結果:1、2、4、3、5、6、7第4次冒泡結果:1、2、3、4、5、6、7;已完成排序第5次冒泡結果:1、2、3、4、5、6、7第6次冒泡結果:1、2、3、4、5、6、7對于n個數(shù),理論上應進行(n-1)次冒泡才能完成排序,實際上有時不到(n-1)次就已完成排序。4445例如,上面的7個數(shù),應進行6次冒泡,但實際上第4次冒泡時就已經(jīng)完成排序。如何判定排序是否已經(jīng)完成?就是看各次冒泡中是否有互換發(fā)生,如果有,則排序還沒完成;否則就表示已經(jīng)排好序。在程序設計中,常用設置互換標志的方法,用標志的狀態(tài)表示是否有互換進行?!纠?-8】一批單字節(jié)無符號數(shù),以R0為首地址指針,R2中為字節(jié)數(shù),將這批數(shù)進行升序排列。程序框圖如圖4-2所示。程序如下:SORT: MOV A,R0 MOVR1,A MOVA,R2 ;字節(jié)數(shù)送入R5 MOVR5,A CLR F0 ;互換標志位F0清0 DEC R5 MOVA,@R1
LOOP: MOVR3,A INC R1 CLR C MOVA,@R1 ;比較大小46 SUBBA,R3 JNC LOOP1 SETBF0 ;互換標志位F0置1 MOVA,R3;
XCH A,@R1 ;兩個數(shù)互換 DEC R1 XCH A,@R1 INC R1LOOP1:MOVA,@R1 DJNZR5,LOOP JB F0,SORT RET4748圖4-2
單字節(jié)無符號數(shù)排序程序框圖4.3.6分支轉移程序設計分為無條件轉移和有條件轉移。無條件分支轉移程序很簡單,不討論。有條件分支轉移程序按結構類型來分,又分為單分支選擇結構和多分支選擇結構。1.單分支選擇結構僅有兩個出口,兩者選一。一般根據(jù)運算結果的狀態(tài)標志,用條件判跳指令來選擇并轉移。4950單分支選擇結構有圖4-4、圖4-5所示的幾種形式。50圖4-4單分支選擇結構1
圖4-5單分支選擇結構2【例4-9】
求單字節(jié)有符號數(shù)的二進制補碼正數(shù)補碼是其本身,負數(shù)補碼是其反碼加1。應首先判被轉換數(shù)的符號,負數(shù)進行轉換,正數(shù)本身即為補碼。設二進制數(shù)放在A中,其補碼放回到A中,框圖如圖4-3所示。參考程序如下:
CMPT:JNBAcc.7,RETURN ;(A)>0,不需轉換 MOV C,Acc.7 ;符號位保存 CPLA ;(A)求反,加1 ADD A,#1 MOVAcc.7,C ;符號位存在A的最高位RETURN:RET5152圖4-3
求單字節(jié)有符號二進制數(shù)補碼的框圖2.多分支選擇結構當程序的判別部分有兩個以上的出口時,為多分支選擇結構。有兩種形式,如圖4-6和圖4-7所示。53
圖4-6
多分支選擇結構1圖4-7
多分支選擇結構2指令系統(tǒng)提供了非常有用的兩種多分支選擇指令:(1)比較轉移指令
CJNEA,direct,rel
CJNEA,#data,rel CJNERn,#data,rel CJNE@Ri,#data,rel能對兩個欲比較的單元內(nèi)容進行比較,當不相等時,程序實現(xiàn)相對轉移;若兩者相等,則順序往下執(zhí)行。(2)間接轉移指令
JMP@A+DPTR由數(shù)據(jù)指針DPTR決定多分支轉移程序的首地址,由A的內(nèi)容選擇對應分支。54【例4-11】當單片機系統(tǒng)中的鍵盤按下時,就會得到一個鍵值,存放在寄存器R2。根據(jù)不同的鍵值,跳向不同的鍵處理程序入口。分析:可用直接轉移指令(LJMP或AJMP指令)組成一個轉移表,轉移表首地址放入DPTR中,把R2內(nèi)容讀入累加器A,利用間接轉移指令實現(xiàn)分支轉移。
(R2)=0,轉PRG0 (R2)=1,轉PRG1 …… (R2)=n,轉PRGn55程序如下:JMP6:
MOV DPTR,#TAB5;轉移表首地址送DPTR MOV A,R2 ;分支轉移參量送A MOV B,#03H ;乘數(shù)3送B MUL AB ;分支轉移參量乘3 MOV R6,
A ;乘積的低8位暫存R6 MOV A,B ;乘積的高8位送A ADD A,DPH ;乘積的高8位加到DPH中 MOV DPH,
A MOV A,
R6 JMP @A+DPTR ;多分支轉移選擇
……56TAB5: LJMP PRG0 ;3字節(jié)機器代碼 LJMP PRG1
…… LJMP PRGn
;多分支轉移表問題:R2中的分支轉移參量為何要乘3?57584.3.7循環(huán)程序設計
程序中含有可以反復執(zhí)行的程序段,稱循環(huán)體。例如,求100個數(shù)的累加和,沒必要連續(xù)安排100條加法指令,用一條加法指令使其循環(huán)執(zhí)行100次。因此可縮短程序長度和程序所占的內(nèi)存單元數(shù)量更少,使程序結構緊湊。1.循環(huán)程序的結構主要由以下四部分組成。(1)循環(huán)初始化完成循環(huán)前的準備工作。例如,循環(huán)控制計數(shù)初值的設置、地址指針的起始地址的設置、為變量預置初值等。(2)循環(huán)處理完成實際的處理工作,反復循環(huán)執(zhí)行的部分,故又稱循環(huán)體。(3)循環(huán)控制在重復執(zhí)行循環(huán)體的過程中,不斷修改循環(huán)控制變量,直到符合結束條件,就結束循環(huán)程序的執(zhí)行。59循環(huán)結束控制方法分為循環(huán)計數(shù)控制法和條件控制法。(4)循環(huán)結束這部分是對循環(huán)程序執(zhí)行的結果進行分析、處理和存放。2.循環(huán)結構的控制分為循環(huán)計數(shù)控制結構和條件控制結構。圖4-8是計數(shù)循環(huán)控制結構,圖4-9是條件控制結構。6061圖4-8計數(shù)循環(huán)控制結構圖4-9條件控制結構(1)計數(shù)循環(huán)控制結構依據(jù)計數(shù)器的值來決定循環(huán)次數(shù),一般為減1計數(shù)器,計數(shù)器減到“0”時,結束循環(huán)。計數(shù)器初值在初始化設定。MCS—51指令系統(tǒng)提供了功能極強的循環(huán)控制指令:DJNZRn,rel
;以工作寄存器作控制計數(shù)器DJNZdirect,rel
;以直接尋址單元作控制計數(shù)器例如,計算n個數(shù)據(jù)的和,計算公式為。如直接按公式編寫程序,則n=100時,需編寫連續(xù)的100次加法。這樣程序將太長,并且n可變時,將無法編寫出程序。62公式要改寫為用程序實現(xiàn)的形式,用下式表示程序框圖見圖4-10。63圖4-10
求數(shù)據(jù)和的程序框圖【例4-12】求n個單字節(jié)無符號數(shù)xi的和,xi按i順序存放在AT89S51單片機內(nèi)部RAM從50H開始的單元中,n放在R2中,和(雙字節(jié))放在R3R4中。程序如下:ADD1:
MOV R2,#n ;加法次數(shù)n送R2 MOVR3,#0 ;R3存放和的高8位,初始值為0 MOVR4,#0 ;R4存放和的低8位,初始值為0 MOVR0,#50HLOOP: MOVA,R4 ADD A,@R0 MOVR4,A INC R0 CLR A64
ADDCA,R3 MOVR3,A DJNZR2,LOO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 財經(jīng)視角下的現(xiàn)代辦公樓宇管理
- 張家口學院《畫法幾何與機械制圖二》2023-2024學年第二學期期末試卷
- 南京中醫(yī)藥大學翰林學院《智慧醫(yī)學數(shù)據(jù)處理與應用》2023-2024學年第二學期期末試卷
- 曲阜師范大學《Python語言基礎》2023-2024學年第二學期期末試卷
- 中國石油大學(華東)《數(shù)據(jù)庫高級應用》2023-2024學年第二學期期末試卷
- 和君職業(yè)學院《機器學習與模式識別C》2023-2024學年第二學期期末試卷
- 南昌工程學院《精神神經(jīng)系統(tǒng)整合課程》2023-2024學年第二學期期末試卷
- 電子科技大學中山學院《剪輯技術》2023-2024學年第二學期期末試卷
- 湖南城市學院《人文地理學實踐》2023-2024學年第二學期期末試卷
- 湖南理工職業(yè)技術學院《資本運營與公司治理》2023-2024學年第二學期期末試卷
- 2025年度5G基站建設勞務合同范本
- (完整版)班主任量化考核細則
- 2025年中國鐵路鄭州局集團有限公司招聘筆試參考題庫含答案解析
- 2025年上半年永春縣農(nóng)文旅發(fā)展集團限公司公開招聘若干名工作人員易考易錯模擬試題(共500題)試卷后附參考答案
- 家庭康復服務的商業(yè)價值與發(fā)展趨勢
- 2025年?;髽I(yè)安全教育培訓計劃
- 《HR的成長之路》課件
- 2025年山東浪潮集團有限公司招聘筆試參考題庫含答案解析
- 裝修完成情況報告范文
- 2024-2024年上海市高考英語試題及答案
- 雙線性濾波器與圖像去噪-洞察分析
評論
0/150
提交評論