《單片機系統(tǒng)設計及工程應用》課件第3章_第1頁
《單片機系統(tǒng)設計及工程應用》課件第3章_第2頁
《單片機系統(tǒng)設計及工程應用》課件第3章_第3頁
《單片機系統(tǒng)設計及工程應用》課件第3章_第4頁
《單片機系統(tǒng)設計及工程應用》課件第3章_第5頁
已閱讀5頁,還剩210頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.151系列單片機指令系統(tǒng)概述3.251系列單片機尋址方式3.3指令系統(tǒng)3.4常用偽指令3.5程序設計技術習題33.1.151系列單片機指令特點及分類

51單片機的指令系統(tǒng)具有功能強、指令短、執(zhí)行速度快等特點。其指令系統(tǒng)共有111條指令,從功能上可劃分成5大類指令:數(shù)據(jù)傳送指令、算術運算指令、邏輯運算指令、位操作指令和程序轉移指令,如圖3.1所示。若按指令長度分類,則可分為單字節(jié)指令(49條)、雙字節(jié)指令(46條)和三字節(jié)指令(16條)。若按指令的執(zhí)行時間分類,則可分為單機器周期指令(64條)、雙機器周期指令(45條)和4機器周期的指令,4

機器周期的指令只有乘、除法兩條。3.151系列單片機指令系統(tǒng)概述圖3.1MCS-51系列單片機指令功能分類3.1.251系列單片機匯編語言指令格式

指令的描述形式有3種:機器語言、匯編語言和高級語言。用機器語言編寫的程序稱為目標程序,計算機能夠直接識別并執(zhí)行的只有機器語言。采用匯編語言編寫的程序稱為匯編語言程序。匯編語言程序不能被計算機直接識別并執(zhí)行,必須經(jīng)過一個中間環(huán)節(jié)把它翻譯成機器語言程序,這個中間翻譯過程叫做匯編。匯編有兩種方法:機器匯編和手工匯編。機器匯編是用專門的匯編程序在計算機上進行翻譯;手工匯編是編程員把匯編語言指令逐條翻譯成機器指令。由于單片機開發(fā)是在計算機和開發(fā)系統(tǒng)的基礎上進行的,因此,主要采用機器匯編,使用十分方便。而高級語言程序設計在單片機系統(tǒng)中應用也十分普遍,大多數(shù)單片機開發(fā)系統(tǒng)均支持使用C語言等多種高級語言,使得編程更加輕松。在描述計算機指令系統(tǒng)及實際應用中主要采用匯編語言形式,51單片機匯編語言指令格式如下:

[標號:]操作碼[目的操作數(shù)][,源操作數(shù)][;注釋]

例如,LOOP1:ADDA,#10H;(A)←(A)+10H

(1)方括號[]表示該項是可選項,根據(jù)需要選擇,可有可無。

(2)標號是用戶設定的符號,它代表該指令所在的地址。標號必須以字母開頭,其后跟1~8個字母或數(shù)字,并以“:”結尾。

(3)操作碼是用英文縮寫的指令功能助記符。它確定了本條指令完成什么樣的操作功能。任何一條指令都必須有該助記符項,不得省略,如ADD表示加法操作。

(4)目的操作數(shù)給出操作的對象,并給出一個目標地址,該目標地址就是操作結果應存放的單元地址,它與操作碼之間必須以一個或幾個空格分隔。

如上例中,A表示操作對象是累加器A的內容,并指出操作結果又回送A中存放。

(5)源操作數(shù)指出的是一個源地址(或立即數(shù)),表示操作的對象或操作數(shù)的來源。它與目的操作數(shù)之間要用“,”號隔開。

(6)注釋部分是在編寫程序時,為了增加程序的可讀性,由用戶擬寫對該條指令或該段程序功能的說明。它以分號“;”開頭,可以用中文、英文或某些符號來表示,計

算機對注釋部分不進行編譯,只在源程序中起說明作用。為了描述方便,在介紹指令系統(tǒng)之前,先對描述指令的一些符號意義進行一些簡單約定:

(1)Ri和Rn:R表示當前工作寄存器區(qū)中的工作寄存器,i表示0或1,即R0或R1。

n表示0~7,即R0~R7,當前工作寄存器的選定是由PSW的RS1和RS0位決定的。

(2)#data:#表示立即數(shù)符號,data為8位立即數(shù)。#data是指包含在指令中的8位立即數(shù)。

(3)#data16:包含在指令中的16位立即數(shù)。

(4)rel:相對地址,以8位補碼形式表示的地址偏移量,范圍為-128~+127,主要用于無條件相對短轉移指令SJMP和所有的條件相對轉移指令中。

(5)addr16:16位目的地址。目的地址可在全部程序存儲器的64KB空間范圍內,主要用于無條件長轉移指令LJMP和子程序長調用指令LCALL中。

(6)addr11:11位目的地址。目的地址應與下條指令處于相同的2KB程序存儲器地址空間范圍內,主要用于絕對轉移指令AJMP和子程序絕對調用指令ACALL指令中。

(7)direct:表示直接尋址的地址,即8位內部數(shù)據(jù)存儲器RAM的單元地址(0~127/255),或特殊功能寄存器SFR的地址。對于特殊功能寄存器SFR可直接用寄存器名稱來代替其直接地址。

(8)bit:內部數(shù)據(jù)存儲器RAM和特殊功能寄存器SFR中的可直接尋址的位地址。

(9)@:間接尋扯寄存器或基地址寄存器的前綴,如@Ri,@DPTR,表示寄存器間接尋址。

(10)(X):表示X地址中的內容。

(11)((X)):表示由X尋址的單元中的內容(X)作地址時該地址的內容。

(12)/和→符號:/表示對該位操作數(shù)取反后參與運算,但不影響該位的值?!硎局噶畈僮髁鞒?,將箭頭一方的內容送入箭頭另一方的單元中去。3.1.3指令長度和指令周期

1.指令長度

指令長度是指指令的機器代碼所占存儲單元的字節(jié)數(shù)。為了節(jié)省程序存儲器的空間,MCS-51單片機采用變長的指令方式。從指令代碼的結構來看,每條指令通常由操作碼和操作數(shù)兩部分組成。操作碼表示計算機執(zhí)行該指令將進行何種操作,操作數(shù)表示參與操作的數(shù)據(jù)本身或操作數(shù)所在的地址。根據(jù)指令中操作數(shù)的多少,51單片機的指令可分為無操作數(shù)指令、單操作數(shù)指令和雙操作數(shù)指令3種情況。按指令長度可分為3種類型的指令:單字節(jié)指令、雙字節(jié)指令和三字節(jié)指令。在圖3.2中給出了幾種典型指令的機器碼結構,其他指令的機器碼參見附錄B。圖3.2指令的機器碼

2.指令周期

指令周期是指CPU執(zhí)行一條指令所花費的時間。由于執(zhí)行不同的指令所需要的時間不同,因此通常是以指令消耗的機器周期數(shù)為單位來確定指令周期。51系統(tǒng)中,一個指令周期通常含1~4個機器周期,大多數(shù)指令是單字節(jié)、單機器周期指令,還有一些指令是單字節(jié)、雙周期指令和雙字節(jié)、雙周期指令,而乘法指令MUL和除法指令DIV都是單字節(jié)四周期指令。

注意:指令的字節(jié)數(shù)越多,其機器代碼所占的存儲單元就越多。若指令周期中包含的機器周期數(shù)越多,則表明指令所需的執(zhí)行時間就越長。但指令周期并不與指令的字節(jié)數(shù)成比例,如乘除法指令,雖然都是單字指令,但執(zhí)行時間最長,需要4個機器周期。指令獲得操作數(shù)所在的地址或轉移地址的方式稱為尋址方式。指令通常由操作碼和操作數(shù)組成,而操作數(shù)又有目的操作數(shù)和源操作數(shù)之分,它們指出了參與運算的數(shù)或該

數(shù)所在的單元地址。為了描述方便,對于有目的操作數(shù)和源操作數(shù)的雙操作數(shù)指令,在無特別聲明的情況下,某條指令的尋址方式一般是指源操作數(shù)的尋址方式。

尋址方式的多少是計算機功能強弱的重要標志之一。51系列單片機有7種尋址方式,分別為:立即尋址、寄存器尋址、直接尋址、寄存器間接尋址、變址尋址、相對尋

址和位尋址。3.251系列單片機尋址方式3.2.1立即尋址

立即尋址是指CPU能夠立即得到操作數(shù)的一種尋址方式,它只適應對源操作進行尋址。在立即尋址方式中,源操作數(shù)直接出現(xiàn)在指令中,跟在操作碼的后面,作為指令的

一部分與操作碼一起存放在程序存儲器內,CPU可以立即得到源操作數(shù)并執(zhí)行,不需要另在寄存器或存儲器中尋找和讀取操作數(shù),故稱為立即尋址。立即尋址中,該操作數(shù)稱為

立即數(shù),并在其前冠以“#”號作前綴,表示并非地址。當立即數(shù)以十六進制數(shù)據(jù)表示時,應以H為后綴,當數(shù)據(jù)以A~F開頭時必須加前導0。十進制數(shù)據(jù)可不帶后綴。立即數(shù)長度可以是8位或16位。3.2.2寄存器尋址

將操作數(shù)存放于某寄存器中,CPU執(zhí)行指令時從寄存器中讀取操作數(shù),以完成指令規(guī)定的操作,稱為寄存器尋址。

例如:

MOVA,R0;(A)←(R0)

該指令的功能是把工作寄存器R0中的內容傳送到累加器A中,如R0內容為88H,則執(zhí)行該指令后A的內容也為88H。在該指令中,源操作數(shù)是由工作寄存器R0取得的,故該指令的尋址方式稱為寄存器尋址方式。實際上該指令中目的操作數(shù)的尋址方式也是寄存器尋址方式。用寄存器尋址方式可以訪問工作寄存器R0~R7,也可把特殊功能寄存器A、B、DPTR和CY(CY稱為布爾處理機的累加器)作為尋址的對象,如MOVDPTR,#1234H;SETBC

等。3.2.3直接尋址

指令中直接給出操作數(shù)所在的存儲單元的地址,供指令讀取數(shù)據(jù)或存儲數(shù)據(jù),把這種尋址方式稱為直接尋址。例如:

MOVA,60H;(A)←(60H)

該指令的功能是把內部數(shù)據(jù)存儲器60H單元內的內容送到累加器A中。指令直接給出了源操作數(shù)的地址60H,其機器碼為E5H60H,源操作數(shù)屬于直接尋址方式。例如:

MOV30H,#12H;(30H)←12H

該指令的功能是把立即數(shù)#12H送到片內RAM的30H單元。指令直接給出目的操作數(shù)的地址30H,目的源操作數(shù)屬于直接尋址方式,源操作數(shù)屬于立即尋址方式。

(1)51系列單片機的直接尋址用于訪問內部RAM的低128個單元。在指令中直接給出單元地址,地址范圍為00H~7FH。

(2)直接尋址用于訪問高128個單元(80H~FFH)的特殊功能寄存器SFR。訪問SFR時,可在指令中直接給出特殊功能寄存器SFR的地址,但為了增強程序的可讀性,一般

都用寄存器名稱來代替其地址。例如:

MOVP1,#35H;

目的操作數(shù)P1代表其口地址90H,目的操作數(shù)屬于直接尋址方式。其實,該指令也可寫成MOV90H,#35H;但可讀性差,一般不用此種寫法。

(3)直接尋址還可直接訪問片內位地址空間。例如:

MOVC,P1.0

MOV20H,C

(4)直接尋址訪問程序存儲器的指令有:長轉移LJMPaddr16與絕對轉移AJMPaddr11指令、長調用LCALLaddr16與絕對調用ACALLaddr11指令。它們都直接給出

了程序存儲器的16位地址(尋址范圍覆蓋64KB)或11位地址(尋址范圍覆蓋2KB)。

注意:①注意區(qū)別立即尋址和直接尋址的書寫方法。例如:

MOVR0,#30H;立即尋址

MOVR1,30H;直接尋址,訪問片內RAM的30H單元

MOVR2,80H;直接尋址,訪問SFR中的P0端口②A累加器有3種表示方法,即A、ACC和A累加器地址E0H。使用這3種表示方法時,對尋址方式的稱呼雖然可能不同,但指令的執(zhí)行結果完全一樣。例如:

INCA;寄存器尋址方式

INCACC;寄存器尋址方式

INC0E0H;直接尋址方式③由于特殊功能寄存器SFR占用片內RAM80H~FFH間的地址,對于51子系列,片內RAM只有128個單元,它與SFR的地址沒有重疊;而對于52子系列,片內RAM有256個單元,其高128個單元與SFR的地址是重疊的。為避免混淆,規(guī)定:直接尋址的指令不能訪問片內RAM的高128個單元(80H~FFH),若要訪問這些單元只能用寄存器間接尋址指令,而要訪問SFR只能用直接尋址的指令。3.2.4寄存器間接尋址

在指令中指定某一個寄存器的內容作為操作數(shù)的地址,而該地址指定單元中的內容便是操作數(shù)。這種尋址方法稱為寄存器間接尋址方式,簡稱寄存器間址,也稱為間接尋

址方式。通常將用來存放操作數(shù)地址的寄存器稱為指針。

MCS-51中,用于間接尋址的寄存器有R0、R1、數(shù)據(jù)指針寄存器DPTR和堆棧指針SP。

用R0、R1或DPTR作為地址指針寄存器時,應在寄存器符號前加前綴“@”,用于表示間接尋址。

(1)用R0和R1作為地址指針來尋址片內數(shù)據(jù)存儲器RAM(00H~FFH)中的256個單元。例如:

MOVA,@R0;(A)←((R0))

該指令的功能是將R0所指示的片內RAM單元中的數(shù)據(jù)傳送到累加器A中去。例如,若R0的內容為30H,片內RAM30H單元中的內容是0FH,則執(zhí)行該指令后,片內RAM30H

單元的內容0FH被送到累加器A中,如圖3.3(a)所示。圖3.3寄存器間接尋址(a)MOVA,@R0;(b)MOVA,@DPTR

(2)用MOVX指令和R0、R1訪問片外數(shù)據(jù)存儲器(片外RAM)的00H~0FFH單元。用MOVX指令和DPTR訪問片外RAM的64KB空間。

例如,設(DPTR)=2000H,則MOVXA,@DPTR執(zhí)行過程如圖3.3(b)所示。

(3)堆棧操作指令也是間接尋址方式,它以SP為指針

注意:寄存器間接尋址不能訪問特殊功能寄存器SFR。3.2.5變址尋址

變址尋址是將基址寄存器與變址寄存器的內容相加,其結果作為操作數(shù)地址的一種尋址方式。它以數(shù)據(jù)指針DPTR或程序計數(shù)器PC作為基址寄存器,累加器A作為變址寄

存器,兩者的內容相加形成16位的程序存儲器地址,該地址就是操作數(shù)所在地址。例如:

MOVCA,@A+DPTR;(A)←((A)+(DPTR))

設該指令執(zhí)行之前,(A)=05H,(DPTR)=2000H,(2005H)=35H。執(zhí)行時,將(A)+(DPTR)的值2005H作為地址,把程序存儲器2005H單元的數(shù)據(jù)35H傳送到累加器A中,如圖3.4所示。圖3.4變址尋址

注意:①這種變址尋址方式用于對程序存儲器的尋址,只有3條變址尋址指令:

MOVCA,@A+DPTR

MOVCA,@A+PC

JMP@A+DPTR

②主要用于訪問程序存儲器中的數(shù)據(jù)表格,或實現(xiàn)程序的轉移。3.2.6相對尋址

相對尋址是以當前程序計數(shù)器PC的值加上指令規(guī)定的偏移量rel構成實際操作數(shù)地址的尋址方法。相對尋址用來訪問程序存儲器,常用于相對轉移指令中。

使用相對尋址時要注意以下兩點:

(1)當前PC值是指相對轉移指令所在地址(一般稱為源地址)加上轉移指令的字節(jié)數(shù)。即

當前PC值=源地址+轉移指令字節(jié)數(shù)

例如,JZrel是一條累加器A為零轉移的雙字節(jié)指令。若該指令地址(源地址)為5000H,則執(zhí)行該指令時的當前PC值即為5002H。

(2)偏移量rel是有符號的單字節(jié)數(shù),以補碼表示,其相對值的范圍為-128~+127,負數(shù)表示從當前地址向前轉移,正數(shù)表示從當前地址向后轉移。所以,相對轉移指令滿

足轉移條件后,轉移的地址(目的地址)應為

目的地址=當前PC值+rel=源地址+轉移指令字節(jié)數(shù)+rel3.2.7位尋址

位尋址是指令中可以直接給出位地址,CPU按位進行訪問的一種尋址方式。位尋址方式可以對內部數(shù)據(jù)存儲器RAM20H~2FH中的128位和特殊寄存器SFR中的可尋址位進

行位尋址,位操作指令可對位尋址空間和相關端口的每一位進行傳送及邏輯操作。

例如:

SETBP1.0;(P1.0)←1

該指令的功能是將P1端口的第0位置1。

綜上所述,在51系列單片機的存儲空間中,指令究竟對哪個存儲器空間進行操作是由指令操作碼和尋址方式確定的。7種尋址方式及適用空間見表3.1。表3.17種尋址方式及適用空間3.3.1數(shù)據(jù)傳送指令

在51系列單片機指令系統(tǒng)中,有以下幾種數(shù)據(jù)傳送指令:(1)內部RAM與特殊功能寄存器之間的數(shù)據(jù)傳送,這類指令使用“MOV”作為指令操作碼的助記符。

(2)外部RAM與累加器A之間的數(shù)據(jù)傳送,這類指令使用“MOVX”作為指令操作碼的助記符。3.3指令系統(tǒng)

(3)將程序存儲器ROM中某一單元的信息傳送到累加器A中的指令,這類指令使用“MOVC”作為指令操作碼的助記符。

(4)堆棧操作指令,分別使用PUSH和POP指令。

(5)字節(jié)交換指令,指令助記符為XCH、XCHD、SWAP等幾類。

1.內部RAM與特殊功能寄存器之間的數(shù)據(jù)傳送

內部RAM與特殊功能寄存器之間的數(shù)據(jù)傳送指令使用“MOV”作為指令操作碼的助記符,指令格式如下:

MOV目的操作數(shù),源操作數(shù);目的操作數(shù)←源操作數(shù)指令的功能是:把源操作數(shù)的內容送入目的操作數(shù)。

例如,MOVA,R7,該指令執(zhí)行時將工作寄存器R7中的內容送入累加器A中。MOV指令用于單片機內部的數(shù)據(jù)傳送,主要指A、Rn、片內RAM、SFR間的數(shù)據(jù)傳送。圖3.5

給出了MOV指令的數(shù)據(jù)傳送方向示意圖。圖3.5MOV指令數(shù)據(jù)傳送方向示意圖

(1)以累加器A為目的操作數(shù)的指令。

MOVA,#data;(A)←#data,#data表示8位立即數(shù)

MOVA,direct;(A)←(direct),direct表示8位直接尋址的

;地址直接地址00H~7FH,訪問片內RAM;直接地址80H~FFH,訪問SFR

MOVA,Rn;(A)←(Rn),n=0~7,Rn表示R0~R7

MOVA,@Ri;(A)←((Ri)),Ri表示R0和R1,@Ri一定訪

;問片內RAM

(2)以Rn為目的操作數(shù)的指令。

MOVRn,#data;(Rn)←#data

MOVRn,A;(Rn)←(A)

MOVRn,direct;(Rn)←(direct)

;00H~7FH訪問片內RAM,80H~FFH訪問SFR

這組指令的功能是:把源操作數(shù)的內容送入當前工作寄存器區(qū)的R0~R7中的某一寄存器。例如:MOVR0,30H;將片內RAM30H單元中的數(shù)據(jù)傳送至工作寄存器R0。

(3)以direct為目的操作數(shù)的指令。

MOVdirect,A ;如MOV40H,A

MOVdirect,Rn ;如MOVP1,R3

MOVdirect,direct ;如MOV30H,31H

MOVdirect,#data;如MOVP1,#0FH

MOVdirect,@Ri ;如MOV60H,@R0

MOVDPTR,#data16;如MOVDPTR,#1234H這組指令的功能為:把源操作數(shù)的內容送入內部RAM單元或特殊功能寄存器。其中,MOVdirect,direct指令和MOVDPTR,#data16指令都是三字節(jié)指令。而直接地址間數(shù)傳指令的功能很強,能實現(xiàn)內部RAM之間、特殊功能寄存器之間或特殊功能寄存器與內部RAM之間的直接數(shù)據(jù)傳送。最后一條指令是將16位的立即數(shù)送入數(shù)據(jù)指針寄存器DPTR。

(4)以@Ri為目的操作數(shù)的指令。

MOV@Ri,A;如MOV@R0,A

MOV@Ri,direct;如MOV@R0,30H

MOV@Ri,#data;如MOV@R0,#30H

注意:

MOV指令用于單片機內部的數(shù)據(jù)傳送,在圖3.5中,虛線表示的數(shù)據(jù)傳送是以@Ri間接尋址方式進行的,在此種指令中,不允許目的操作數(shù)和源操作數(shù)同時為間接尋址方式。另外,Rn之間不允許相互傳送數(shù)據(jù)。例如,下列各指令都是非法指令格式:

MOVRn,Rn;非法指令格式

MOV@Ri,@Ri;非法指令格式

MOVRn,@Ri;非法指令格式

MOV@Ri,Rn;非法指令格式例3.3.1

分析下列指令,判斷其指令格式是否正確。

(1)MOVA,P1;正確

(2)MOV30H,P1;正確,目的操作數(shù)為片內RAM,源操作數(shù)為SFR

(3)MOVP0,P1;正確,源操作數(shù)和目的操作數(shù)均為SFR

(4)MOV50H,60H;正確,源操作數(shù)和目操作數(shù)均為片內RAM

(5)MOV30H,#25H;正確(6)MOV30H,@R0;正確,@R0一定為片內RAM

(7)MOVR0,R1;非法指令

(8)MOV@R0,P1;正確,@R0一定為片內RAM

(9)MOV@R0,A;正確,@R0一定為片內RAM

(10)MOV@R0,@R1;非法指令

(11)MOVR3,@R0;非法指令這組指令的功能為:在累加器A與外部數(shù)據(jù)存儲器RAM單元或I/O端口之間進行數(shù)據(jù)傳送,前兩條指令執(zhí)行時,P3.7(信號)引腳上輸出有效信號,作為外部數(shù)

據(jù)存儲器的讀選通信號;后兩條指令執(zhí)行時,在P3.6(信號)引腳上輸出有效信號,用作外部數(shù)據(jù)存儲器的寫選通信號。

例3.3.2

把外部RAM3000H單元的數(shù)據(jù)傳送到2000H單元中(片外兩單元之間的數(shù)據(jù)傳送)。

解因為沒有片外兩存儲單元之間直接傳送數(shù)據(jù)的指令,只能通過累加器A進行中轉才能完成把3000H單元中的數(shù)據(jù)傳送到2000H單元中。參考程序如下:

MOVDPTR,#3000H;設置源數(shù)據(jù)指針,

;DPTR←3000H單元地址

MOVXA,@DPTR;A←(3000H)

MOVDPTR,#2000H;設置目的數(shù)據(jù)指針,

;DPTR←2000H單元地址

MOVX@DPTR,A;(2000H)←A

例3.3.3

把從60H單元開始的外部RAM中的16個字節(jié)數(shù)據(jù)依次傳送到以30H開始的內部RAM區(qū)域中(片外與片內的數(shù)據(jù)塊傳送)。

解對于片外RAM與片內RAM間的數(shù)據(jù)傳送,也只能通過累加器A進行傳送。參考程序如下:

MOVR0,#30H;R0為目的數(shù)據(jù)地址指針

MOVR7,#16;R7為計數(shù)器

MOVR1,#60H;R1為源數(shù)據(jù)地址指針

NEXT:MOVXA,@R1

MOV@R0,A

INCR1

INCR0

DJNZR7,NEXT

例3.3.4

將外部RAM2000H~2020H單元的數(shù)據(jù)傳送到以3000H為首址的外部RAM中。

解在外部RAM之間進行批量數(shù)據(jù)傳送時,可先將外部RAM數(shù)據(jù)傳送到內部RAM中,然后再傳送到外部RAM目標地址。參考程序如下:

;先將外部RAM數(shù)據(jù)傳送到內部RAM30H~50H中

MOVR0,#30H

MOVR7,#20H

MOVDPTR,#2000H

LOOP1:MOVXA,@DPTR

MOV@R0,A

INCDPTR

INCR0

DJNZR7,LOOP1

;再將暫存于內部RAM30H~50H中的數(shù)據(jù)傳送到外部RAM目標地址中

MOVR0,#30H

MOVR7,#20H

MOVDPTR,#3000H

LOOP2:MOVA,@R0

MOVX@DPTR,A

INCDPTR

INCR0

DJNZR7,LOOP2第一條指令是以DPTR作為基址寄存器,累加器A的內容作為無符號數(shù)與DPTR的值相加,得到一個16位地址,并把該地址指示的程序存儲器單元的內容送到累加器A。這條

指令的執(zhí)行結果只與指針DPTR及累加器A的內容有關,與該指令存放的地址無關。因此,表格的大小和位置可以存放在64KB程序存儲器中任意位置,并且一個表格可以為各個程序塊所共用。第二條指令是以PC作為基址寄存器,A的內容作為無符號數(shù)和PC的當前值(下一條指令的起始地址)相加后得到一個16位地址,并將該地址指示的程序存儲器單元的內容

送到累加器A。這條指令的缺點是,表格只能放在該條查表指令后面的256個單元之中,表格的大小受限制,而且表格只能被一段程序利用。

通常把MOVCA,@A+DPTR稱為遠程查表指令,把MOVCA,@A+PC稱為近程查表指令。近程查表指令往往需要對地址增加適當?shù)男拚俊?/p>

例3.3.5

編寫一個子程序,其入口參數(shù)A為一個0~9的數(shù)(BCD碼),利用查表指令找出其對應的ASCII碼,求得的ASCII碼存放于A中返回。

解所謂表格是指在程序中定義了一串有序的常數(shù),如ASCII碼表、平方表、字型碼表、鍵碼表等。因為程序一般都是固化在程序存儲器(通常是只讀存儲器ROM類型)中,

所以可以說表格是預先定義在程序的數(shù)據(jù)區(qū)中,然后和程序一起固化在ROM中的一串常數(shù)。查表程序的關鍵是表格的定義和如何實現(xiàn)查表。程序1,遠程查表:

BCD-ASC1:MOVDPTR,#TAB;取表格首址#TAB

MOVCA,@A+DPTR

RET

TAB:DB′0123456789′;定義ASCII碼表,TAB為表格

首址

程序2,近程查表:

BCD-ASC2:INCA;(A)←(A)+1,增加的修正量

MOVCA,@A+PC

RET

TAB:DB′0123456789′;ASCII碼表執(zhí)行MOVCA,@A+PC指令時,PC的當前值指向的是RET指令,沒有指向TAB的首地址。RET指令代碼占一個單元,子程序用INCA指令對A加1,是為了“繞過”RET

指令所占的一個單元而增加的修正量。

例3.3.6

在外部程序存儲器ROM/EPROM中,從TABLE單元開始依次存放有0~9的平方值(常數(shù)表格,表格首址為TABLE)。設累加器A中有一個0~9范圍內的數(shù),從上述常數(shù)表格中查找該數(shù)的平方值。解程序1:用MOVCA,@A+DPTR指令查表

MOVA,#2;設要查找2的平方值

MOVDPTR,#2000H;取表格首址

MOVCA,@A+DPTR;(A)←((DPTR)+(A))

ORG2000H;設表格首址為2000H

TABLE:DB0,1,4,9,16,25,36,49,81;常數(shù)表格

;執(zhí)行前若(A)=2,則執(zhí)行后(A)=4程序2:用MOVCA,@A+PC指令查表

MOVA,#2;設要查找2的平方值

ADDA,#3;A加修正量3,因為LJMPNEXT是3字節(jié)指令MOVCA,@A+PC;(A)←((PC)+(A))

LJMPNEXT

TABLE:DB0,1,4,9,16,25,36,49,81

NEXT:…

;程序跳過常數(shù)表格后繼續(xù)

4.堆棧操作指令

在程序實際運行中,需要一個先進后出的堆棧區(qū),在子程序調用、中斷服務程序等場合用以保護現(xiàn)場,這種先進后出的緩沖區(qū)稱為堆棧區(qū)。51系列單片機的堆棧區(qū)設定在片

內RAM中,SP為堆棧指針寄存器,其長度為8位。系統(tǒng)復位后SP之值為07H。單片機堆棧區(qū)域不是固定的,原則上可設在內部RAM的任意區(qū)域,但為了避開使用頻率較高的工作寄存器區(qū)和位尋址區(qū),一般設在60H以后的范圍內。堆棧有兩種最基本操作:向堆棧存入數(shù)據(jù)稱為“入?!被颉皦喝攵褩!?PUSH);從堆棧取出數(shù)據(jù)稱為“出?!被颉皬棾龆褩!?POP)。堆棧中數(shù)據(jù)的存取采用先進后出的

方式,即先入棧的數(shù)據(jù),后彈出,類似貨棧堆放貨物的存取方式,“堆?!币辉~也因此而得名。

入棧指令為:

PUSHdirect;(SP)←(SP)+1

;((SP))←(direct)圖3.6入棧示意圖例:MOVSP,#30H

MOVA,#78H

PUSHA

數(shù)據(jù)入棧時,先將堆棧指針SP的內容加1,然后將數(shù)據(jù)送入堆棧,如圖3.6所示。

出棧指令為:

POPdirect;(direct)←((SP))

;(SP)←(SP)-1

數(shù)據(jù)出棧時,按SP的指示先把數(shù)據(jù)出棧,接著堆棧指針SP的內容自動減1。

例3.3.7

編寫中斷服務程序,進入中斷服務程序時,需要把程序狀態(tài)寄存器PSW、累加器A、數(shù)據(jù)指針DPTR進棧保護,中斷返回之前恢復。

解中斷服務程序如下:

PUSHPSW

PUSHACC

PUSHDPL

PUSHDPH

;中斷處理程序

POPDPH

POPDPL

POPACC

POPPSW

RET;中斷返回

例3.3.8

設片內RAM(30H)=12H,(40H)=34H,試用堆棧實現(xiàn)30H和40H單元中的數(shù)據(jù)互換。

解參考程序如下,堆棧變化如圖3.7所示。

MOVSP,#50H;設置SP為50H

PUSH30H;12H壓棧,注意,PUSH后緊跟直接地址

PUSH40H;34H壓棧

POP30H;34H出棧,存入30H單元

POP40H;12H出棧,存入40H單元圖3.7堆棧變化示意圖(a)入棧示意圖;(b)出棧示意圖注意:

(1)堆棧操作與RAM操作的區(qū)別。堆棧作為內部RAM的一個特殊區(qū)域,有其獨特性。

使用內部RAM必須知道單元具體地址,而堆棧只需設置好棧底地址,就可放心使用,無需再記住單元具體地址。堆棧所特有的先進后出的特點,使數(shù)據(jù)彈出之后,存儲單元自

動回收,雖然數(shù)據(jù)仍在RAM中,但從邏輯上認為該數(shù)據(jù)已不存在了,存儲單元可再次使用,充分提高了內存的利用率;而內部RAM的操作是不能實現(xiàn)存儲單元自動回收和再利用的,必須通過編程重新分配,才能再次使用。

(2)51系列單片機的堆棧區(qū)是向上生成的,因此設置SP初值時要充分考慮堆棧的深度,預留出足夠的內存空間,滿足堆棧使用,否則就會發(fā)生堆棧溢出引起程序出錯。

5.字節(jié)交換指令

XCHA,Rn;(A)(Rn)

XCHA,@Ri;(A)((Ri))

XCHA,direct;(A)(direct)

XCHDA,@Ri;(A)3~0((Ri))3~0

SWAPA;(A)7~4(A)3~0

XCH指令是將累加器A的內容和源操作數(shù)內容相互交換;XCHD是半字節(jié)交換指令,是將累加器A的低4位二進制數(shù)和(Ri)所指示的內部RAM單元的低4位相互交換,高4

位數(shù)保持不變。SWAP是將累加器A中的高4位與低4位進行交換。

例如,設累加器A的內容為12H,而R0的內容為34H,則執(zhí)行XCHA,R0指令后,累加器A的內容為34H,R0的內容為12H,即A和R0的內容交換了。交換指令與數(shù)據(jù)傳送指令不同,數(shù)據(jù)傳送指令執(zhí)行后,源操作數(shù)傳送到目的操作數(shù)中覆蓋了目的操作數(shù)原來的內容。再如,設累加器A的值為2EH,R0的內容為30H,內部RAM30單元的內容為48H,執(zhí)行XCHDA,@R0指令后,累加器A的內容為28H,內部RAM30H單元的內容將為4EH,即A與寄存器R0指定的內存單元的低4位交換,而高4位不變。

3.3.2算術運算指令

算術運算指令用來完成各種算術運算。51系列單片機有加、減、乘、除4種算術運算。

1.加法指令

1)不帶進位的加法指令

ADDA,#data;(A)←(A)+#data

ADDA,Rn;(A)←(A)+(Rn)

ADDA,direct;(A)←(A)+(direct)

ADDA,@Ri;(A)←(A)+((Ri))

上述指令完成累加器A與相應源操作數(shù)的相加,結果存放在累加器A中,且運算對程序狀態(tài)寄存器PSW中的標志位產生影響。

注意:用戶可根據(jù)需要把參與運算的數(shù)據(jù)看成無符號數(shù)(0~255),也可以把它們看成帶符號數(shù)(補碼數(shù))。無符號數(shù)參與運算時,關心進位標志位CY,若CY=0,則表示運算結果小于等于255,沒有進位;若CY=1,則表示運算結果大于255,產生了進位。帶符號數(shù)參與運算時,關心溢出標志位OV,若OV=0,則表示運算正確,運算結果在-128~+127范圍內;若OV=1,則表示運算出錯,運算結果超出了-

128~+127范圍,需要進行出錯處理。溢出標志OV和進位標志CY是兩種不同性質的標志。

例3.3.9

試分析執(zhí)行下列指令后,PSW中CY、OV、AC及P標志位的狀態(tài)。

MOVA,#0FFH

ADDA,#02H

ADD指令的執(zhí)行過程及運算結果如圖3.8所示。溢出標志的判斷方法為:

OV=CY

,其中為次高位向最高位的進位。圖3.8ADD對PSW的影響

2)帶進位加法指令

ADDCA,#data;(A)←(A)+#data+CY

ADDCA,Rn;(A)←(A)+(Rn)+CY

ADDCA,direct;(A)←(A)+(direct)+CY

ADDCA,@Ri;(A)←(A)+((Ri))+CY

這組指令的功能與加法指令類似,惟一的不同之處是,在執(zhí)行加法時,還要將進位標志CY的內容加進去,對于標志位的影響與普通加法指令相同。

例如,可通過如下指令將存放在30H、31H單元中的16位二進制數(shù)與存放在32H、33H單元中的16位二進制數(shù)相加并將結果存放在30H、31H中。

MOVA,30H;將被加數(shù)低8位送到累加器A

ADDA,32H;與加數(shù)低8位,即32H單元內容相

;加,結果存放在A中

MOV30H,A;將和的低8位保存到30H單元

MOVA,31H;將被加數(shù)高8位送累加器A

ADDCA,33H;與加數(shù)高8位,即33H單元內容相

;加,結果存放在累加器A中由于低8

;位相加時,結果可能大于0FFH,產

;生進位,因此在高8位相加時用

;ADDC指令

MOV31H,A;將和的高8位保存到31H單元中

3)增量指令

INCA;(A)←(A)+1

INCRn;(Rn)←(Rn)+1

INCdirect;(direct)←(direct)+1

INC@Ri;((Ri))←((Ri))+1

INCDPTR;(DPTR)←(DPTR)+1這組指令的功能是將指令中所指出操作數(shù)的內容加1。除INCA影響P標志外,這組指令都不影響任何標志。若原來的內容為0FFH,則加1后使操作數(shù)的內容變成00H,但不影響任何標志(除INCA影響P標志外)。最后一條指令是對16位的數(shù)據(jù)指針寄存器DPTR加1。

注意:INC指令中,當操作數(shù)是某一I/O端口時,如“

INCP1”,先將P1口鎖存器內容讀出,加1后,再寫入P1口鎖存器中,因此INCPi(i=0,1,2,3)屬于“讀—修改—寫”指令。

4)十進制調整指令

DAA

這條指令用于壓縮BCD碼加法運算的十進制調整。它只能跟在ADD或ADDC指令之后,對累加器A中所獲得的8位運算結果進行十進制調整,使A中的內容調整為二位BCD碼。它判斷A中的低4位是否大于9和輔助進位標志AC是否為“1”,若兩者有一個條件滿足,則低4位加6;同樣,A中的高4位大于9或進位標志CY為“1”,若兩者有一個條件滿足時,則高4位加6。例如,兩個BCD數(shù)36與45相加,結果應為BCD碼81,程序如下:

MOVA,#36H

ADDA,#45H

DAA

該程序中,第一條指令將立即數(shù)36H(BCD碼36)送入累加器A;第二條指令完成加法,結果為7BH;第三條指令對累加器A進行十進制調整,低4位(為0BH)大于9。因此,

要加6,得調整的BCD碼81。

注意:這條指令不能對減法指令的結果進行調整,且其結果不影響溢出標志位。

例3.3.10

將R2中以壓縮形式存放的兩位BCD碼減1。

51單片機沒有減法的十進制調整指令,而DAA指令只能對加法進行調整。

所以,可將減法用加法來實現(xiàn),減1相當于加99。因此,實現(xiàn)兩位BCD碼減1的程序如下:

MOVA,R2

ADDA,#99H

DAA

MOVR2,A

2.減法指令

1)帶借位減法指令

SUBBA,#data;(A)←(A)-#data-CY

SUBBA,Rn;(A)←(A)-(Rn)-CY

SUBBA,direct;(A)←(A)-(direct)-CY

SUBBA,@Ri;(A)←(A)-((Ri))-CY

這組指令的功能是:將累加器A的內容與第二操作數(shù)及進位標志相減,結果送回累加器A中。在執(zhí)行減法過程中,如果D7有借位,則進位標志CY置“1”,否則CY清“0”;如果D3有借位,則輔助進位標志AC置“1”,否則清“0”;如果D6有借位而D7沒有借位,或D7有借位而D6沒有借位,則溢出標志OV置“1”,否則清“0”。

注意:51單片機沒有不帶借位的減法指令。若要進行不帶借位的減法操作,則可以先將CY清“0”然后再用減法指令。

例3.3.11

求內部RAM兩單元的差值,被減數(shù)存放在內部30H單元,減數(shù)存放在31H單元,將差放在30H單元。

MOVA,30H;被減數(shù)送累加器A

CLRC ;進位標志CY清零

SUBBA,31H;與31H單元內容相減

MOV30H,A;將結果保存在30H單元

2)減1指令

DECA ;(A)←(A)-1

DECRn ;(Rn)←(Rn)-1

DECdirect ;(direct)←(direct)-1

DEC@Ri ;((Ri))←((Ri))-1

這組指令的功能是將相應的操作數(shù)減1。除DECA影響P標志外,這組指令都不影響任何標志。若原來的內容為00H,則減1后使操作數(shù)的內容變成FFH,但不影響任

何標志(除DECA影響P標志外)。

3.乘法指令

完成單字節(jié)乘法運算,只有一條指令:

MULAB;(B7~0A7~0)←(A)*(B)

將累加器A的內容與寄存器B的內容相乘,乘積的低8位存放在累加器A中,高8位存放于寄存器B中。如果乘積超過0FFH,則溢出標志OV置“1”,否則清“0”。乘法指令執(zhí)行后進位標志CY總是為“0”。

4.除法指令

完成單字節(jié)的除法,只有一條指令:

DIVAB;(A)←(A)/(B)的商

;(B)←(A)/(B)的余數(shù)

將累加器A中的內容除以寄存器B中的8位無符號整數(shù),所得商存放在累加器A中,余數(shù)存放在寄存器B中,清進位標志CY和溢出標志OV。若原來B中的內容為0,則執(zhí)行該指令后A與B中的內容不定,并將溢出標志OV置“1”。在任何情況下,進位標志CY總是被清“0”。3.3.3邏輯運算指令與移位指令

1.邏輯與指令

ANLA,#data;(A)←(A)∧#data

ANLA,Rn ;(A)←(A)∧(Rn)

ANLA,direct ;(A)←(A)∧(direct)

ANLA,@Ri ;(A)←(A)∧((Ri))

ANLdirect,A ;(direct)←(direct)∧(A)

ANLdirect,#data ;(direct)←(direct)∧#data[這組指令的功能是將兩個操作數(shù)的內容按位進行邏輯與操作,并將結果送回目的操作數(shù)單元中。

例如,(A)=35H,執(zhí)行ANLA,#0FH后,(A)=05H。

2.邏輯或指令

ORLA,#data;(A)←(A)∨#data

ORLA,Rn;(A)←(A)∨(Rn)

ORLA,direct;(A)←(A)∨(direct)

ORLA,@Ri;(A)←(A)∨((Ri))

ORLdirect,A;(direct)←(direct)∨(A)

ORLdirect,#data;(direct)←(direct)∨#data

這組指令的功能是將兩個操作數(shù)的內容按位進行邏輯或操作,并將結果送回目的操作數(shù)單元中。

3.邏輯異或指令

XRLA,#data;(A)←(A)#data

XRLA,Rn;(A)←(A)(Rn)

XRLA,direct;(A)←(A)(direct)

XRLA,@Ri;(A)←(A)((Ri))

XRLdirect,A;(direct)←(direct)(A)

XRLdirect,#data;(direct)←(direct)#data

這組指令的功能是將兩個操作數(shù)的內容按位進行邏輯異或操作,并將結果送回到目的操作數(shù)單元中。

4.移位指令

RLA;累加器A的內容向左環(huán)移1位

RRA;累加器A的內容向右環(huán)移1位

RLCA;累加器A的內容帶進位標志位向左環(huán)移1位

RRCA;累加器A的內容帶進位標志位向右環(huán)移1位這組指令的功能是對累加器A的內容進行簡單的移位操作。除了帶進位標志位的移位指令外,其他都不影響CY,AC和OV等標志,如圖3.9所示。圖3.9移位指令(a)RLA;(b)RRA;(c)RLCA;(d)RRCA5.累加器A清零與取反指令

CLRA;累加器A清0

CPLA;累加器A按位取反

例3.3.12利用移位指令把片內RAM的30H單元的數(shù)據(jù)乘2,乘積的低8位存

放于片內RAM的30H單元中,高8位存放于31H單元中。

解參考程序如下:

MOVA,30H

CLRC

RLCA;數(shù)據(jù)與2相乘,超出位存于CY

MOV30H,A;乘積的低8位存放在30H單元中

CLRA;累加器A清0

RLCA;CY移入A

MOV31H,A;乘積的高8位存放于31H單元中

例3.3.13

求雙字節(jié)數(shù)的補碼。設有一個16位二進制正數(shù)X,X的高8位存放在R3中,X的低8位存放在R2中,求-X的補碼。其補碼仍存放于R3和R2中。

解參考程序如下:

MOVA,R2 ;取低8位

CPLA ;低8位取反

ADDA,#01H ;取低8位+1

MOVR2,A ;存低8位

MOVA,R3 ;取高8位

CPLA ;取高8位取反

ADDCA,#00H ;加低8位的進位

MOVR3,A ;存高8位

例3.3.14

設片內RAM的20H單元和21H單元各有一個8位數(shù)據(jù):

(20H)=X7X6X5X4X3X2X1X0

(21H)=Y7Y6Y5Y4Y3Y2Y1Y0

現(xiàn)要求從20H中取出低5位,并從21H中取出低3位,把取出的8位數(shù)據(jù)重新裝配成一

個字節(jié)存于30H單元,且規(guī)定裝配格式如下:

(30H)=Y2Y1Y0X4X3X2X1X0

解參考程序如下:

MOV30H,20H;將X傳送到30H

ANL30H,#1FH;屏蔽將X7X6X5

MOVA,21H;將Y傳送到A

SWAPA ;將Y7Y6Y5Y4與Y3Y2Y1Y0互換

RLA ;將Y2Y1Y0互移至高3位

ANLA,#0E0H;屏蔽低5位

ORL30H,A;完成裝配3.3.4控制轉移指令

51系列單片機提供了較豐富的控制轉移指令,編程相當靈活。其中有64KB范圍內的長轉移指令LJMP、長調用指令LCALL;有2KB范圍內的絕對轉移AJMP和絕對調用指令ACALL;有一頁范圍內的相對轉移指令SJMP;還有多種條件轉移指令。

1.無條件轉移指令

1)長轉移指令

LJMPaddr16;(PC)←addr16

LJMP為3字節(jié)指令,其操作碼為02H,隨后兩個字節(jié)是要轉向的16位的目標地址。

執(zhí)行該指令時,直接將16位的目標地址addr16裝入PC,程序無條件轉向指定的目標地址。轉移的目標地址可以在64KB程序存儲器地址空間的任何區(qū)域,如圖3.10所示。

執(zhí)行跳轉時,不影響任何標志位。圖3.10LJMPaddr16指令示意圖(a)LJMP機器碼結構;(b)LJMP轉移范圍64KB例如,在0000H單元存放一條指令:

LJMP0040H;addr16=0040H

其機器碼的3個字節(jié)依次為02H、00H、40H。上電復位后,(PC)=0000H,執(zhí)行LJMP時,(PC)←0040H,則程序轉向0040H執(zhí)行用戶程序。書寫程序時,addr16用符號地址表

示。如:

ORG0000H

LJMPSTART;上電復位時執(zhí)行該指令,再轉向START

ORG0040H

START:…

;用戶程序從0040H開始

2)絕對轉移指令

AJMPaddr11;(PC)←(PC)+2

;(PC10~0)←a10~0

AJMP為2字節(jié)指令,其機器碼由要轉向的11位的地址碼和該指令特有的操作碼00001組成(見圖3.11所示)。執(zhí)行該指令時,先將PC+2,然后將addr11(即a10~0)送入PC10~0,而PC15~11保持不變。這樣便可得到跳轉的目的地址。需要注意的是,由于11位地址的范圍是00000000000~11111111111,即2KB范圍,而目的地址的高5位是PC當前值,因此程序可轉移的位置只能是和PC當前值在同一2KB范圍內。本指令執(zhí)行后不影響狀態(tài)標志位。圖3.11AJMPaddr11指令示意圖例如,若AJMP指令地址(PC)=2300H,則執(zhí)行指令AJMP0FFH后,結果為:轉移目的地址(PC)=20FFH,程序向前轉到20FFH單元開始執(zhí)行。

又如,若AJMP指令地址(PC)=2FFFH,則執(zhí)行指令AJMP0FFH后,結果為:轉移目的地址(PC)=28FFH,程序向前轉到28FFH單元開始執(zhí)行。

由此可見:若addr11相同,則AJMP指令的機器碼相同,但轉移的目的地址卻可能不同,這是因為轉移的目的地址是由PC當前值的高5位與addr11共同決定的。

3)相對轉移指令

SJMPrel;(PC)←(PC)+2

;(PC)←(PC)+rel

SJMPrel為雙字節(jié)指令,其機器碼由操作碼80H和操作數(shù)rel組成,如圖3.12(a)所示。其中,rel是用8位補碼(帶符號數(shù))表示的一個偏移量。執(zhí)行該指令時,先將PC+2(即SJMP指令所在地址加2,稱為PC的當前值),再加rel便是要跳轉到的目的地址。因為8位補碼的取值范圍為-128~+127,所以該指令的轉移范圍是:相對于PC當前值先向前跳轉128字節(jié),后向后跳轉127字節(jié)。即

目的地址=SJMP指令所在地址+2+rel

=PC當前值+rel

例如,在2100H單元有指令SJMP08H;指令執(zhí)行情況如圖3.12(b)所示。若在此rel=08H(正數(shù)),則轉移的目的地址為210AH(向后轉)。用匯編語言編程時,指令中的相對地址rel往往用符號地址表示。如寫成SJMPKL0,其中KL0是用符號表示的目的地址,則機器匯編時,能自動算出相對地址值。又如,在3100H單元有指令SJMP0F0H,指令執(zhí)行情況如圖3.12(c)所示。在此rel=F0H,是一個負數(shù)(-16),則轉移目的地址為

PC當前值+rel=PC當前值+(-16的16位補碼FFF0H)

=PC當前值-16

=3102H-10H

=30F2H

再如,在4100H單元有指令

HERE:SJMPHERE該指令執(zhí)行情況如圖3.12(d)所示。在此rel=FEH,是一個負數(shù)(-2),目的地址就是SJMP指令的首地址,程序就不會再向后執(zhí)行,造成單指令的無限循環(huán),進入等待狀態(tài),往往用該指令作為停機指令使用。在匯編語言中,可用$符號表示SJMP指令的地址,于是該指令即可寫成SJMP$。圖3.12SJMPrel指令示意圖(a)SJMP轉移范圍;(b)SJMP08H;(c)SJMP0F0H;(d)SJMP$

注意:以上3種無條件轉移指令在應用上的區(qū)別有以下幾點:

(1)轉移距離不同。LJMP可在64KB范圍內轉移,AJMP指令可以在本指令取出后的2KB范圍內轉移,SJMP的轉移范圍是相對PC當前值的-128~+127個字節(jié)。

(2)匯編后機器碼的字節(jié)數(shù)不同。LJMP是3字節(jié)指令,AJMP和SJMP都是2字節(jié)指令。

(3)LJMP和AJMP都是絕對轉移指令,而SJMP是相對轉移指令。當修改程序時,只要相對地址不變,SJMP指令的機器碼就不變。選擇無條件轉移指令的原則是根據(jù)跳轉的遠近和ROM的存儲空間大小而定。若ROM的存儲空間有限,則盡可能選擇占用字節(jié)數(shù)少的指令。例如,動態(tài)暫停指令一般都選用

SJMP$,而不用LJMP$。若ROM的存儲空間不受限制,則盡可能使用LJMP,因為LJMP的轉移地址比較直觀,便于調試程序。

4)散轉指令(間接長轉移指令)

JMP@A+DPTR;(PC)←(PC)+(DPTR)

執(zhí)行該指令時,把累加器A中的8位無符號數(shù)與數(shù)據(jù)指針中的16位數(shù)相加,結果作為下一條指令的地址送入PC,利用該指令能實現(xiàn)程序的散轉。該指令不改變累加器A和數(shù)據(jù)指針DPTR的內容,也不影響標志。例3.3.15

編寫程序,根據(jù)累加器A的值轉向不同的入口地址。當

(A)=0時,轉向KL0

(A)=1時,轉向KL1

(A)=2時,轉向KL2

解參考程序如下:

MOVDPTR,#TABLE;取轉移表首址

RLA;(A)←(A)*2,因為AJMP占2個字節(jié),所以要修正A值

JMP@A+DPTR

TABLE:AJMPKL0;若原(A)=0,則轉向KL0

AJMPKL1;若原(A)=1,則轉向KL1

AJMPKL2

2.條件轉移指令

JZrel;當A=0時跳轉,A≠0時則順序執(zhí)行下面的指

;令,即不跳轉

JNZrel;A≠0時跳轉,A=0時不跳轉繼續(xù)執(zhí)行程序這類指令是雙字節(jié)指令,第一個字節(jié)是操作碼,第二個字節(jié)是8位的相對偏移量(帶符號數(shù))。它們依據(jù)累加器A的內容是否為0進行轉移。條件滿足時程序跳轉,條件不滿足時則順序執(zhí)行下面的指令。當條件滿足時,其轉移情況類似于SJMP指令的轉移,有

目的地址=指令所在地址+2+rel

=PC當前值+rel

它們的轉移范圍是相對于PC當前值的-128~+127個字節(jié)。指令不影響任何標志位。

例3.3.16

在片外RAM中,從首地址為DATA1的存儲區(qū)中讀取一個數(shù)據(jù)塊,該數(shù)據(jù)塊中不包含0元素。試將該數(shù)據(jù)塊傳送到片內RAM首地址為DATA2的存儲區(qū)中,若遇到0

結束傳送。

解外部RAM向內部RAM的數(shù)據(jù)轉送一定要經(jīng)過累加器A,正好利用判零條件轉移可以判斷是否要繼續(xù)傳送數(shù)據(jù)。完成數(shù)據(jù)傳送的程序段如下:

MOVDPTR,#DATA1;DPTR作為外部數(shù)據(jù)塊

;的地址指針

MOVR1,#DATA2;R1作為內部數(shù)據(jù)塊的

;地址指針L

溫馨提示

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

最新文檔

評論

0/150

提交評論