匯編語言程序設計知識BH_第1頁
匯編語言程序設計知識BH_第2頁
匯編語言程序設計知識BH_第3頁
匯編語言程序設計知識BH_第4頁
匯編語言程序設計知識BH_第5頁
已閱讀5頁,還剩70頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

匯編語言程序設計知識BH第一頁,共76頁。內容提要

第1章微機基礎知識第2章89C51單片機硬件結構和原理第3章89C51指令系統第4章匯編語言程序設計知識

第4章C-51程序設計知識第5章中斷系統第6章定時器及應用第7章89C51串行口及通信技術第8章單片機小系統片外擴展第9章應用系統配置及接口技術第二頁,共76頁。第4章匯編語言程序設計知識§4.1編程的步驟、方法和技巧§4.2匯編語言源程序的編輯和匯編§4.3匯編語言程序設計基礎與舉例第三頁,共76頁。§4.1編程的步驟、方法和技巧§4.1.1編程的步驟§4.1.2編程的方法和技巧§4.1.3匯編語言程序的基本結構第四頁,共76頁。§4.1.1編程的步驟一、分析問題二、確定算法三、畫程序流程圖四、編寫程序第五頁,共76頁。一、分析問題對需要解決的問題進行分析,以求對問題由正確的理解。如,解決問題的任務是什么?工作過程?現有的條件,已知數據,對運算的精度和速度方面的要求?硬件資源如何訪問?第六頁,共76頁。二、確定算法算法是如何將實際問題轉化成程序模塊來處理。在編程以前,先要對幾種不同的算法進行分析、比較,找出最適宜的算法第七頁,共76頁。三、畫程序流程圖程序流程圖是使用各種圖形、符號、有向線段等來說明程序設計過程的一種直觀的表示。流程圖步驟分得越細致,編寫程序是也越方便。畫流程圖是程序結構設計是采用的一種重要手段。一個系統軟件有總的流程圖(主程序框圖)和局部的流程圖。流程圖常采用的圖形和符號。第八頁,共76頁。橢圓框或桶形框:表示程序的開始或結束。矩形框:表示要進行的工作。菱形框:表示要判斷的事情,菱形框內的表達式表示要判斷的內容。圓圈:表示連接點指向線:表示程序的流向第九頁,共76頁。四、編寫程序用89C51匯編語言編寫的源程序行(一條語句)包括四個部分,也叫四個字段:〔標號:〕〔操作碼〕〔操作數〕;〔注釋〕

每個字段之間要用分隔符分隔,而每個字段內部不能使用分隔符。可以用作分隔符的符號:空格“”、冒號“:”、、逗號“,”、分號“;”等。例:LOOP:MOVA,#00H;立即數00H→A第十頁,共76頁。§4.1.2編程的方法和技巧一、模塊化的程序設計方法二、編程技巧第十一頁,共76頁。一、模塊化的程序設計方法1、程序功能模塊化的優點2、劃分模塊的原則第十二頁,共76頁。1、程序功能模塊化的優點單個模塊結構的程序功能單一,易于編寫、閱讀、調試和修改。便于分工,從而可使多個程序員同時進行程序的編寫和調試工作,加快軟件研制進度。程序可讀性好,便于功能擴充和版本升級。對程序的修改可局部進行,其它部分可以保持不變。對于使用頻繁的子程序可以建立子程序庫,便于多個模塊調用。第十三頁,共76頁。2、劃分模塊的原則每個模塊應具有獨立的功能,能產生一個明確的結果,即單模塊的功能高內聚性。模塊之間的控制耦合應盡量簡單,數據耦合應盡量少,即模塊間的低耦合性。控制耦合是指模塊進入和退出的條件及方式,數據耦合是指模塊間的信息交換方式、交換量的多少及交換頻繁程度。模塊長度適中。第十四頁,共76頁。二、編程技巧1、盡量采用循環結構和子程序。2、盡量少用無條件轉移指令。3、對于通用的子程序,考慮到其通用性,除了用于存放子程序入口參數的寄存器外,子程序中用到的其他寄存器的內容應壓入堆棧(返回前再彈出),即保護現場。4、在中斷處理程序中,除了要保護處理程序中用到的寄存器外,還要保護標志寄存器。5、用累加器傳遞入口參數或返回參數比較方便,在子程序中,一般不必把累加器內容壓入堆棧。第十五頁,共76頁。§4.2匯編語言源程序的編輯和匯編§4.2.1源程序編輯§4.2.2源程序的匯編§4.2.3偽指令第十六頁,共76頁。§4.2.1源程序編輯在微型計算機上,借助編輯軟件,編寫或修改匯編語言源程序。如行編輯或屏幕編輯軟件。第十七頁,共76頁。§4.2.2源程序的匯編匯編:將匯編語言源程序轉換為機器碼表示的目標程序的過程。對單片機有:一、手工匯編二、機器匯編三、反匯編第十八頁,共76頁。一、手工匯編通過手工方式查指令編碼表,逐個把助記符指令“翻譯”成機器碼,然后把得到的機器碼程序鍵入單片機,進行調試和運行。手工匯編的缺點:

1、偏移量的計算容易出錯

2、程序的修改會引起后面指令地址的變化,轉移指令的偏移量也要重新計算。第十九頁,共76頁。二、機器匯編機器匯編是在計算機上使用交叉匯編程序進行源程序的匯編。匯編工作由機器自動完成,最后得到以機器碼表示的目標程序。第二十頁,共76頁。三、反匯編將二進制機器語言程序翻譯成匯編語言程序的過程稱反匯編。匯編和反匯編的過程如圖4-3所示。第二十一頁,共76頁。源程序(匯編語言)目標碼(機器語言)匯編(匯編程序)反匯編(匯編程序)圖4-3匯編和反匯編過程第二十二頁,共76頁。§4.2.3偽指令偽指令不是真正的指令,無對應的機器碼,在匯編時不產生目標程序,只是用來對匯編過程進行某種控制。第二十三頁,共76頁。ORG匯編起始命令格式:ORG16位地址功能:規定該偽指令后面程序的匯編地址,即匯編后生成目標程序存放的起始地址。例如:

ORG2000HSTART:MOVA,#64H┇規定了START的地址是2000H,又規定了匯編后的第一條指令碼從2000H開始存放。第二十四頁,共76頁。END匯編結束指令格式:END功能:通知匯編程序結束匯編。在END之后所有的匯編指令均不予以處理。第二十五頁,共76頁。EQU賦值命令格式:字符名稱EQU項(數或匯編符號)功能:把“項”賦給“字符名稱”。注意:字符名稱不等于標號(其后沒有冒號);其中的項,可以是數,也可以是匯編符號。EQU賦值過的符號名可以用作數據、代碼地址、位地址或一個立即數。可以是8位的,也可以是16位的。例如:第二十六頁,共76頁。EQU賦值命令例1:AAEQUR1MOVA,AA;AA代表工作寄存器R1例2:

A10EQU10DELYEQU07EBHMOVA,A10;A10作為片內的一個直接地址

LCALLDELY;DELY作為一個16位子程序的入口地址第二十七頁,共76頁。DATA數據地址賦值命令格式:字符名稱DATA表達式功能:與EQU類似,但有以下差別:1、EQU定義的字符名必須先定義后使用,而DATA定義的字符名可以后定義先使用。2、用EQU偽指令可以把一個匯編符號賦給一個名字,而DATA只能把數據賦給字符名。3、DATA語句可以把一個表達式的值賦給字符名稱,其中的表達式應是可求值的。DATA偽指令在程序中常用來定義數據地址第二十八頁,共76頁。DB定義字節命令格式:DB(項或項表)功能:通知匯編程序從當前ROM地址開始,保留一個字或字節串的存儲單元,并存入DB后的數據。注意:項或項表可以是一個字節,用逗號隔開的字節串或括在單引號中的ASCII字符串。例如:第二十九頁,共76頁。DB定義字節命令ORG2000HDB0A3HLIST:DB26H,03HSTR:DB‘ABC’┇經匯編后(2000H)=A3H,(2001H)=26H,(2002H)=03H,(2003H)=41H,(2004H)=42H,(2005H)=43H,(*41H,42H,43H分別為A,B,C的ASCII碼)第三十頁,共76頁。DW定義字命令格式:DW16位數據項或項表功能:把DW后的16位數據項或項表從當前地址連續存放。每項數值為16位二進制數,高8位先放,低8位后存放。DW用于定義一個地址表。例如:第三十一頁,共76頁。DW定義字命令

ORG1500HTABLE:DW7234H,8AH,10H┇經匯編后(1500H)=72H,(1501H)=34H,(1502H)=00H,(1503H)=8AH,(1504H)=00H,(1505H)=10H,第三十二頁,共76頁。DS定義存儲空間命令格式:DS表達式功能:在匯編時,從指定地址開始保留DS之后表達式的值所規定的存儲單元以備后用。例如:ORG1000HDS08HDB30H,8AH匯編后,從1000H保留8個單元,然后從1008H按DB命令給內存賦值,即(1008H)=30H

(1009H)=8AH第三十三頁,共76頁。BIT位地址符號命令格式:字符名BIT位地址功能:把BIT后的位地址值賦給字符名。其中字符名不是標號,其后沒有冒號,但字符名是必須的。例如:A1BITP1.0A2BIT02H匯編后,P1口第0位的位地址90H就賦給了A1,而A2的值則為02H。第三十四頁,共76頁。4.3程序設計基礎與舉例4.3.0MCS-51匯編語言程序代碼框架4.3.1順序程序設計4.3.2分支程序設計4.3.3循環程序設計4.3.4子程序設計及調用4.3.5邏輯運算程序設計第三十五頁,共76頁。

ORG1000HLENEQU10HSTART:MOVA,#LEN ADDA,#30HSJMP$

ORG2000HTAB1: DB32H,0A7HTAB2: DW324AH,3CHTAB3: DS5

END7410243080FEFFFFFFFF1000H32A7324A003CFFFFFFFF2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H200AH200BH……TAB1TAB2TAB34.3.0MCS-51匯編語言程序代碼框架第三十六頁,共76頁。4.3.1順序程序順序程序是一種最簡單,最基本的程序。特點:程序按編寫的順序依次往下執行每一條指令,直到最后一條。例有一變量存放在片內RAM20H單元,其取值范圍為:00H~05H,編程實現:求變量的平方值,并存入片內RAM21H單元。分析:XX220H21H內部RAMTABLE+002122232425200H01H04H09H10H19H+1+2+3+4+5XX2第三十七頁,共76頁。步驟:1.送表頭首地址2.取X到A3.求X2

存于A4.將X2存于內部RAM21HORG1000HSTART:MOVDPTR,#TABLEMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$TABLE:DB00H,01H,04HDB09H,10H,19HORG2000H5.建立平方表第三十八頁,共76頁。例三字節無符號數加法。

一個加數存放在內部RAM50H,51H,52H單元,另一個加數存放在內部RAM60H,61H,62H單元,將相加結果存入50H,51H,52H單元。進位存放在位尋址區的00H位。按低字節對應低地址存放。分析:+15109AC51626160789ABF12345652515052515000R0R1R0第三十九頁,共76頁。 ORG0000HSTART:LJMPSTART1 ORG1000HSTART1:MOVA,50HADDA,60HMOV50H,AMOVA,51HADDCA,61HMOV51H,AMOVA,52HADDCA,62HMOV62H,AMOV00H,CSJMP$思考題:若求兩個十字節數的和,程序應該怎么寫?第四十頁,共76頁。1.分支程序的基本形式分支程序有三種基本形式。分支程序的設計要點如下:(1)先建立可供條件轉移指令測試的條件。

(2)選用合適的條件轉移指令。(3)在轉移的目的地址處設定標號。4.3.2分支程序第四十一頁,共76頁。N(a)(b)(c)

分支程序結構流程圖分支0K=0K=1…K=nK=?……分支1分支nY

條件滿足?下條指令程序段A條件滿足?程序段A程序段BNY第四十二頁,共76頁。例X存于20H單元,求出Y值,將Y值存入30H單元。

XX>0Y= 20HX=0X+5X<0分析:根據數據的符號位判別該數的正負,若最高位為0,再判別該數是否為0。請看程序流程。2.雙向分支程序設計舉例第四十三頁,共76頁。A為0?Y取數,A←(20H)開始結束A<0?YNNA←#20HA←X+5A←X(30H)←A程序流程圖第四十四頁,共76頁。3.多向分支程序設計舉例例根據R0的值轉向7個分支程序。R0=0,轉向SUB0;R0=1,轉向SUB1;

…….R0=N,轉向SUBN。分析:利用JMP@A+DPTR指令直接給PC賦值,使程序實現轉移。程序流程如下。第四十五頁,共76頁。多向分支程序流程圖結束K=?轉SUB0轉SUB1轉SUBNK=0K=1……K=N開始……第四十六頁,共76頁。

參考程序如下:

ORG2000HSTART:MOVDPTR,#TAB;轉移指令表首地址

MOVA,R0;取數

RLA ;A←2(A)

JNCA1INCDPHA1:JMP@A+DPTR ;PC←A+DPTRTAB:AJMP SUB0 ;轉移指令表

AJMPSUB1AJMP SUB2AJMP SUB3AJMP SUB4

……AJMP SUBN第四十七頁,共76頁。5.3.3循環程序在程序運行時,有時需要連續重復執行某段程序,可以使用循環程序。其結構包括四部分:

1、置循環初值

2、循環體(循環工作部分)

3、修改控制變量

4、循環控制部分其組織方式如圖4-2所示。第四十八頁,共76頁。1、置循環初值對于循環程序中所使用的工作單元,在循環開始時應置初值。例如,工作寄存器設置計數初值,累加器A清0,以及設置地址指針、長度等。第四十九頁,共76頁。2、循環體(循環工作部分)重復執行的程序段部分,分為循環工作部分和循環控制部分。循環控制部分每循環一次,檢查結束條件,當滿足條件時,就停止循環,往下繼續執行其他程序第五十頁,共76頁。3、修改控制變量在循環程序中,不許給出循環結束條件。常見的是計數循環,當循環了一定的次數后,就停止循環。在單片機中,一般用一個工作寄存器Rn作為計數器,對該計數器賦初值作為循環次數。每循環一次,計數器的值減1,即修改循環控制變量,當計數器的置件為0時,就停止循環。第五十一頁,共76頁。4、循環控制部分根據循環結束條件,判斷是否結束循環。89C51可采用DJNZ指令來自動修改控制變量并能結束循環。第五十二頁,共76頁。置初值循環體循環修改循環控制退出循環未完完(a)置初值循環體循環修改循環控制退出循環未完完(b)圖4-2循環組織方式流程圖第五十三頁,共76頁。5.循環程序設計舉例1.數據傳送2.算術運算4.軟件定時3.排序第五十四頁,共76頁。例編程實現將內部RAM20H開始的連續的10個單元清零。(加)ORG0100HCLEAR:MOVR2,#10MOVR0,#20HCLRA;初始化部分LOOP:MOV@R0,AINCR0DJNZR2,LOOPSJMP$;執行清零操作;修改地址指針;判斷循環是否結束?第五十五頁,共76頁。例編程實現將內部RAM起始地址為data的數據串傳送到外部RAM中起始地址為BUF的存儲區內,直到發現“$”字符,則停止傳送。分析:此例中,我們不知道循環次數,但知道循環結束條件,即遇到“$”字符時,循環停止。則,如何判斷字符“$”?CJNEA,#24H(或‘$’),

LOOP1(A)=#24H?不相等,轉LOOP1

相等,執行下條指令取數判斷是否結束結束傳送修改指針第五十六頁,共76頁。

MOVR0,#dataMOVDPTR,#BUFLOOP0:MOVA,@R0CJNEA,#24H,LOOP1SJMPDONELOOP1:MOVX@DPTR,AINCR0INCDPTRSJMPLOOP0DONE:END;初始化部分;取數;判斷是否為‘$’;是‘$’,結束;不是‘$’,繼續找;修改指針;取下一數;結束第五十七頁,共76頁。例單字節求和。設在內部RAM20H單元開始存有10個單字節無符號數,求其和,存于內部RAM30H(低位),31H單元(高位)。MOVR0,#20HMOVR2,#10CLRAMOV31H,A;初始化部分LOOP:ADDA,@R0JNCNEXTINC31HNEXT:INCR0DJNZR2,LOOPMOV30H,ASJMP$;求和;沒有進位,準備下一數;有進位,31H加1;修改指針;10個數加完否,未完,回LOOP;加完,存低位和到30H第五十八頁,共76頁。例無符號數排序。在片內RAM中,起始地址為30H的8個單元中存放有8個無符號數。試進行升序排序。數據排序最常用的方法是冒泡排序法。執行時從前向后進行相鄰數的比較,如數據的大小次序與要求的順序不符,就將這兩個數互換,否則不換。進行第一次冒泡,就會把最大數(或最小數)放到最前(降序)或最后(升序)。再進行第一次冒泡,就會把次大數(或最小數)放到第二位(降序)或倒數第二位(升序)……第五十九頁,共76頁。START:CLRC;互換標志清0MOVR7,#07H;各次冒泡比較次數MOVR0,#30H;送數據區首地址LOOP:MOVA,@R0;取前數MOV2BH,A;暫存MOV2AH,@R0;取后數INCR0;CLRCSUBBA,@R0;前數減后數JCNEXT;前數小于后數,進行下一次比較MOV@R0,2BH;前數大于后數,將大數放在后面DECR0MOV@R0,2AH;將小數放在前面第六十頁,共76頁。SETB00H;置互換標志INCR0;準備下一次比較NEXT:DJNZR7,LOOP;進行下一次比較JB00H,START;進行下一輪冒泡SJMP$第六十一頁,共76頁。50ms延時程序如下:DELAY:MOVR7,#200DEL2:MOVR6,#123DEL1:NOPDJNZR6,DEL1DJNZR7,DEL2RET例50ms延時程序。

延時程序與MCS-51執行指令的時間有關,如果使用6MHz晶振,一個機器周期為2μs,計算出一條指令以至一個循環所需要的執行時間,給出相應的循環次數,便能達到延時的目的。;1μs;1μs;1μs;2μs;2μs;2μs123次200次T=[1+{[(3ⅹ123)+3]ⅹ200}+2]*2=XXXXms

第六十二頁,共76頁。4.3.4子程序的設計及其調用

1.子程序概念通常把這些基本操作功能編制為程序段作為獨立的子程序,以供不同程序或同一程序反復調用。在程序中需要執行這種操作的地方放置一條調用指令,當程序執行到調用指令,就轉到子程序中完成規定的操作,并返回到原來的程序繼續執行下去。2.

子程序的調用所謂調用子程序,暫時中斷主程序的執行,而轉到子程序的入口地址去執行子程序。第六十三頁,共76頁。調用子程序應注意:(1)子程序占用的存儲單元和寄存器。(2)參數的傳遞。(3)保護現場和恢復現場。(4)嵌套調用與遞歸調用。如圖4-9所示。調用子程序的指令有“ACALL”和“LCALL”,執行調用指令時,先將程序地址指針PC改變(“ACALL”加2,“LCALL”加3),然后PC值壓入堆棧,用新的地址值代替。執行返回指令時,再將PC值彈出。下一頁第六十四頁,共76頁。子程序的調用與返回返回RETLCALLSUBSUB第六十五頁,共76頁。子程序的嵌套調用與返回LCALLARETRETLCALLB子程序A子程序B返回第六十六頁,共76頁。

子程序調用中,主程序應先把有關的參數存入約定的位置,子程序在執行時,可以從約定的位置取得參數;當子程序執行完,將得到的結果再存入約定的位置,返回主程序后,主程序可以從這些約定的位置上取得需要的結果,這就是參數的傳遞。參數的傳遞的方法:1.利用累加器或寄存器2.利用存儲器3.利用堆棧保護現場和恢復現場:子程序執行過程中,常常要用到一些通用單元,如R0~R7,A,DPTR,PSW等。保護現場:子程序要用到這些單元,因此把主程序中這些單元內容保存起來,通常用壓棧操作。恢復現場:執行完子程序返回主程序后,要恢復這些單元內容,通常用出棧操作。返回第六十七頁,共76頁。2.子程序設計舉例例4.3.12編程實現F=X2+Y2,設F,X,Y分別存于內部RAM的DTA,DTB,DTC單元中。例DTAEQU30HDTBEQU31HDTCEQU32H程序清單:ORG0100HSTART:MOVA,DTAACALLSQRMOVR1,A;AX;求X平方;暫存于R1第六十八頁,共76頁。MOVDTC,AMOVA,DTBACALLSQRADDA,R1SJMP$SQR:MOVDPTR,#TABMOVCA,@A+DPTRRETTAB:DB0,1,4,9,16,25,36,49,64,81ENDORG1000H;A

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論