《單片機嵌入式系統(tǒng)及應用》課件-第3章 8051 指令系統(tǒng)_第1頁
《單片機嵌入式系統(tǒng)及應用》課件-第3章 8051 指令系統(tǒng)_第2頁
《單片機嵌入式系統(tǒng)及應用》課件-第3章 8051 指令系統(tǒng)_第3頁
《單片機嵌入式系統(tǒng)及應用》課件-第3章 8051 指令系統(tǒng)_第4頁
《單片機嵌入式系統(tǒng)及應用》課件-第3章 8051 指令系統(tǒng)_第5頁
已閱讀5頁,還剩93頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1第3章8051指令系統(tǒng)機械工業(yè)出版社3.1匯編語言指令格式3.2尋址方式3.38051單片機指令分類3.4數(shù)據(jù)傳送指令3.5算術(shù)運算指令3.6邏輯運算指令3.7轉(zhuǎn)移控制指令3.8空操作指令3.9位轉(zhuǎn)移指令2主要內(nèi)容3.1匯編語言指令格式匯編指令分為兩類,執(zhí)行指令和偽指令。執(zhí)行指令即指令系統(tǒng)給出的各種指令;偽指令由匯編程序規(guī)定,是提供匯編控制信息的指令。33.1.1匯編語言執(zhí)行指令格式一條匯編語言指令中最多包含四個區(qū)段,如下所示:

標號:操作碼

操作數(shù);注釋四個區(qū)段之間要用分隔符分開,標號區(qū)段與操作碼區(qū)段之間用冒號“:”隔開,操作碼與操作數(shù)之間用空格隔開,操作數(shù)與注釋區(qū)段之間用分號“;”分隔。如果操作數(shù)區(qū)段中有兩個以上的操作數(shù),則在操作數(shù)之間要用逗號“,”分隔開。

4例如,把立即數(shù)0C0H送累加器的指令為:

Begin:MOVA,#0C0h;立即數(shù)0C0h→A

標號區(qū)段

操作碼區(qū)段

操作數(shù)區(qū)段

注釋區(qū)段5標號區(qū)段是由用戶定義的符號組成,必須用英文大寫字母開始。標號區(qū)段可有可無。若一條指令中有標號區(qū)段,標號代表該指令第一個字節(jié)所存放的存儲器單元的地址,故標號又稱為符號地址,在匯編時,把該地址賦值給標號。操作碼區(qū)段是指令的功能部分,不能缺省。它是便于記憶的助記符。例如,MOV是數(shù)據(jù)傳送的助記符,ADD是加的助記符。6操作數(shù)區(qū)段是指令要操作的數(shù)據(jù)信息。根據(jù)指令的不同功能,操作數(shù)可以有三個、兩個、一個或沒有操作數(shù)。上例中,操作數(shù)區(qū)段包含兩個操作數(shù)A和#0C0H,它們之間由逗號分隔開。其中第二個操作數(shù)為立即數(shù)0C0H,它是用十六進制數(shù)表示的以字母開頭的數(shù)據(jù),為區(qū)別于在操作數(shù)區(qū)段出現(xiàn)的字符,以字母開始的十六進制數(shù)據(jù)前面都要加0,把立即數(shù)C0H寫成0C0H(這里H表示此數(shù)為十六進制數(shù),若為二進制,則用B表示,十進制用D或省略)。7注釋區(qū)段可有可無。加入注釋的目的是為了便于閱讀。程序設(shè)計者對指令或程序段作簡要的功能說明,在閱讀程序,尤其是在調(diào)試程序時將會帶來很多方便。83.1.2匯編語言偽指令匯編語言必須經(jīng)匯編變成機器語言計算機才能執(zhí)行,匯編程序?qū)τ脜R編語言編寫的源程序進行匯編時,還要提供一些匯編用的指令,例如要指定程序或數(shù)據(jù)存放的起始地址;要給一些連續(xù)存放的數(shù)據(jù)確定單元等等。但是,這些指令在匯編時不產(chǎn)生目標代碼,不影響程序的執(zhí)行,所以稱為偽指令。9

用匯編語言編寫的程序,計算機不能直接識別,要由一種程序?qū)R編語言翻譯成機器語言,這種起翻譯作用的程序叫匯編程序(匯編程序是系統(tǒng)軟件中語言處理的系統(tǒng)軟件),這個過程稱為匯編。8086微機事先把已編制好的匯編程序放在內(nèi)存中,由匯編程序把匯編源程序(用匯編語言編寫的程序,是機器語言程序的符號表示,又稱匯編語言程序)匯編成機器語言。由于匯編語言需要匯編程序匯編翻譯,所以匯編語言中除了符號化的機器語言(即指令助記符和操作數(shù)標識符)外,還包括給匯編程序匯編時用于控制匯編的語句(即偽指令)。匯編語言源程序通過編輯程序(常見編輯程序有Edit、記事本、Word等)在計算機中建立匯編語言源程序文件(.ASM文件)。匯編語言源程序文件經(jīng)過匯編程序(如MASM匯編編譯器等)匯編轉(zhuǎn)換成用二進制代碼表示的目標程序文件(.OBJ文件)。3.1.2匯編語言偽指令

匯編語言源程序中的語句包含三種不同性質(zhì)的語句:指令性語句、指示性語句、宏指令語句。指令性語句:簡稱指令。由CPU執(zhí)行,每一條指令性語句都有一條機器碼與其對應,它是CPU可以執(zhí)行的能完成特定功能的語句,由指令助記符組成。指示性語句(偽指令):它是一種匯編時用于控制匯編的指令,不產(chǎn)生目標代碼,是發(fā)給匯編程序的命令語句,用于向匯編程序發(fā)出的指示信息,在匯編過程中告訴匯編程序應如何匯編。例如,告訴匯編程序已寫出的匯編語言源程序有幾個段,段的名字是什么。偽指令看是匯編程序在匯編時使用的,偽指令只出現(xiàn)在匯編前的源程序中,經(jīng)過匯編得到目標程序后,偽指令已無存在的必要,所有“偽”體現(xiàn)在匯編時偽指令沒有相應的機器代碼。

3.1.2匯編語言偽指令宏指令語句:簡稱宏,是源程序中具有獨立功能的一段程序代碼,宏實際上也是一種偽指令,宏指令只對編譯器有作用。在匯編語言源程序中,如果在源程序中需要多次使用同一個程序段,可以將這個程序段定義(宏定義)為一個宏指令,然后每次需要時,即可簡單地用宏指令名來代替(稱為宏調(diào)用),從而避免了重復書寫,使源程序更加簡潔、易讀。

3.1.2匯編語言偽指令1.ORG(Origin—起點)ORG偽指令總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始。它指明此語句后面的程序或數(shù)據(jù)塊的起始地址。其一般格式為:ORGnn(絕對地址或標號)

在匯編時由nn確定此語句后面第一條指令(或第一個數(shù)據(jù))的地址。該段源程序(或數(shù)據(jù)塊)就連續(xù)存放在以后的地址內(nèi),直到遇到另一個ORG語句為止。13例

ORG100HMOVR0,#50H MOVA,R4 ADDA,@R0 MOVR3,A14存儲器地址

目標程序100H102H103H104H50EC26FB2.DB(DefineByte—定義字節(jié))

一般格式:

標號:DB字節(jié)常數(shù)或字符或表達式其中:標號區(qū)段可有可無,字節(jié)常數(shù)或字符是指一個字節(jié)數(shù)據(jù),或用逗號分開的字節(jié)串,或用引號括起來的ASCII碼字符串(一個ASCII字符相當于一個字節(jié))。此偽指令的功能是把字節(jié)常數(shù)或字節(jié)串存入內(nèi)存連續(xù)單元中。15例ORG200HDATA1:DB54H,10H,30H,72HDATA2:DB‘TYUT’偽指令ORG200H指定了標號DATA1的地址為200H,偽指令DB指定了數(shù)54H,10H,30H,72H順序地存放在從200H開始的單元中;DATA2也是一個標號,它的地址與前一條偽指令DB連續(xù),為204H;字符串‘TYUT’的ASCII碼54H、59H、55H、54H,存放在從204H單元開始的內(nèi)存中,如表3.2所示1617存儲器地址

內(nèi)容200H201H202H203H204H205H206H207H54H10H30H72H54H(‘T’的ASCII碼)59H(‘Y’的ASCII碼)55H(‘U’的ASCII碼)54H(‘T’的ASCII碼)表3.2偽指令DB示例3.DW(DefineWord—定義字)

一般格式:

標號: DW 字或字串DW偽指令的功能與DB相似,其區(qū)別在于DB是定義一個字節(jié),而DW是定義一個字(規(guī)定為兩個字節(jié),即16位二進制數(shù)),故DW主要用來定義地址。存放時一個字需兩個單元,高8位先存,低8位后存,這和8051指令中的16位數(shù)據(jù)存放順序是一致的。18例 ORG200HDATA1:DW5410H,3072H,‘TYUT’其結(jié)果和使用DB時的結(jié)果完全一樣。194.EQU(Equate—等值)

一般格式:

標號 EQU 操作數(shù)EQU偽指令的功能是將操作數(shù)賦值于標號,使兩邊的兩個量等值。例如語句 AREAEQU2000H

即給標號AREA賦值為2000H。又如STKEQUAREA

即相當于STK=AREA。若AREA已賦值為2000H,則STK也為2000H。20使用EQU偽指令給一個標號賦值后,這個標號在整個源程序中的值是固定的。也就是說在一個源程序中,任何一個標號只能賦值一次。215.END(匯編結(jié)束)

一般格式:

標號:END 地址或標號其中標號以及操作數(shù)字段的地址或標號不是必要的。END偽指令是一個結(jié)束標志。用來指示匯編語言源程序段已結(jié)束。因此,在一個源程序中只允許出現(xiàn)一個END語句,并且它必須放在整個程序(包括偽指令)的最后面,是源程序模塊的最后一個語句。如果END語句出現(xiàn)在中間,則匯編程序?qū)⒉粎R編END后面的語句。223.2尋址方式寄存器尋址直接尋址位尋址立即尋址寄存器間接尋址相對尋址基址加變址寄存器間接尋址233.2.1寄存器尋址

寄存器尋址方式是對選中寄存器中的數(shù)據(jù)進行處理,適用于數(shù)據(jù)放置在寄存器之中的情況。MOVR1,B;將寄存器B中的數(shù)值送入到寄存器R1中INCR2 ;

將寄存器R2中的數(shù)值加1MOVA,R7;將寄存器R7中的數(shù)值送入累加器A寄存器尋址范圍:

寄存器區(qū)中8個工作寄存器R0~R7中的一個(由指令操作碼的低三位數(shù)值確定)、特殊寄存器A,B,DPTR,Cy(進位位,也是位處理機的累加器)也可作為寄存器尋址的對象。243.2.2直接尋址直接尋址方式是對直接指定地址的存儲器單元中的數(shù)據(jù)進行處理,適用于數(shù)據(jù)放置在可以直接尋址的存儲單元之中的情況。MOV40H,B;將寄存器B中的數(shù)值送入到內(nèi)部;RAM的40H單元中INC30H;將內(nèi)部RAM的30H單元中的數(shù)值加1

MOVTL0,R7;將寄存器R7中的數(shù)值送

;入到特殊功能寄存器TL0中直接尋址范圍:片內(nèi)RAM,包括SFR,且SFR只能直接尋址253.2.3立即尋址

立即尋址是對指令操作碼后的數(shù)據(jù)進行處理,適用于在程序中直接處理的數(shù)據(jù)的情況。

MOV38H,#05H;將數(shù)值05H送入到內(nèi)部RAM

;的38H單元中

ADDA,#30H;將A寄存器中的數(shù)值加上30HMOVTH0,#0F2H;將定時器0高8位設(shè)置為數(shù)

;值0F2H263.2.4位尋址方式

MOVC,40H;把位40H的值送進位位C位尋址的尋址范圍包括:內(nèi)部RAM中的位尋址區(qū)單元地址為20H-2FH,共16個單元,128個位,位地址是00H-7FH。特殊功能寄存器中的可尋址位可供位尋址的特殊功能寄存器共有11個,實際有尋址位83個。注意:位尋址只能直接尋址。27指令給出位地址。數(shù)據(jù)在存儲器位尋址區(qū)的某一位。

例:

MOVC,40H ;Cy(位地址40H)設(shè)指令執(zhí)行前(Cy)=1,位地址40H存儲器單元如圖,執(zhí)行指令后,(Cy)=?028H0110001029H11010111位尋址區(qū)3.2.4位尋址方式直接使用位地址。例如,PSW寄存器位

5的地址為0D5H。位名稱的表示方法。例如,PSW寄存器位5是F0標志位,則可使用F0表示該位。字節(jié)地址加位數(shù)的表示方法。例如,

0D0單元(即PSW寄存器)位5,表示為(0D0H).5特殊功能寄存器符號加位數(shù)的表示方法 PSW.5,P1.0SFR中可尋址位的表示方法293.2.5寄存器間接尋址

寄存器間接尋址是將要處理數(shù)據(jù)的地址放在寄存器中,即用寄存器中的數(shù)據(jù)作為存儲單元的地址數(shù)值。

MOV@R1,#05H;將數(shù)值05H送入到以R1內(nèi)數(shù)值為;地址的內(nèi)部RAM單元中ADDA,@R1;將累加器A中的數(shù)值加上以R1內(nèi)數(shù)值為地;址的內(nèi)部RAM單元中的數(shù)據(jù),結(jié)果存放

;于AMOVXA,@DPTR;將以DPTR內(nèi)數(shù)值為地址的外部數(shù)

;據(jù)存儲器的內(nèi)容送給累加器A30注意:寄存器間接尋址范圍包括內(nèi)部RAM和外部RAM,且外部RAM只能寄存器間接尋址,訪問外部數(shù)據(jù)存儲器的指令助記符與訪問內(nèi)部RAM的助記符不同。31對內(nèi)部RAM的寄存器間接尋址操作MOVA,@Ri;(Ri=R0orR1)MOV@Ri,AMOVdirect,@RiMOV@Ri,directMOV@Ri,#data

注意:內(nèi)部RAM使用R0或R1作為間址寄存器

助記符:MOV32對外部RAM的寄存器間接尋址操作MOVXA,@Ri;(Ri=R0orR1)MOVXA,@DPTRMOVX@Ri,AMOVX@DPTR,A注意:外部數(shù)據(jù)存儲器用16位地址時使用DPTR做間址寄存器,如果使用外部存儲器的地址低8位的256個存儲單元時,也可以使用R0或R1做間址寄存器。333.2.6相對尋址方式

相對尋址方式是為解決程序轉(zhuǎn)移而專門設(shè)置的,為轉(zhuǎn)移指令所采用。目的地址=轉(zhuǎn)移指令地址+轉(zhuǎn)移指令的字節(jié)數(shù)+rel偏移量rel是一個帶符號的8位二進制數(shù)補碼數(shù),所能表示的數(shù)的范圍是:-128~+127。34

相對尋址方式是為解決程序轉(zhuǎn)移而專門設(shè)置的,為轉(zhuǎn)移指令所采用。目的地址=轉(zhuǎn)移指令地址+轉(zhuǎn)移指令的字節(jié)數(shù)+rel偏移量rel是一個帶符號的8位二進制數(shù)補碼數(shù),所能表示的數(shù)的范圍是:-128~+127。3.2.6相對尋址方式

以PC的內(nèi)容作為基地址,加上偏移量,所得結(jié)果送PC寄存器作為轉(zhuǎn)移地址。偏移量在-128~+127之間。例:SJMP 81H ;短跳轉(zhuǎn)3.2.6相對尋址方式相對尋址JCrel ;JumpifCyissetJNCrel ;JumpifCyisnotsetJBbit,rel ;JumpifdirectBitissetJNBbit,rel ;JumpifdirectBitisnotsetJBCbit,rel ;JumpifdirectBitisset& ;ClearbitSJMPrel ;ShortJump(relativeadd)

373.2.7基址加變址寄存器間接尋址

(變址尋址)

專用16位寄存器(DPTR或PC)存放基地址,寄存器A做變址寄存器,僅兩條指令:

MOVCA,@A+PC MOVCA,@A+DPTR

38MOVCA,@A+PC;將A和PC兩個寄存器的數(shù);值相加之和作為程序存儲;器中的數(shù)據(jù)地址,將該地;址的內(nèi)容送到A中MOVCA,@A+DPTR;將A和DPTR兩個寄存;器的數(shù)值相加之和作;為程序存儲器中的數(shù);據(jù)地址,將該地址的

;內(nèi)容送到A中注意,MOVC指令只能讀取程序存儲器!392008H

89H2009H

12H例: MOVCA,@A+DPTR ;A((A)+(DPTR))設(shè)指令執(zhí)行前(A)=09H,(DPTR)=2000H,存儲器單元內(nèi)容如圖所示。執(zhí)行指令后,(A)=?(DPTR)=?12H2000H注意:(1)寄存器間址可拓寬單片機尋址范圍如:,

@Ri可用于對片內(nèi)RAM尋址(00H-7FH)(MOV指令),也可用于對

片外RAM尋址(00H-0FFH)(MOVX指令);

@DPTR可尋址片外ROM/RAM的全部64KB區(qū)域(MOVC/MOVX指令)。(2)寄存器間址指令不能用于尋址SFR。3.38051單片機指令分類數(shù)據(jù)傳送類;算術(shù)運算類;邏輯運算類;控制轉(zhuǎn)移類;其他類。413.38051單片機指令分類3.3.1.數(shù)據(jù)傳送類數(shù)據(jù)傳送類指令實現(xiàn)數(shù)據(jù)的復制或轉(zhuǎn)移,是編程時使用得最多最頻繁的一類指令。數(shù)據(jù)傳送類指令的作用是將源操作數(shù)傳送到目的操作數(shù)。數(shù)據(jù)傳送指令執(zhí)行后,源操作數(shù)不改變,目的操作數(shù)被改為源操作數(shù)數(shù)值。 433.3.2.算術(shù)運算類算術(shù)運算類指令用于進行數(shù)值計算的處理,可以實現(xiàn)CPU中運算器所能處理位數(shù)長度的數(shù)的加、減、乘、除運算。所有的CPU都能實現(xiàn)加減運算,有些指令系統(tǒng)有乘法指令,有些還有除法指令,還有的可以實現(xiàn)有符號數(shù)的運算。在加減運算時要考慮到進位的影響,可以根據(jù)需要選擇使用帶進位加減或不帶進位加減指令。443.3.3邏輯運算類指令邏輯運算類指令用于進行邏輯計算的處理,可以實現(xiàn)對CPU字長度的清“0”、取反、移位、與、或等邏輯運算。大多數(shù)邏輯運算指令都只能使用累加器A(如8051)或通用寄存器。不同CPU的指令系統(tǒng)中具有的移位功能不同,指令數(shù)量也不同,具體使用時要根據(jù)指令系統(tǒng)的說明使用。453.3.4控制轉(zhuǎn)移類控制轉(zhuǎn)移類指令用于改變程序執(zhí)行的流向,主要有跳轉(zhuǎn)(轉(zhuǎn)移)和調(diào)用兩種方式,可以產(chǎn)生分支和循環(huán)等流程結(jié)構(gòu)??刂妻D(zhuǎn)移指令是在該指令執(zhí)行時改變程序計數(shù)器的數(shù)值(程序存儲器指針),指令執(zhí)行結(jié)束后的下一條指令按新的指針地址取指和執(zhí)行。根據(jù)轉(zhuǎn)移的條件、修改數(shù)值的方式等的不同,轉(zhuǎn)移有無條件轉(zhuǎn)移、有條件轉(zhuǎn)移、相對轉(zhuǎn)移、絕對轉(zhuǎn)移、長轉(zhuǎn)移、直接轉(zhuǎn)移、間接轉(zhuǎn)移等不同形式。463.4

數(shù)據(jù)傳送指令

8051單片機指令系統(tǒng)中所用符號Rn—當前寄存器區(qū)的寄存器R7-R0direct—8位內(nèi)部數(shù)據(jù)存儲單元地址@Ri—間接寄存器尋址8位內(nèi)部數(shù)據(jù)存儲單元地址#data—8位常數(shù)#data16—16位常數(shù)addr16—16位地址Addr11—11位地址rel—帶符號的8位偏移量bit—直接尋址位47

格式為:MOV目的字節(jié),源字節(jié)MOVA,Rn

;將寄存器Rn的內(nèi)容送A,Rn為;當前寄存器組中的R0-R7之一MOVB,@Ri

;將工作寄存器Ri(Ri為R0或R1);所指的內(nèi)存單元內(nèi)容送寄存器BMOVRn,#data;8位立即數(shù)data送Rn,Rn

;為R0-R7之一483.4.1一般傳輸指令MOVRn,direct;將RAM區(qū)direct單元的內(nèi)

;容送Rn,Rn為R0-R7之一MOVdirect,A;將A中內(nèi)容送RAM區(qū)direct

;單元MOVdirect,@Ri;將Ri(R0或R1)所指單元的

;內(nèi)容送direct49MOVdirect2,direct1;將direct1單元的內(nèi)容送;direct2單元MOV@Ri,#data;將8位立即數(shù)送到Ri所指的;內(nèi)部RAM單元MOVDPTR,#data;將16位立即數(shù)送入數(shù)據(jù)指;針寄存器503.4.2累加器傳輸指令字符交換指令XCHA,direct;將direct單元內(nèi)容和A的內(nèi)容;交換XCHA,Rn

;n為0-7之一,將工作寄存器;Rn的內(nèi)容和A的內(nèi)容交換

XCHA,@Ri

;Ri為R0或R1,將Ri所指單元;的內(nèi)容和A的內(nèi)容互換

51累加器高4位和低4位交換指令

SWAPA ;A的高4位和低4位互換累加器低4位和內(nèi)存單元低4位半字節(jié)交換指令

XCHDA,@Ri

;Ri為R0或R1,將Ri所指單元;的低4位與A的低4位互換,高;4位不變。52累加器和外部數(shù)據(jù)存儲器數(shù)據(jù)傳輸指令

MOVXA,@Ri;Ri為R0或R1,將Ri所指外部;存儲器單元內(nèi)容送A MOVX@Ri,A;Ri為R0或R1,將A中內(nèi)容送Ri;所指外部存儲器單元

MOVXA,@DPTR;將16位指針DPTR所指外;部存儲器單元內(nèi)容送A MOVX@DPTR,A;將A中內(nèi)容送DPTR所指外;部存儲器單元53查表指令

MOVCA,@A+PC;將PC值和A的內(nèi)容相加,

;所得值作為新地址,將此地;址單元內(nèi)容送A MOVCA,@A+DPTR;將DPTR中的16位地址

;和A中內(nèi)容相加得新地址,;把此地址內(nèi)容送A

查表指令將PC或DPTR作為首地址,將累加器的內(nèi)容作為位移量,可用來對程序存儲器中所存的表格進行檢索。54堆棧指令

PUSHdirect;先將SP加1,再將direct所指單;元內(nèi)容推入SP+1所指的堆棧單;元

實例:

PUSHDPH;先將SP加1,再將數(shù)據(jù)指針高位;DPH推入堆棧SP+1單元

PUSHDPL;先將SP加1,再將數(shù)據(jù)指針低位

;DPL推入堆棧SP+1單元

55

POPdirect;先將SP單元的內(nèi)容彈出到direct單元,;再將SP減1實例:POPDPH;先將棧頂SP的內(nèi)容彈出到數(shù)據(jù)指針的;高8位DPH,再將SP減1POPDPL;先將棧頂SP的內(nèi)容彈出到數(shù)據(jù)指針的;低8位DPL,再將SP減1568051數(shù)據(jù)傳送指令路徑圖573.5算術(shù)運算指令

3.5.1加法指令一般加法指令

ADDA,Rn

;將A的內(nèi)容和Rn的內(nèi)容相加,結(jié)果在A中

ADDA,@Ri

;Ri為R0或R1,將A的內(nèi)容和Ri所指的片內(nèi)

;

RAM單元的內(nèi)容相加,結(jié)果在A中

ADDA,#data;立即數(shù)和A的內(nèi)容相加,結(jié)果在A中

ADDA,direct;direct所指單元的內(nèi)容和A相加,結(jié)果

;

在A中5859說明:(1)一般加法指令會影響CY、AC、OV、P這幾個標志;若D7、D6中只有一位有進位,則溢出標志OV=1;若D7、D6中均有進位或均無進位,則溢出標志OV=0;若D3向D4有進位,則AC=1;若A中“1”的個數(shù)為偶數(shù),則P=0,否則,P=1;(2)一般加法指令都是利用累加器執(zhí)行的;(3)另一個操作數(shù)可以通過寄存器尋址、寄存器間址、立即數(shù)尋址或直接尋址這4種方式獲得。帶進位的加法指令

ADDCA,Rn;(A)←(A)+(Rn)+CY,Rn為R0~R7之一

ADDCA,@Ri;(A)←(A)+((Ri))+CY,Ri為R0或R1

ADDCA,#data

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

ADDCA,direct;(A)←(A)+(direct)+CY6061說明:(1)帶進位的加法運算指令用在多字節(jié)加法中;(2)和一般加法運算指令一樣,帶進位加法指令會影響AC、CY、OV、P標志;若D7、D6中只有一位有進位,則溢出標志OV為1;若D7、D6中均有進位或均無進位,則溢出標志OV為0;若D3向D4有進位,則AC=1;若A中“1”的個數(shù)為偶數(shù),則P=0,否則,P=1;(3)帶進位加法實際上分二步完成,第一步將累加器的內(nèi)容和上一次運算產(chǎn)生的CY相加,第二步再和另一個操作數(shù)相加。第一個操作數(shù)總是在A中,第二個操作數(shù)則可通過立即數(shù)、寄存器尋址、寄存器間址、直接尋址得到。增量指令

INCA

;累加器內(nèi)容加1

INCRn;寄存器Rn(Rn為R0~R7之一)內(nèi)容加1

INC@Ri

;Ri(R0或R1)所指的RAM單元內(nèi)容加1

INCdirect;direct所指的內(nèi)存單元內(nèi)容加1

INCDPTR;16位數(shù)據(jù)指針DPTR內(nèi)容加1

說明:

(1)增量指令不影響標志位;(2)DPTR是8051內(nèi)部唯一可以進行增量運算的16位寄存器。62十進制調(diào)整指令63DAA;對A中的BCD碼加法結(jié)果進;十進制調(diào)整十進制調(diào)整指令總是緊跟在BCD碼加法運算后面使用,以對A中的BCD碼加法結(jié)果進調(diào)整,這與其他匯編語言中的十進制調(diào)整指令功能相同。3.5.2減法指令帶借位的減法指令

SUBBA,Rn

;A中內(nèi)容減去進位位CY,再減去Rn中內(nèi)容, ;結(jié)果在A中 SUBBA,@Ri;A中內(nèi)容減去進位位CY,再減去Ri所指的片 ;內(nèi)RAM單元內(nèi)容,結(jié)果在A中 SUBBA,#data;A中內(nèi)容減去進位位CY,再減去立即數(shù) ;

data,結(jié)果在A中 SUBBA,direct;A中內(nèi)容減去進位位CY,再減去direct所;指的片內(nèi)RAM單元內(nèi)容,結(jié)果在A中64說明:(1)SUBB指令總是利用累加器A執(zhí)行,先將A中內(nèi)容減去CY,再減去另一個操作數(shù),結(jié)果在A中。第二個操作數(shù)通過寄存器尋址、寄存器間接尋址、立即數(shù)尋址或直接尋址得到。

(2)SUBB指令執(zhí)行時會影響標志位CY、AC、OV、P。運算時,若最高位有借位,則CY為1,否則CY為0;若第3位有借位,則AC為1,否則AC為0;若D7、D6中只有一位有借位,則溢出標志OV為1;若D7、D6中均有借位或均無借位,則溢出標志OV為0。65減量指令DECA

;累加器內(nèi)容減1DECRn

;Rn(Rn為R0-R7之一)的內(nèi)容減1DEC@Ri;Ri(R0或R1)所指的片內(nèi)RAM單元內(nèi)容減1DECdirect;direct所指的片內(nèi)RAM單元內(nèi)容減1例如,當R1的內(nèi)容為50H,RAM的4F單元中為30H時,執(zhí)行如下指令:DECR1;將R1中50H減1,結(jié)果為4FHDEC@R1 ;將R1所指的4FH單元中30H減1,結(jié)果;為2FH66說明:(1)減量指令不影響任何標志位;(2)減量指令的操作數(shù)可以來自累加器A、工作寄存器Rn,Ri間址或直接尋址的RAM單元。673.5.3乘法指令和除法指令

MULAB;將累加器A和寄存器B中的兩個8位無符號數(shù)相乘,得16位積,低8位在A中,高8位在B中

說明:乘法指令影響OV標志,當乘積大于0FFH時,OV置1,否則清0,另外,乘法指令總使CY清零。

68除法指令

DIVAB;將累加器A中的8位無符號數(shù)除以B寄存器的8位無符號數(shù),商在A中,余數(shù)在B中。

說明:除法指令影響OV,當除數(shù)為0時,OV為1,其他情況,OV為0,此外,總使CY清0。693.6邏輯運算指令3.6.1單操作數(shù)指令

CLRA;A清0,不影響標志位

CPLA;A中內(nèi)容逐位取反

RRA;A中內(nèi)容循環(huán)右移一位,

;最低位D0移到D7

RLA;A中內(nèi)容循環(huán)左移一位,

;即D7移到D0,D0移到D1等。7071RRCA;CY進入A的最高位,A的最低位進入CY,;

D2進入D1等RLCA;A的最高位進入CY,原CY進入A的最低

;位D0,D0進入D1等圖3-2循環(huán)移位指令執(zhí)行示意圖

3.6.2雙操作數(shù)指令邏輯與指令ANLA,Rn;Rn(R0-R7之一)中內(nèi)容與A中內(nèi);容相與,結(jié)果在A中ANLA,@Ri;Ri(R0或R1)所指的片內(nèi)RAM單;元內(nèi)容與A中內(nèi)容相與,結(jié)果在A中。 ANLA,#data;立即數(shù)與A中內(nèi)容相與,結(jié)果在A ;中。ANLA,direct;direct所指的內(nèi)部RAM單元內(nèi)容 ;與A中內(nèi)容相與,結(jié)果在A中

72

ANLdirect,A ;direct所指的RAM單元 ;內(nèi)容與A中內(nèi)容相與, ;結(jié)果在direct所指的單元。 ANLdirect,#data ;立即數(shù)data和direct所指的 ;片內(nèi)RAM單元內(nèi)容相與, ;結(jié)果在direct所指單元73說明:通常清況下,邏輯與指令的一個操作數(shù)在A中,另一個通過寄存器尋址、寄存器間接尋址、立即數(shù)尋址、直接尋址獲得,此外,內(nèi)存單元內(nèi)容可直接和一個立即數(shù)相與。邏輯與指令不影響任何標志位。例如:ANLP0,#01101110B;將P0口中的D7、D4、D0位清0,其他位不變。74邏輯或指令ORLA,@Ri;Ri(R0或R1)所指的片內(nèi)RAM單元內(nèi) ;容與A中內(nèi)容相或,結(jié)果在A中ORLA,#data;立即數(shù)與A中內(nèi)容相或,結(jié)果在A中ORLA,direct;direct所指的片內(nèi)RAM單元內(nèi)容與 ;A中內(nèi)容相或,結(jié)果在A中ORLdirect,A;direct所指的RAM單元內(nèi)容與A中;內(nèi)容相或,結(jié)果在direct所指單元ORLdirect,#data;立即數(shù)data和direct所指的;RAM單元內(nèi)容相或,結(jié)果在;direct所指單元75說明:通常情況下,邏輯或指令的一個操作數(shù)在A中,另一個通過寄存器尋址、寄存器間址、立即數(shù)尋址、直接尋址獲得,此外,內(nèi)存單元內(nèi)容可直接和一個立即數(shù)相或。邏輯或指令不影響任何標志位。

例如:A中為10001100,即8CH,執(zhí)行指令 ORLA,#11010011B

后,則A中內(nèi)容為11011111,即DFH。

又如:ORLP1,#00001100B

使P1口的D3、D2兩位置1,其他位不變。763.6.3邏輯異或指令

XRLA,Rn ;

XRLA,@Ri ;

XRLA,#data ;

XRLA,direct ;

XRLdirect,A ;

XRLdirect,#data;77說明:和與指令、或指令一樣,異或指令不影響標志位。將一個數(shù)和某些位為1的另一個數(shù)異或,就可以對前一個數(shù)的對應位取反。因此,異或指令常用來對某幾個位取反。兩個相等的數(shù)異或,結(jié)果為0,因此,異或指令也用來判相等。例如:A中內(nèi)容為10110010,即B2H,執(zhí)行指令 XRLA,#11000001B則累加器A中為01110011B,將A中的D0,D6,D7位取反。又如: XRLP1,#001000001B將P1口D0、D5兩位取反。783.7轉(zhuǎn)移控制指令3.7.1調(diào)用和返回指令3.7.2無條件轉(zhuǎn)移指令3.7.3條件轉(zhuǎn)移指令3.7.4比較轉(zhuǎn)移指令3.7.5循環(huán)轉(zhuǎn)移指令793.7.1調(diào)用和返回指令絕對調(diào)用指令

絕對調(diào)用指令限在2K空間內(nèi)調(diào)用,所以,地址只用11位,格式為: ACALLaddr11;addr11為11位地址,高3位 ;為頁地址,低8位為頁內(nèi)地址80長調(diào)用指令

長調(diào)用指令可以在64K空間內(nèi)調(diào)用,這是為適應MCS-51的擴展程序存儲器而設(shè)置的。格式為:

LCALLaddr16;addr16為16位地址81返回指令

子程序返回指令

RET;既適用于絕對調(diào)用,也適用于長調(diào)用

中斷返回指令

RETI;執(zhí)行RETI后,必須再執(zhí)行一條指令,;才會響應新的中斷。823.7.2無條件轉(zhuǎn)移指令絕對無條件轉(zhuǎn)移指令這一指令提供11位地址,可在2K范圍內(nèi)轉(zhuǎn)移,格式為:

AJMPaddr11;addr11為11位地址,高3位為頁地址,低8位為頁內(nèi)地址無條件長轉(zhuǎn)移指令這一指令可在64K范圍內(nèi)轉(zhuǎn)移,這是為了適應MCS-51可擴展到64K程序存儲器空間而設(shè)置的。格式為:

LJMPaddr16 ;addr16為16位轉(zhuǎn)移地址83無條件相對轉(zhuǎn)移指令相對轉(zhuǎn)移指令可在本指令-128~+127范圍內(nèi)轉(zhuǎn)移。格式為:

SJMPrel

;rel為8位帶符號的相對地址, ;范圍為-128~+127無條件間接轉(zhuǎn)移指令

JMP@A+DPTR;A中為8位無符號數(shù),;DPTR為16位數(shù)據(jù)指針無條件間接轉(zhuǎn)移指令把累加器A中的8位無符號數(shù)和16位數(shù)據(jù)指針相加,結(jié)果作為轉(zhuǎn)移地址送PC。運算過程中不影響A和DPTR中的內(nèi)容,也不影響標志。843.7.3條件轉(zhuǎn)移指令JZrel

;JNZrel

;JCrel

;JNCrel

;853.7.4比較轉(zhuǎn)移指令格式:CJNE(目的字節(jié)),(源字節(jié)),rel這是一條三字節(jié)指令,它將目的字節(jié)和源字節(jié)比較,如不等,則按相

溫馨提示

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

最新文檔

評論

0/150

提交評論