重點第三章匯編語言程序設計_第1頁
重點第三章匯編語言程序設計_第2頁
重點第三章匯編語言程序設計_第3頁
重點第三章匯編語言程序設計_第4頁
重點第三章匯編語言程序設計_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章

MCS51系列單片機的指令系統(tǒng)及匯編程序設計

3.1匯編語言基本概念3.2匯編語言程序設計2.1匯編語言基本概念3.1.1程序設計語言3.1.2匯編語言的語句3.1.3偽指令返回本章首頁3.1.1程序設計語言 按照語言的結構及其功能可以分為三種:1.機器語言:機器語言是用二進制代碼0和1表示指令和數(shù)據(jù)的最原始的程序設計語言。2.匯編語言:在匯編語言中,指令用助記符表示,地址、操作數(shù)可用標號、符號地址及字符等形式來描述。3.高級語言:高級語言是接近于人的自然語言,面向過程而獨立于機器的通用語言。返回本節(jié)3.1.2匯編語言的語句 1.匯編語言的語句格式匯編語言源程序是由匯編語句(即指令)組成的。匯編語言一般由四部分組成。其典型的匯編語句格式如下:標號: 操作碼 操作數(shù) ;注釋

START:MOVA,30H;A←(30H)2.匯編語言的指令類型

MCS-51單片機匯編語言,包含兩類不同性質(zhì)的指令。(1)基本指令:即指令系統(tǒng)中的指令。它們都是機器能夠執(zhí)行的指令,每一條指令都有對應的機器碼。(2)偽指令:匯編時用于控制匯編的指令。它們都是機器不執(zhí)行的指令,無機器碼。返回本節(jié)MCS-51基本指令:(a)指令編碼:

MCS-51指令編碼分為單字節(jié)指令、雙字節(jié)指令、三字節(jié)指令3種形式,復雜指令系統(tǒng)CISC,共42種操作碼助記符,共111條指令。(b)指令系統(tǒng)中用到的符號:

#data:8位立即數(shù);MOVA,#3AH

#data16:16位立即數(shù);MOVDPTR,#8000H

Rn:當前內(nèi)部寄存器組R0~R7中的某個工作寄存器;MOVR1,#0FFH

返回本節(jié)MCS-51基本指令:

@Ri:

以寄存器R0和R1作為間接尋址,操作對象是外部RAM或內(nèi)部RAM00~7FH單元(51:128字節(jié),52:256字節(jié)MOV@R0,A

addr16:16位地址;用于LCALL和LJMP指令轉移范圍為64kB

addr11:11位目標地址,用于ACALL和AJMP指令。

direct:8位直接地址,內(nèi)部RAM00~7FH單元地址,或內(nèi)部RAM中的位地址。返回本節(jié)MCS-51基本指令:

bit:位地址;/bit位取反,再參與運算。不改變bit的值。

@DPTR:

以數(shù)據(jù)指針作為間接尋址,操作數(shù)在外部RAM。MOVX@DPTR,A

rel:帶符號的地址偏移量(8位),補碼形式的8位,-128~+127

$:11當前指令地址;SLMP$;SJMP$返回本節(jié)MCS-51基本指令:

A與Acc的區(qū)別

:

寫作A,是寄存器尋址;寫作Acc時是直接尋址,以內(nèi)存形式顯現(xiàn)。盡管操作對象均是CPU的累加器A,對于支持直接尋址和寄存器尋址的指令來說,如

MOV23H,AMOV23H,Acc都可用A或Acc。

對于不支持寄存器尋址的指令如PUSH、POP只能PUSHAcc;PopAcc;JNBAcc.7,NEXT3

對于不支持直接尋址的指令。如MOVX中的A就不能寫成Acc,必須嚴格區(qū)分A的寫法。返回本節(jié)MCS-51基本指令:?尋址方式:

MCS-51系列單片機CPU支持七種尋址方式:

立即尋址;直接尋址;寄存器尋址;寄存器間接尋址方式;基址寄存器加變址寄存器間接尋址(變址尋址);相對尋址;位尋址方式;返回本節(jié)MCS-51基本指令:?按功能劃分:

111條指令可歸類為如下類型:

數(shù)據(jù)傳送(29條);算術運算(24條);邏輯運算(24條);控制轉移(17條);位操作(17條);

返回本節(jié)MCS-51基本指令:1)、數(shù)據(jù)傳送:

MOV:內(nèi)部RAM與SFRMOVX:外部RAM與累加器AMOVC:程序存儲器ROMAPUSH,POP:堆棧操作

XCH,XCHD:字節(jié)交換;SWAPA:高4位與低4位交換2)、算術運算:

ADD;ADDC:加法

SUB;SUBB:減法

INC:增1;DEC:減1;MUL:乘法;DIV:除法

DA:十進制加法調(diào)正返回本節(jié)MCS-51基本指令:3)、邏輯運算:

ANL:邏輯與,共6條;

ORL:邏輯或,共6條;

XRL:邏輯異或,共6條;

CPL:邏輯非(取反),共1條;

CLR:A清零,共1條;

RL;RLC;RR;RRC:循環(huán)移位,共4條;4)、控制運算:跳轉指令(4條):AJMP,LJMP,SIMP,JMP返回本節(jié)MCS-51基本指令:4)、控制運算:跳轉指令(4條):AJMP,LJMP,SIMP,JMP

調(diào)用指令(2條):ACALL,LCALL

返回指令(2條):RET,RETI

條件跳轉指令:JZ,JNZ;JC,JNC;JB,JNB,JBC;CJNE;DJNZ;5)空操作指令:

NOP返回本節(jié)MCS-51基本指令:6)、位操作指令:

位傳送指(2條):MOVC,bitMOVbit,C

位控制指令(6條):CLRC,SETBC;

CLRbit;SETBbit;CPLC;CPLbit

位邏輯運算指令(4條):ANLc,bit;ANLc,/bit;ORLc,bit;ORLc,/bit

位轉移指令:JBbit,rel;JNB

bit,rel;JBCbit,rel

返回本節(jié)3.1.3偽指令 1.ORG:匯編起始地址用來說明以下程序段在存儲器中存放的起始地址。例如程序: ORG 1000H START: MOV A,#20H MOV B,#30H┇2.EQU:賦值給變量標號賦予一個確定的數(shù)值。3.DATA,XDATA:數(shù)據(jù)賦值,地址賦值。4.DB:定義數(shù)據(jù)字節(jié)把數(shù)據(jù)以字節(jié)數(shù)的形式存放在存儲器單元中。

5.DW:定義數(shù)據(jù)字按字的形式把數(shù)據(jù)存放在存儲單元中。

6.DS:定義存儲區(qū)從指定的地址單元開始,保留一定數(shù)量存儲單元。

7.BIT:位定義確定字符名為確定的位地址值。

8.END:匯編結束返回本節(jié)3.2匯編語言程序設計3.2.1匯編語言程序結構及設計步驟3.2.2順序程序3.2.3分支程序3.2.4循環(huán)程序3.2.5子程序3.2.6位操作程序

3.2.7匯編語言程序設計基本要求

返回本章首頁3.2.1.1匯編語言程序設計步驟1.分析問題2.確定算法3.設計程序流程圖4.分配內(nèi)存單元5.編寫匯編語言源程序6.調(diào)試程序返回本節(jié)3.2.1.2匯編語言程序結構1.程序頭(即定義變量和等值符號)2.主程序3.子程序結構4.中斷服務程序。返回本節(jié)3.2.1.2匯編語言程序結構1.程序頭(即定義變量和等值符號)

SCLBITP1.2;定義SCL位變量

SDABITP1.3;定義SDA位變量

ByteConDATA30H;定義字節(jié)變量ByteConORGnnnn;CPU復位后的第一個機器碼存放單元地址。具體值由CPU類型決定。

LJMPMain;一般第一條指令是跳轉指令。跳到主程序入口。Main為主程序入口地址標號。

LJMPSINT1;跳轉到中斷服務程序入口。返回本節(jié)3.2.1.2匯編語言程序結構2.主程序

ORGyyyy;其中yyyy就是主程序代碼存放區(qū)的首地址。Main:MOVSP,#5FH;初始化有關寄存器。如設置堆棧指針SP、選擇工作寄存器組、初始化中斷控制寄存器等。

LCALLSUB1;調(diào)用子程序SUB1。返回本節(jié)3.2.1.2匯編語言程序結構3.子程序

ORGzzzz;其中zzzz就是子程序代碼存放區(qū)的首地址??梢圆挥肙RG指令,直接將子程序存放在主程序后。SUB1:PUSHPSWPUSHAcc;保護現(xiàn)場

……POPAccPOPPSW;恢復現(xiàn)場

RET返回本節(jié)3.2.1.2匯編語言程序結構4.中斷服務程序

ORGzzzz;其中zzzz就是中斷程序代碼存放區(qū)的首地址。SINT1:PUSHPSWPUSHAcc;保護現(xiàn)場

……POPAccPOPPSW;恢復現(xiàn)場

RETI返回本節(jié)3.2.2順序程序 順序程序是一種最簡單,最基本的程序。特點:程序按編寫的順序依次往下執(zhí)行每一條指令,直到最后一條?!纠?.1】將30H單元內(nèi)的兩位BCD碼拆開并轉換成ASCII碼,存入RAM兩個單元中。程序流程如圖3-1所示。參考程序如下:

ORG 2000HMOV A,30H ;取值

ANL A,#0FH ;取低4位ADD A,#30H ;轉換成ASCII碼MOV 32H,A ;保存結果MOV A,30H ;取值SWAP A ;高4位與低4位互換ANL A,#0FH ;取低4位(原來的高4位)ADD A,#30H ;轉換成ASCII碼MOV 31H,A ;保存結果SJMP $END結束取數(shù)據(jù)低4位轉換成ASCII碼存ASCII碼取數(shù)據(jù)高4位轉換成ASCII碼存ASCII碼開始圖3-1拆字程序流程圖【例3.2】設X、Y兩個小于10的整數(shù)分別存于片內(nèi)30H、31H單元,試求兩數(shù)的平方和并將結果存于32H單元。解:兩數(shù)均小于10,故兩數(shù)的平方和小于200,可利用乘法指令求平方。程序流程如圖2-2所示。參考程序如下:

ORG 2000HMOV A,30H ;取30H單元數(shù)據(jù)

MOV B,A ;將X送入B寄存器MUL AB ;求X2,結果在累加器中MOV R1,A ;將結果暫存于R1寄存器中MOV A,31H ;取31H單元數(shù)據(jù)MOV B,A ;將Y送入B寄存器MUL AB ;求Y2,結果在累加器中ADD A,R1 ;求X2+Y2MOV 32H,A ;保存數(shù)據(jù)SJMP $ ;暫停END結束取數(shù)據(jù)X求X2暫存X2取數(shù)據(jù)Y求Y2求X2+Y2開始保存平方和圖3-2例3.2程序流程圖3.2.3分支程序 1.分支程序的基本形式分支程序有三種基本形式,如圖3-3所示。分支程序的設計要點如下:(1)先建立可供條件轉移指令測試的條件。(2)選用合適的條件轉移指令。(3)在轉移的目的地址處設定標號。條件滿足?AYN(a)條件滿足?ABNY(b)(c)A0A1AnK=0K=1…K=nK=?……圖3-3分支程序結構流程圖2.雙向分支程序設計舉例【例3.3】設X存在30H單元中,根據(jù)下式

X+2 X>0Y= 100 X=0求出Y值,將Y值存入31H單元。∣X∣ X<0解:根據(jù)數(shù)據(jù)的符號位判別該數(shù)的正負,若最高位為0,再判別該數(shù)是否為0。程序流程如圖3-4所示。

參考程序如下:ORG 1000H

MOV A,30H ;取數(shù)

JB ACC.7,NEG;負數(shù),轉NEGJZ ZER0 ;為零,轉ZER0ADD A,#02H ;為正數(shù),求X+2AJMPSAVE ;轉到SAVE,保存數(shù)據(jù)ZER0:MOVA,#64H ;數(shù)據(jù)為零,Y=100AJMPSAVE ;轉到SAVE,保存數(shù)據(jù)NEG:DECA;

CPL A;求∣X∣SAVE:MOV31H,A ;保存數(shù)據(jù)

SJMP $ ;暫停A為負數(shù)?取數(shù),A←(30H)開始結束A=0?YNNA←|X|A←64HA←X+2存數(shù),(31H)←A(30H)圖3-4例3.3程序流程圖3.多向分支程序設計舉例

利用JMP@A+DPTR指令可以實現(xiàn)256分支,為菜單程序設計提供的方便?!纠?.4】

根據(jù)R0的值轉向7個分支程序。R0<10,轉向SUB0;R0<20,轉向SUB1;

R0<60,轉向SUB5;R060,轉向SUB6;解:利用JMP@A+DPTR指令直接給PC賦值,使程序?qū)崿F(xiàn)轉移。程序流程如圖3-5所示。參考程序如下:

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

MOVA,R0 ;取數(shù)

MOV B,#10…… DIV AB;A/10,商在A中

CLR C RLCA ;A←2A JMP@A+DPTR ;PC←A+DPTRTAB: AJMP SUB0 ;轉移指令表

AJMPSUB1AJMP SUB2 AJMPSUB5AJMP SUB6K=?轉SUB0轉SUB1轉SUB6K=0K=1……K=6開始圖3-5多向分支程序流程圖返回本節(jié)【例3.5】

假設某菜單有9項。試編寫一程序段,根據(jù)輸入數(shù)碼轉去執(zhí)行相應的子程序,即輸入“1”,執(zhí)行子程序1;輸入“2”,執(zhí)行子程序2;依次類推,輸入“9”,執(zhí)行子程序9。解:利用JMP@A+DPTR指令直接給PC賦值,使程序?qū)崿F(xiàn)轉移。參考程序如下:

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

MOVA,KEYMA;鍵盤輸入緩沖區(qū)內(nèi)容送到ADECA;由于輸入數(shù)碼1~9,因此需要減1 MOV B,#03HMULAB;A*3A

JMP@A+DPTR ;PC←A+DPTRORG2000HTAB: LJMP SUB0 ;轉移指令表

LJMPSUB1LJMP SUB2 LJMPSUB5LJMP SUB6 LJMPSUB7LJMP SUB8LJMPSUB93.2.4循環(huán)程序 1.循環(huán)程序的結構(如圖3-6所示)☆循環(huán)程序一般包括如下四個部分:(1)初始化(2)循環(huán)體(3)循環(huán)控制(4)結束☆循環(huán)程序按結構形式,有單重循環(huán)與多重循環(huán)?!钤诙嘀匮h(huán)中,只允許外重循環(huán)嵌套內(nèi)重循環(huán)?!畈辉试S循環(huán)相互交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部(如圖3-7所示)。(a)當型循環(huán)結構(b)直到型循環(huán)結構循環(huán)結束?循環(huán)體YN初始化修改循環(huán)參數(shù)結束部分開始結束循環(huán)結束?循環(huán)體Y初始化修改循環(huán)參數(shù)結束部分開始N結束圖3-6循環(huán)結構程序流程圖外循環(huán)中循環(huán)內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)內(nèi)循環(huán)(a)嵌套正確(b)嵌套正確(c)交叉不正確圖3-7多重循環(huán)示意圖2.循環(huán)程序設計舉例【例3.6】有一數(shù)據(jù)塊從片內(nèi)RAM的30H單元開始存入,設數(shù)據(jù)塊長度為10個單元。根據(jù)下式:

X+2 X>0Y=100X=0求出Y值,并將Y值放回原處。

∣X∣X<0解:設置一個計數(shù)器控制循環(huán)次數(shù),每處理完一個數(shù)據(jù),計數(shù)器減1。程序流程如圖3-8所示。參考源程序如下:

ORG 2000H MOV R0,#10MOV R1,#30HSTART: MOV A,@R1 ;取數(shù)

JB ACC.7,NEG;若為負數(shù),轉NEG JZ ZER0 ;若為零,轉ZER0 ADD A,#02H ;若為正數(shù),求X+2 AJMP SAVE ;轉到SAVE,保存數(shù)據(jù)

ZER0:MOVA,#64H ;數(shù)據(jù)為零,Y=100

AJMP SAVE ;轉到SAVE,保存數(shù)據(jù)NEG:DEC A CPL A ;求∣X∣SAVE:MOV @R1,A ;保存數(shù)據(jù)

INC R1 ;地址指針指向下一個地址

DJNZ R0,START;數(shù)據(jù)未處理完,繼續(xù)處理

SJMP$;暫停A=0?YYNNYNA為負數(shù)?取數(shù),A←((R1))開始結束A←∣X∣A←64HA←X+2存數(shù),((R1))←A(30H)設置地址指針R1、計數(shù)器R0初值R1←R1+1;R0←R0-1R0=0?圖3-8例3.6的程序流程圖返回本節(jié)3.2.5子程序

1.子程序概念所謂調(diào)用子程序,暫時中斷主程序的執(zhí)行,而轉到子程序的入口地址去執(zhí)行子程序。如圖3-10所示。調(diào)用子程序應注意:(1)子程序占用的存儲單元和寄存器。(2)參數(shù)的傳遞。(3)子程序經(jīng)過調(diào)用后得到的數(shù)據(jù)來完成程序之間的參數(shù)傳遞。

(4)嵌套調(diào)用與遞歸調(diào)用。如圖3-11所示。RETLCALLSUB圖3-10子程序的調(diào)用與返回LCALLARETRETLCALLB圖3-11子程序的嵌套調(diào)用與返回2.子程序設計舉例【例3.8】將3.4節(jié)中的例3.6改為子程序結構。解:數(shù)據(jù)塊中的十個數(shù)都需要進行符號判斷并作相應處理,可把一部分工作交給子程序完成,主程序只負責讀取數(shù)據(jù)、調(diào)用判斷處理子程序、保存數(shù)據(jù)、循環(huán)控制工作。源程序如下:

ORG 1000H MOV R0,#10 MOV R1,#30HSTART:MOV A,@R1 ;取數(shù)

ACALLDISPOSE;調(diào)用判斷、處理子程序SAVE:MOV @R1,A ;保存數(shù)據(jù)

INC R1;修改地址指針,指向下一個地址

DJNZR0,START ;數(shù)據(jù)未處理完,繼續(xù)處理

SJMP$ ;暫停

ORG 0200HDISPOSE:JBACC.7,NEG;若為負數(shù),轉NEG

JZ ZER0 ;若為零,轉ZER0 ADD A,#02H ;若為正數(shù),求X+2 AJMP BACK ;轉到SAVE,保存數(shù)據(jù)ZER0:MOV A,#64H ;數(shù)據(jù)為零,Y=100 AJMP BACK ;轉到SAVE,保存數(shù)據(jù)NEG:DEC A CPL A ;求∣X∣BACK:RET返回本節(jié)2.2.6位操作程序 【例3.9】編寫一程序,實現(xiàn)圖3-12中的邏輯運算電路。其中P3.1、P1.1、P1.0分別是單片機端口線上的信息,RS0、RS1是PSW寄存器中的兩個標志位,30H、31H是兩個位地址,運算結果由P1.0輸出。程序如下:

ORG 1000HMOV C,P3.1ANL C,P1.1CPL CMOV 20H,C ;暫存數(shù)據(jù)MOV C,30HORL C,/31HANL C,RS1ANL C,20HANL C,RS0MOV P1.0,C ;輸出結果SJMP $P3.1P1.130H31HRS1RS0&≥1&&P1.0圖3-12硬件邏輯硬件電路圖返回本節(jié)3.2.7匯編語言程序設計基本要求1.正確性2.可靠性3.可讀性4.

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論