第4講 51單片機指令系統(tǒng)教材_第1頁
第4講 51單片機指令系統(tǒng)教材_第2頁
第4講 51單片機指令系統(tǒng)教材_第3頁
第4講 51單片機指令系統(tǒng)教材_第4頁
第4講 51單片機指令系統(tǒng)教材_第5頁
已閱讀5頁,還剩103頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四講

51單片機指令系統(tǒng)3/20/202414.18051指令系統(tǒng)概述4.2尋址方式4.3指令說明4.4偽指令4.5實用程序設計3/20/202424.18051指令系統(tǒng)概述4.1.1指令、指令系統(tǒng)的概念指令:為使計算機內部執(zhí)行一種操作,而提供給用戶編程使用的一種命令。機器語言:計算機只能識別二進制代碼,以二進制代碼來描述指令功能的語言,稱之為機器語言。匯編語言:由于機器語言不便被人們識別、記憶、理解和使用,因此給每條機器語言指令賦予助記符號來表示,這就形成了匯編語言。也就是說,匯編語言是便于人們識別、記憶、理解和使用的一種指令形式,它和機器語言指令一一對應。3/20/20243指令系統(tǒng):計算機能夠執(zhí)行的全部操作所對應的指令集合,稱為這種計算機的指令系統(tǒng)。指令的三種屬性:功能、時間和空間。功能屬性:是指每條指令都對應一個特定的操作功能;時間屬性:是指一條指令執(zhí)行所用的時間,一般用機器周期來表示;空間屬性:是指一條指令在程序存儲器中存儲所占用的字節(jié)數(shù)。

指令的兩種描述形式:機器語言形式和匯編語言形式。采用機器語言編寫的程序稱之為目標程序。采用匯編語言編寫的程序稱之為源程序。3/20/20244時間屬性劃分:單機器周期指令(64條)、雙機器周期指令(45條)和只有乘、除法兩條4個機器周期的指令。4.1.2

MCS-51單片機指令系統(tǒng)

MCS-51單片機指令系統(tǒng)具有功能強、指令短、執(zhí)行快等特點,共有111條指令。功能上劃分:數(shù)據(jù)傳送、算術操作、邏輯操作、程序轉移、位操作等五大類。空間屬性劃分:單字節(jié)指令(49條)、雙字節(jié)指令(46條)和三字節(jié)指令(只有16條)。3/20/20245每條指令通常由操作碼和操作數(shù)兩部分組成。操作碼:表示計算機執(zhí)行該指令將進行何種操作,操作數(shù):表示參加操作的數(shù)的本身或操作數(shù)所在的地址。4.1.3匯編指令行格式[標號:]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋]

MCS-51單片機的指令有無操作數(shù)、單操作數(shù)、雙操作數(shù)三種情況。匯編語言指令有如下的格式:3/20/202464.1.4常用的縮寫符號A——累加器。B——寄存器,用于MUL和DIV指令中。C——進位標志或進位位。@——間接尋址寄存器或基址寄存器的前綴,如@Ri,@DPTR。direct——8位內部RAM單元的地址。可以是一個內部數(shù)據(jù)區(qū)RAM單元(00H~7FH)地址

特殊功能寄存器地址(I/O端口、控制寄存器、狀態(tài)寄存器80H~0FFH)。#data——8位立即數(shù),指令中的8位常數(shù)。#data16——16位立即數(shù),指令中的16位常數(shù)。3/20/20247X——

表示寄存器名。(X)——表示X單元中的內容。((X))——表示以X單元的內容為地址的存儲器單元內容,即(X)作地址,該地址單元的內容用((X))表示。/——位操作數(shù)的前綴,表示對該位取反。rel

——8位帶符號的偏移量字節(jié),用于SJMP和所有條件轉移指令中。偏移量相對于下一條指令的第一個字節(jié)計算,在-128~+127范圍內取值。→——表示操作流程,將箭尾一方的內容送入箭頭所指另一方的單元中去。$——指本條指令起始地址。3/20/202484.2尋址方式所謂尋址方式,就是指令給出參與運算的操作數(shù)的有效地址的方式。在MCS-51單片機指令系統(tǒng)中,有以下7種尋址方式:

(1)立即尋址;

(2)直接尋址;

(3)寄存器尋址;

(4)寄存器間接尋址;

(5)基址寄存器加變址寄存器間接尋址;

(6)相對尋址;

(7)位尋址;3/20/20249寄存器尋址按所選定的工作寄存器R0~R7進行操作,指令機器碼的低3位的八種組合000,001,…,110,111分別指明所用的工作寄存器R0,R1,…,R6,R7。

如:MOVA,Rn(n=0~7),這8條指令對應的機器碼分別為E8H~EFH。4.2.1寄存器尋址

在指令選定的某寄存器的內容作為操作數(shù),以完成指令規(guī)定的操作,稱為寄存器尋址。例如:MOV

A,R0指令中源操作數(shù)R0和目的操作數(shù)A都是寄存器尋址。該指令的功能是把工作寄存器R0中的內容傳送到累加器A中,如R0中的內容為30H,則執(zhí)行該指令后A的內容也為30H。3/20/202410

累加器A,寄存器B、數(shù)據(jù)指針DPTR和布爾處理器的位累加器Cy也可用寄存器尋址方式訪問。例如:MOVA,40H指令中的源操作數(shù)40H就是直接尋址,40H為操作數(shù)的地址。該指令的功能是把片內RAM地址為40H單元的內容送到A中。該指令的機器碼為E5H40H,8位直接地址在指令操作碼中占一個字節(jié)。4.2.2直接尋址

指令中直接給出操作數(shù)所在的存儲器地址,以供取數(shù)或存數(shù)的尋址方式稱為直接尋址。3/20/202411位地址空間。在MCS-51單片機指令系統(tǒng)中,直接尋址方式中可以訪問3種存儲器空間:內部數(shù)據(jù)存儲器的低128個字節(jié)單元(00H~7FH)。特殊功能寄存器。特殊功能寄存器只能用直接尋址方式進行訪問。3/20/2024124.2.3寄存器間接尋址由指令指出某一寄存器的內容作為操作數(shù)地址的尋址方法,稱為寄存器間接尋址。注意:寄存器中的內容不是操作數(shù)本身,而是操作數(shù)的地址,到該地址單元中才能得到操作數(shù)。寄存器起地址指針的作用。尋址內部RAM區(qū)的數(shù)據(jù)時,可使用寄存器R0、R1(、SP)作為地址指針。當訪問外部RAM時,可使用R0、R1及DPTR作為地址指針。寄存器間接尋址符號為“@”3/20/202413例如:MOVA,@R1指令的源操作數(shù)@R1是寄存器間接尋址。該指令的功能是將以工作寄存器R1中的內容為地址的片內RAM單元的數(shù)據(jù)傳送到A中去。例如:若R1中的內容為80H,片內RAM地址為80H的單元中的內容為2FH,則執(zhí)行該指令后,片內RAM80H單元的內容2FH被送到A中。寄存器間接尋址示意圖如圖3.1所示。3/20/2024144.2.4立即尋址立即尋址方式是指操作數(shù)包含在指令字節(jié)中。跟在指令操作碼后面的數(shù)就是參加運算的數(shù),該操作數(shù)稱為立即數(shù)。

匯編指令中,在一個數(shù)的前面冠以"#"符號作前綴,就表示該數(shù)為立即尋址。例如:MOV

A,#30H指令中30H就是立即數(shù)。這一條指令的功能是執(zhí)行將立即數(shù)30H傳送到累加器A中的操作。3/20/2024154.2.5

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

基址寄存器DPTR或PC的內容為基本地址,加上變址寄存器A的內容作為操作數(shù)的地址。MOVCA,@A+DPTRMOVCA,@A+PC3/20/2024164.2.6相對尋址

例如:SJMPrel

執(zhí)行該指令時,先將PC+2,再把指令中帶符號的偏移量加到PC上,得到跳轉的目標地址送入PC。相對尋址是以當前程序計數(shù)器PC值加上指令中給出的偏移量rel,而構成實際操作數(shù)地址的尋址方法。指令中給出的偏移量是一個8位帶符號的常數(shù),可正可負,其范圍為-128~+127。常出現(xiàn)在相對轉移指令中。3/20/2024174.2.7位尋址位尋址是在位操作指令中直接給出位操作數(shù)的地址,可以對片內RAM中的128位和特殊功能寄存器SFR中的93位進行尋址。例如:MOVC,bit3/20/2024184.3指令說明1、數(shù)據(jù)傳送指令2、程序轉移指令3、算術運算指令4、邏輯運算指令5、位運算指令3/20/2024194.3.1數(shù)據(jù)傳送指令1、內部數(shù)據(jù)傳送指令(1)以累加器A為目的操作數(shù)的指令MOVA,Rnn=0~7MOVA,directMOVA,@Rii=0,1MOVA,#data這組指令的功能是:把源操作數(shù)的內容送入累加器A。3/20/202420(2)以Rn為目的操作數(shù)的指令MOVRn,AMOVRn,directMOVRn,#data這組指令的功能是:把源操作數(shù)的內容送入當前工作寄存器區(qū)的R0~R7中的某一個寄存器。3/20/202421(3)以直接尋址的單元為目的操作數(shù)的指令

MOVdirect,AMOVdirect,Rn

MOVdirect,directMOVdirect,@Ri

MOVdirect,#data這組指令的功能是:把源操作數(shù)的內容送入內部RAM單元或特殊功能寄存器(直接地址指出的存儲單元)。3/20/202422(4)以寄存器間接尋址的單元為目的操作數(shù)指令MOV@Ri,AMOV@Ri,directMOV@Ri,#data這組指令的功能是:把源操作數(shù)的內容送入R0,R1所指出的內部RAM單元。(5)16位數(shù)據(jù)傳送指令MOVDPTR,#data16這組指令的功能是:將16位的立即數(shù)送入數(shù)據(jù)指針寄存器DPTR。3/20/202423MOVR0,#30H;(R0)←30HMOVA,@R0 ;(A)←((R0))MOVR1,A ;(R1)←(A)MOVB,@R1 ;(B)←((R1))MOV@R1,P1 ;((R1))←(P1)MOVP2,P1 ;(P2)←(P1)MOV10H,#20H ;(10H)←20H執(zhí)行上述指令后的結果為:

(R0)=30H,(R1)=(A)=40H,

(B)=10H,(40H)=(P1)=(P2)=CAH,

(10H)=20H。例1

設內部RAM(30H)=40H,(40H)=10H,(10H)=00H(P1)=CAH,分析以下程序執(zhí)行后各單元及寄存器、

P2口的內容。3/20/2024242、查表指令訪問程序存儲器的數(shù)據(jù)傳送指令又稱作查表指令,采用基址寄存器加變址寄存器間接尋址方式,把程序存儲器中存放的表格數(shù)據(jù)讀出,傳送到累加器A。MOVCA,@A+PC以PC作為基址寄存器,A的內容作為無符號數(shù)和PC的內容(下一條指令的起始地址)相加后得到一個16位的地址,并將該地址指出的程序存儲器單元的內容送到累加器A。3/20/202425MOVCA,@A+DPTR這條指令的執(zhí)行結果只與指針DPTR及累加器A的內容有關,與該指令存放的地址無關。因此,表格的大小和位置可以在64KB程序存儲器中任意安排,并且一個表格可以為各個程序塊所共用。指令是以DPTR作為基址寄存器,累加器A的內容作為無符號數(shù)與DPTR內容相加,得到一個16位的地址,并把該地址指出的程序存儲器單元的內容送到累加器A。3/20/202426如果用以DPTR為基址寄存器的查表指令,其程序如下:MOVDPTR,2000H ;置表首地址MOVA,09HMOVCA,@A+DPTR例:從片外程序存儲器2000H單元開始存放0~9的平方值,以PC作為基址寄存器進行查表得9的平方值。3/20/202427

完成上述功能的程序如下:MOVA,#03H ;(A)←03HPUSHDPH ;保護DPTR高8位入棧PUSHDPL ;保護DPTR低8位入棧MOVDPTR,#2000H;(DPTR)←2000HMOVCA,@A+DPTR ;(A)←(2000H+03H)POPDPL ;彈出DPTR低8位POPDPH ;彈出DPTR高8位執(zhí)行結果:(A)=09H,(DPTR)=3A00H。例若在外部程序存儲器中2000H單元開始依次存放0~9的平方值,數(shù)據(jù)指針(DPTR)=3A00H,用查表指令取得2003H單元的數(shù)據(jù)后,要求保持DPTR中的內容不變。3/20/2024283、累加器A與外部數(shù)據(jù)存儲器傳送指令

MOVXA,@DPTRMOVXA,@Ri

MOVX@DPTR,AMOVX@Ri,ADPTR所包含的16位地址信息由P0(低8位)和P2(高8位)輸出,而數(shù)據(jù)信息由P0口傳送,P0口作分時復用的總線。由Ri作為間接尋址寄存器時,P0口上分時輸出Ri指定的8位地址信息及傳輸8位數(shù)據(jù)。

這組指令是:在累加器A與外部數(shù)據(jù)存儲器RAM單元或I/O口之間進行數(shù)據(jù)傳送。前兩條指令執(zhí)行時,P3.7

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

引腳上輸出WR有效信號,用作外部數(shù)據(jù)存儲器的寫選通信號。3/20/202429例:設外部RAM(0203H)=FFH,分析以下指令執(zhí)行后的結果。

MOVDPTR,#0203H

;(DPTR)←0203HMOVXA,@DPTR

;(A)←((DPTR))MOV30H,A

;(30H)←(A)

MOVA,#0FH

;(A)←0FHMOVX@DPTR,A

;((DPTR))←(A)執(zhí)行結果為:(DPTR)=0203H,(30H)=FFH,(0203H)=(A)=0FH。3/20/2024304、字節(jié)交換指令XCHA,RnXCHA,@RiXCHA,direct將累加器A的內容和源操作數(shù)內容相互交換。3/20/2024315、堆棧操作指令在MCS-51單片機的內部RAM中,可以設定一個先進后出的區(qū)域,稱其為堆棧。在特殊功能寄存器中有一個堆棧指針SP,它指出棧頂?shù)奈恢?。PUSHdirect;進棧指令POPdirect;出棧指令進棧指令的功能是:首先將堆棧指針SP的內容加1,然后將直接地址所指出的內容送入SP指出的內部RAM單元;

出棧指令的功能是:將SP所指出的內部RAM單元的內容送入由直接地址所指出的字節(jié)單元,接著將堆棧指針SP的內容減1。3/20/202432例如:

進入中斷服務子程序時,把程序狀態(tài)寄存器PSW、累加器A、數(shù)據(jù)指針DPTR進棧保護。設當前SP為60H。

PUSHPSWPUSHACCPUSHDPLPUSHDPH執(zhí)行后,SP內容修改為64H,而61H、62H、63H、64H單元中依次棧入PSW、A、DPL、DPH的內容。當中斷服務程序結束之前,如下程序段(SP保持64H不變)

POPDPHPOPDPLPOPACCPOPPSW執(zhí)行之后,SP內容修改為60H,而64H、63H、62H、61H單元中的內容依次彈出到DPH、DPL、A、PSW中。3/20/2024334.3.2程序轉移指令1、無條件轉移指令這是2KB范圍內的無條件跳轉指令,執(zhí)行該指令時,先將PC+2,然后將addr11送入PC10~PC0,而PC15~PC11保持不變。這樣得到跳轉的目的地址。需要注意的是,目標地址與AJMP后面一條指令的第一個字節(jié)必須在同一個2KB區(qū)域的存儲器區(qū)內。短跳轉指令

AJMPaddr113/20/202434

執(zhí)行該指令時,將16位目標地址addr16

裝入PC,程序無條件轉向指定的目標地址。轉移的目標地址可以在64KB程序存儲器地址空間的任何地方,不影響任何標志。長跳轉指令LJMPaddr16相對轉移指令

SJMPrel執(zhí)行該指令時,先將PC+2,再把指令中帶符號的偏移量加到PC上,得到跳轉的目標地址送入PC。3/20/202435執(zhí)行該指令時,把累加器A中的8位無符號數(shù)與數(shù)據(jù)指針中的16位數(shù)相加,結果作為下條指令的地址送入PC,不改變累加器A和數(shù)據(jù)指針DPTR的內容,也不影響標志。利用這條指令能實現(xiàn)程序的散轉。散轉指令JMP@A+DPTR3/20/202436例:

根據(jù)累加器A的值,轉不同處理程序的入口。

MOVDPTR,#TABLE ;表首地址送DPTRJMP@A+DPTR ;根據(jù)A值轉移

TABLE:AJMPTAB1 ;當(A)=0時轉TAB1執(zhí)行

AJMPTAB2;當(A)=2時轉TAB2執(zhí)行

AJMPTAB3 ;當(A)=4時轉TAB3執(zhí)行3/20/202437無條件轉移指令3/20/2024382、條件轉移指令

條件轉移指令是當某種條件滿足時,程序轉移執(zhí)行;條件不滿足時,程序仍按原來順序執(zhí)行。轉移的條件可以是上一條指令或更前一條指令的執(zhí)行結果(常體現(xiàn)在標志位上),也可以是條件轉移指令本身包含的某種運算結果。

由于該類指令采用相對尋址,因此程序可在以當前PC值為中心的-128~+127范圍內轉移。3/20/202439JZrel;(A)=0轉移JNZrel;(A)≠0轉移JCrel;若(Cy)=1,則轉移PC←(PC)+2+relJNCrel;若(Cy)=0,則轉移PC←(PC)+2+relJBbit,rel;若(bit)=1,則轉移PC←(PC)+3+relJNBbit,rel;若(bit)=0,則轉移PC←(PC)+3+relJBCbit,rel;若(bit)=1,則轉移PC←(PC)+3+rel,并bit←03/20/202440

例:將片外RAM首地址為DATA1的一個數(shù)據(jù)塊轉送到片內RAM首地址為DATA2的存儲區(qū)中。外部RAM向內部RAM的數(shù)據(jù)轉送一定要經(jīng)過累加器A,利用判零條件轉移正好可以判別是否要繼續(xù)傳送或者終止。完成數(shù)據(jù)傳送的參考程序如下:

MOVR0,#DATA1;R0作為外部數(shù)據(jù)塊的地址指針

MOVR1,#DATA1;R1作為內部數(shù)據(jù)塊的地址指針LOOP:MOVXA,@R0;取外部RAM數(shù)據(jù)送入AHERE:JZHERE ;數(shù)據(jù)為零則終止傳送

MOV@R1,A ;數(shù)據(jù)傳送至內部RAM單元

INCR0 ;修改指針,指向下一數(shù)據(jù)地址

INCR1 SJMPLOOP ;循環(huán)取數(shù)3/20/202441

比較轉移指令共有4條。這組指令是先對兩個規(guī)定的操作數(shù)進行比較,根據(jù)比較的結果來決定是否轉移。若兩個操作數(shù)相等,則不轉移,程序順序執(zhí)行;若兩個操作數(shù)不等,則轉移。3、比較不相等轉移指令

CJNE比較是進行一次減法運算,但其差值不保存,兩個數(shù)的原值不受影響,而標志位要受到影響。如果第一個操作數(shù)小于第二個操作數(shù),則置位進位標志CY,否則,清“0”CY.

利用標志位CY作進一步的判斷,可實現(xiàn)三分支轉移。3/20/202442CJNEA,direct,rel

CJNEA,#data,rel

CJNERn,#data,rel

CJNE@Ri,#data,rel

例:

當從P1口輸入數(shù)據(jù)為01H時,程序繼續(xù)執(zhí)行,否則等待,直到P1口出現(xiàn)01H。參考程序如下:

MOVA,#01H ;立即數(shù)01H送AWAIT:CJNEA,P1,WAIT ;(P1)≠01H,則等待3/20/202443

減1條件轉移指令有兩條。每執(zhí)行一次這種指令,就把第一操作數(shù)減1,并把結果仍保存在第一操作數(shù)中,然后判斷是否為零。若不為零,則轉移到指定的地址單元,否則順序執(zhí)行。4、減1不為0轉移指令DJNZ這組指令對于構成循環(huán)程序是十分有用的,可以指定任何一個工作寄存器或者內部RAM單元作為循環(huán)計數(shù)器。每循環(huán)一次,這種指令被執(zhí)行一次,計數(shù)器就減1。預定的循環(huán)次數(shù)不到,計數(shù)器不會為0,轉移執(zhí)行循環(huán)操作;到達預定的循環(huán)次數(shù),計數(shù)器就被減為0,順序執(zhí)行下一條指令,也就結束了循環(huán)。3/20/202444DJNZRn,rel

DJNZdirect,rel

例:

將內部RAM從DATA單元開始的10個無符號數(shù)相加,相加結果送SUM單元保存。設相加結果不超過8位二進制數(shù),則相應的程序如下:

MOVR0,#0AH;設置循環(huán)次數(shù)

MOVR1,#DATA;R1作地址指針,指向數(shù)據(jù)塊首地址

CLRA ;A清零LOOP:ADDA,@R1;加一個數(shù)

INCR1 ;修改指針,指向下一個數(shù)

DJNZR0,LOOP;R0減1,不為0循環(huán)

MOVSUM,A;存10個數(shù)相加的和3/20/2024453/20/202446

在程序設計中,通常把具有一定功能的公用程序段編制成子程序,當主程序需要使用子程序時用調用指令,而在子程序的最后安排一條子程序返回指令,以便執(zhí)行完子程序后能返回主程序繼續(xù)執(zhí)行。5、調用及返回指令3/20/202447所用的子程序的入口地址必須與ACALL下面一條指令的第一個字節(jié)在同一個2KB區(qū)域的存儲器區(qū)內。短調用指令ACALLaddr11

3/20/202448

LCALLaddr16

長調用指令3/20/202449子程序返回指令

RET中斷返回指令RETI3/20/202450空操作指令是一條單字節(jié)單周期指令。它控制CPU不做任何操作,僅僅是消耗這條指令執(zhí)行所需要的一個機器周期的時間,不影響任何標志位,故稱為空操作指令。NOP指令在設計延時程序、拼湊精確延時時間及在程序等待或修改程序等場合是很有用的。7、空操作指令NOP;(PC)←(PC)+13/20/2024514.3.3算術運算指令

加、減法指令加減法指令形式結構圖(a)加減法指令關系圖;(b)加1、減1指令關系圖

3/20/2024521、加法指令不帶進位的加法指令

ADDA,Rn

ADDA,directADDA,@Ri

ADDA,#data對標志位的影響:如果位7有進位,則置“1”進位CY;否則清“0”CY.如果位3有進位,則置“1”進位AC;否則清“0”AC.如果位6有進位輸出而位7沒有,或者位7有進位輸出而位6沒有,則置位溢出標志OV,否則清“0”O(jiān)V.3/20/202453帶進位的加法指令ADDCA,Rn

ADDCA,directADDCA,@Ri

ADDCA,#data這組指令的功能與普通加法指令類似,唯一的不同之處是,在執(zhí)行加法時,還要將上一次進位標志Cy的內容也一起加進去。對于標志位的影響也與普通加法指令相同。3/20/202454最后一條指令是對16位的數(shù)據(jù)指針寄存器DPTR執(zhí)行加1操作,指令執(zhí)行時,先對低8位指針DPL的內容加1,當產生溢出時就對高8位指針DPH加1,但不影響任何標志。增量指令INCAINCRn

INCdirectINC@Ri

INCDPTR這組指令的功能是:將指令中所指出操作數(shù)的內容加1。若原來的內容為0FFH,則加1后將產生溢出,使操作數(shù)的內容變成00H,但不影響任何標志。3/20/2024552、減法指令

這組指令的功能是:將累加器A的內容與第二操作數(shù)及進位標志相減,結果送回到累加器A中。若要進行不帶借位的減法操作,則必須先將Cy清“0”。帶進位減法指令

SUBBA,Rn

SUBBA,directSUBBA,@Ri

SUBBA,#data3/20/202456如位6有借位而位7沒有借位,或位7有借位而位6沒有借位,則溢出標志OV置“1”,否則清“0”。對標志位的影響:如果位7(D7)有借位,則進位標志Cy置“1”,否則清“0”;如果位3(D3)有借位,則輔助進位標志AC置“1”,否則清“0”;3/20/202457這組指令的功能是:將指出的操作數(shù)內容減1。如果原來的操作數(shù)為00H,則減1后將產生下溢出,使操作數(shù)變成0FFH,但不影響任何標志。(除A減1影響P)減1指令

DECADECRn

DECdirectDEC@Ri

3/20/2024583、乘法指令這條指令的功能是:將累加器A的內容與寄存器B的內容相乘,乘積的低8位存放在累加器A中,高8位存放于寄存器B中。如果乘積超過0FFH,則溢出標志OV置“1”,

否則清“0”。進位標志Cy總是被清“0”。

MULAB3/20/2024594、除法指令將累加器A中的內容除以寄存器B中的8位無符號整數(shù),所得商的整數(shù)部分存放在累加器A中,余數(shù)部分存放在寄存器B中,清“0”進位標志Cy和溢出標志OV。DIVAB這條指令的功能是:若原來B中的內容為0,則執(zhí)行該指令后A與B中的內容不定,并將溢出標志OV置“1”。在任何情況下,進位標志Cy總是被清“0”。

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

ANLA,Rn

ANLA,directANLA,@Ri

ANLA,#dataANLdirect,AANLdirect,#data4.3.4邏輯運算操作3/20/202462這組指令的功能是:將兩個操作數(shù)的內容按位進行邏輯或操作,并將結果送回目的操作數(shù)的單元中。(2)邏輯或指令

ORLA,Rn

ORLA,directORLA,@Ri

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

XRLA,Rn

XRLA,directXRLA,@Ri

XRLA,#dataXRLdirect,AXRLdirect,#data3/20/202464(4)移位操作RLA;累加器A的內容向左環(huán)移1位RLCA;累加器A的內容帶進位標志位向左環(huán)移1位RRA;累加器A的內容向右環(huán)移1位RRCA;累加器A的內容帶進位標志位向右環(huán)移1位這組指令的功能是:對累加器A的內容進行簡單的邏輯操作。除了帶進位標志位的移位指令外,其它都不影響Cy,AC,OV等標志。3/20/202465

CLRA;對累加器A清“0”CPLA;對累加器A按位取反3/20/202466

位操作也稱布爾變量操作,它是以位(bit)作為單位來進行運算和操作的。MCS-51單片機內部有一個功能相對獨立的布爾處理機,它有借用進位標志CY作為位累加器,有位存儲器(即位尋址區(qū)中的各位),指令系統(tǒng)中有17條專門進行位處理的指令集。位處理指令可以完成以位為對象的數(shù)據(jù)轉送、運算、控制轉移等操作。4.3.5位操作指令3/20/202467

(1)直接地址方式:如0A8H;(2)點操作符方式:如IE.0;(3)位名稱方式:如EX0;(4)用戶定義名方式:如用偽指令BIT定義:

WBZD0BITEX0

經(jīng)定義后,允許指令中使用WBZD0代替EX0。

指令中位地址的表達形式有以下幾種:3/20/202468(1)位變量傳送指令這組指令的功能是:把源操作數(shù)指出的布爾變量送到目的操作數(shù)指定的位地址單元中。

其中一個操作數(shù)必須為進位標志Cy,另一個操作數(shù)可以是任何可直接尋址位。MOVC,bitMOVbit,C3/20/202469(2)位變量修改指令CLRCCLRbitCPLCCPLbitSETBCSETBbit這組指令對操作數(shù)所指出的位進行清“0”,取反,置“1”的操作,不影響其它標志。3/20/202470(3)位變量邏輯操作指令這組指令的功能是:如果源位的布爾值是邏輯0,則將進位標志清“0”;否則,進位標志保持不變,不影響其它標志。位變量邏輯與指令ANLC,bitANLC,/bitbit前的斜杠表示對(bit)取反,直接尋址位取反后用作源操作數(shù),但不改變直接尋址位原來的值。例如指令:ANLC,/ACC.0執(zhí)行前ACC.0為0,C為1,則指令執(zhí)行后C為1,而ACC.0仍為0。3/20/202471位變量邏輯或指令這組指令的功能是:如果源位的布爾值是邏輯1,則將進位標志置“1”;否則,進位標志保持不變,不影響其它標志。ORLC,bitORLC,/bit3/20/202472例:

利用位操作指令,模擬圖所示硬件邏輯電路的功能。3/20/202473

MOVC,P1.1 ;(CY)←(P1.1) ORLC,P1.2 ;(CY)←(P1.1)∨(P1.2)=A ANLC,P1.0;(CY)←(P1.0)∧A CPLC ;(CY)←(P1.0)∧A=B MOVF0,C ;F0內暫存B MOVC,P1.3 ;(CY)←(P1.3) ANLC,/P1.4 ;(CY)←(P1.3)∧(P1.4)=D ORLC,F(xiàn)0 ;(CY)←B∨D MOVP1.5,C ;運算結果送入P1.53/20/2024743/20/2024754.3.6十進制指令(1)半字節(jié)交換指令

XCHDA,@RiSWAPA將累加器A的低4位內容和(Ri)所指出的內部RAM單元的低4位內容相互交換。將累加器A的高4位與低4位之間進行交換。3/20/202476

這條指令對累加器A參與的BCD碼加法運算所獲得的8位結果進行十進制調整,使累加器A中的內容調整為二位壓縮型BCD碼的數(shù)。使用時必須注意,它只能跟在加法指令之后,不能對減法指令的結果進行調整,且其結果不影響溢出標志位。(2)十進制調整指令

DAA執(zhí)行過程:判斷A中的低4位是否大于9和輔助進位標志AC是否為“1”,若兩者有一個條件滿足,則低4位加6操作;同樣,A中的高4位大于9或進位標志Cy為“1”兩者有一個條件滿足時,高4位加6操作。3/20/2024774.4偽指令偽指令不要求計算機做任何操作,也沒有對應的機器碼,不產生目標程序,不影響程序的執(zhí)行,僅僅是能夠幫助進行匯編的一些指令。偽指令主要作用:指定程序或數(shù)據(jù)的起始位置;給出一些連續(xù)存放數(shù)據(jù)的地址;為中間運算結果保留一部分存儲空間;表示源程序結束等等。不同版本的匯編語言,偽指令的符號和含義可能有所不同,但基本用法是相似的。3/20/202478功能:規(guī)定其后面的目標程序或數(shù)據(jù)塊的起始地址。它放在一段源程序(主程序、子程序)或數(shù)據(jù)塊的前面,說明緊跟在其后的程序段或數(shù)據(jù)塊的起始地址就是ORG后面給出的地址。

1、定位偽指令ORG格式:[標號:]ORG地址(十六進制表示)例如:

ORG2000H START:MOVA,#7FH3/20/202479格式:[標號:]END

2、匯編結束偽指令END作用:END是匯編語言源程序的結束標志,表示匯編結束。在END以后所寫的指令,匯編程序都不予處理。一個源程序只能有一個END命令,否則就有一部分指令不能被匯編。3/20/202480

用EQU偽指令對某符號賦值后,該符號的值在整個程序中不能再改變。3、賦值偽指令EQU功能:將表達式的值或寄存器名賦予EQU前面的符號名。格式:符號名EQU表達式或符號名EQU寄存器名例如:

TAB1EQU1000HTAB2EQU2000H

匯編后TAB1、TAB2分別具有值1000H、2000H。3/20/2024814、位地址賦值偽指令BIT格式:

符號名BIT位地址功能:將位地址賦予BIT前面的符號名,經(jīng)賦值后可用該符號名代替BIT后面的位地址。例如:PLGBITF0AIBITP1.0

經(jīng)以上偽指令定義后,在程序中就可以把PLG和AI作為位地址來使用。3/20/202482例如:

ORG2000HTAB1:DB30H,8AH,7FH,73DB'5','A','BCD'5、定義字節(jié)偽指令DB格式:[標號:]DB項或項表其中項或項表指一個字節(jié)數(shù)據(jù),用逗號分開的字節(jié)數(shù)據(jù)串,或以引號括起來的字符串。功能:把項或項表的數(shù)據(jù)(字符串按字符順序以ASCII碼)存入從標號地址開始的連續(xù)存儲單元中。3/20/202483

由于ORG2000H,所以TAB1的地址為2000H,因此,以上偽指令經(jīng)匯編后,將對2000H開始的連續(xù)存儲單元賦值:(2000H)=30H(2001H)=8AH(2002H)=7FH(2003H)=49H;十進制數(shù)73以十六進制數(shù)存放(2004H)=35H;35H是數(shù)字5的ASCII碼(2005H)=41H;41H是字母A的ASCII碼(2006H)=42H;42H是字符串'BCD'中B的ASCII碼(2007H)=43H;43H是字符串'BCD'中C的ASCII碼(2008H)=44H;44H是字符串'BCD'中D的ASCII碼3/20/202484例如:

ORG1500HTAB2:DW1234H,80H

匯編以后:(1500H)=12H,

(1501H)=34H,

(1502H)=00H,

(1503H)=80H6、定義字偽指令DW格式:[標號:]DW項或項表DW偽指令與DB相似,但用于定義字的內容。項或項表指所定義的一個字(兩個字節(jié))或用逗號分開的字串。匯編時,機器自動按高8位先存入,低8位在后的格式排列。3/20/2024857、數(shù)據(jù)賦值偽指令DATA用于給一個8位的內部RAM單元起一個名字。同一個單元可以有多個名字。格式:名字DATA直接字節(jié)地址8、數(shù)據(jù)賦值偽指令XDATA用于給一個8位的外部RAM單元起一個名字。同一個單元可以有多個名字。格式:名字XDATA直接字節(jié)地址3/20/2024864.5實用程序設計4.5.1程序結構的三種形式

1.三種形式順序結構、分支結構、循環(huán)結構2.匯編語言程序設計步驟:

◆分析問題

◆確定算法

◆設計程序流程圖

◆分配內存單元

◆編寫匯編語言源程序

◆調試程序3/20/202487【例】將30H單元內的兩位BCD碼拆開并轉換成ASCII碼,存入RAM兩個單元中。ORG 0030HMOV 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碼開始4.5.2順序結構程序設計3/20/2024881.分支程序有三種基本形式,即單分支、雙分支、多分支。

2.分支程序的設計要點如下:(1)先建立可供條件轉移指令測試的條件。(2)選用合適的條件轉移指令。(3)在轉移的目的地址處設定標號。條件滿足?AYN(a)條件滿足?ABNY(b)(c)A0A1AnK=0K=1…K=nK=?……4.5.3分支程序設計單分支雙分支多分支3/20/2024893.

分支程序設計舉例【例】設X存在30H單元中,根據(jù)下式

X+2 X>0Y= 100 X=0。

∣X∣ X<0A為負數(shù)?取數(shù),A←(30H)開始結束A=0?YNNA←|X|A←64HA←X+2存數(shù)(31H)←A(30H)求出Y值,將Y值存入31H單元。3/20/202490分析:根據(jù)數(shù)據(jù)的符號位判別該數(shù)的正負,若最高位為0,再判別該數(shù)是否為0。參考程序如下:

ORG 0030HMOV A,30H ;取數(shù)

JB ACC.7,NEG

;負數(shù),轉NEG

JZ ZER0

;為零,轉ZER0ADD A,#02H ;為正數(shù),求X+2AJMPSAV ;轉到SAVE,保存數(shù)據(jù)ZER0:MOV A,#64H ;數(shù)據(jù)為零,Y=100AJMPSAV ;轉到SAVE,保存數(shù)據(jù)

NEG:DECA ;

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

SJMP $ ;暫停

END3/20/202491

4.5.4多分支程序設計-散轉程序

散轉程序是分支程序的一種,它可根據(jù)運算結果或輸入數(shù)據(jù)將程序轉入不同的分支。

MCS-51指令系統(tǒng)中有一條跳轉指令JMP@A+DPTR,用它可以很容易地實現(xiàn)散轉功能。該指令把累加器的8位無符號數(shù)與16位數(shù)據(jù)指針的內容相加,并把相加的結果裝入程序計數(shù)器PC,控制程序轉向目標地址去執(zhí)行。例根據(jù)工作寄存器R0內容的不同,使程序轉入相應的分支。(R0)=0對應的分支程序標號為ONE;(R0)=1對應的分支程序標號為TWO;

(R0)=N對應的分支程序標號為PRN。3/20/202492程序如下:LP0:MOVDPTR,#TABLE;取表頭地址

MOVA,R0ADDA,R0;R0內容乘以2JNCLP1;無進位轉移

INCDPH;加進位位LP1:JMP@A+DPTR;跳至散轉表中相應位置

TABLE:AJMPONEAJMPTWOAJMPTHREEAJMPFOURAJMPPRN3/20/2024931.循環(huán)程序的結構循環(huán)程序一般由四個主要部分組成:

初始化部分:為循環(huán)程序做準備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預置初值。

處理部分:

為反復執(zhí)行的程序段,是循環(huán)程序的實體,也是循環(huán)程序的主體。

循環(huán)控制部分:

這部分的作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結束,直到符合結束條件時,跳出循環(huán)為止。結束部分:

這部分主要是對循環(huán)程序的結果進行分析、處理和存放。4.5.4循環(huán)程序3/20/202494(a)當型循環(huán)結構(b)直到型循環(huán)結構循環(huán)結束?循環(huán)體YN初始化修改循環(huán)參數(shù)結束部分開始結束循環(huán)結束?循環(huán)體Y初始化修改循環(huán)參數(shù)結束部分開始N結束循環(huán)結構程序流程圖3/20/2024952.

循環(huán)程序設計舉例例:不同存儲區(qū)域之間的數(shù)據(jù)傳輸。將內部RAM30H單元開始的內容依次傳送到外部RAM0100H單元開始的區(qū)域,直到遇到傳送的內容是0為止。3/20/202496

(2)匯編語言源程序。

ORG 0000HMOV R0,#30H;

MOV DPTR,#0100H;

TRANS:MOVA,@R0

;A←(R0)

MOVX@DPTR,A

;(DPTR)←A

CJNEA,#00H,NEXT

SJMPFINISH

;A=0,傳送完成

NEXT:

INC R0

;修改地址指針

INC DPTR

AJMP TRANS

;繼續(xù)傳送

FINISH:

SJMP $ END3/20/2024973.多重循環(huán)結構程序某些復雜問題或者循環(huán)數(shù)超過256,則需采用多重循環(huán)的程序結構,即循環(huán)程序中包含循環(huán)程序或一個大循環(huán)中包含多個小循環(huán)程序,稱多重循環(huán)程序結構,又稱循環(huán)嵌套。循環(huán)的重數(shù)不限,但必須每循環(huán)的層次分明,不能有相互交叉!外循環(huán)中循環(huán)內循環(huán)外循環(huán)內循環(huán)外循環(huán)內循環(huán)內循環(huán)(a)嵌套正確(b)嵌套正確(c)交叉不正確多重循環(huán)示意圖3/20/202498范例:延時程序設計(晶振12MHz)DEL:MOVR7,#200DEL1:

MOVR6,#125DEL2:

DJNZR6,DEL2;125×2=250

DJNZR7,DEL1;250×200=50msRET精確的計算:(250+1+2)×200+1=50.301msMOVRn#data是單機器周期指令DJNZRn,rel

是雙機器周期指令3/20/2024994.5.6子程序設計子程序作為一個具有獨立功能的程序段,編程時需遵循以下原則:1.子程序的編程原則(1)子程序的第一條指令必須有標號,明確子程序入口地址。(2)以返回指令RET結束子程序。(3)簡明扼要的子程序說明部分。(4)較強的通用性和可浮動性,盡可能避免使用具體的內存單元和絕對轉移地址等。

(5)注意保護現(xiàn)場和恢復現(xiàn)場。3/20/2024100

;程序名:BCDBIN

;功能:BCD碼轉換為二進制數(shù) ;入口參數(shù):要轉換的BCD碼存在累加器A中 ;出口參數(shù):轉換后的二進制數(shù)存放在累加器A中 ;占用資源:寄存器BBCDBIN:

PUSHB

;保護現(xiàn)場

PUSHPSWPUSH ACC ;暫存A的內容

ANLA,#0F0H ;屏蔽掉低4位

SWAP A ;將A的高4位與低4位交換

MOV B,#10 MUL AB ;乘法指令,

MOV B,A;乘積不會超過256,

POP ACC;取原BCD數(shù)

ANL A,#0FH;屏蔽掉高4位

ADD A,B ;個位數(shù)與十位數(shù)相加

POP PS

溫馨提示

  • 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

提交評論