第3章 指令系統(tǒng)_第1頁
第3章 指令系統(tǒng)_第2頁
第3章 指令系統(tǒng)_第3頁
第3章 指令系統(tǒng)_第4頁
第3章 指令系統(tǒng)_第5頁
已閱讀5頁,還剩121頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章指令系統(tǒng)Exit.熟悉89C51匯編語言指令的格式;.掌握89C51的7種尋址方式,并能實際應用,學會計算目標地址或偏移量;.熟記89C51的111條匯編指令,并會根據題目要求編制匯編語言程序;.熟記指令的功能、操作的對象和結果以及指令執(zhí)行后對PSW各位的影響。

§3.1匯編語言§3.1.1指令和程序設計語言§3.1.2指令格式BACK§3.1.1指令和程序設計語言指令:是CPU根據人的意圖來執(zhí)行某種操作的命令。程序設計語言:是實現人機交換信息的基本工具,分為機器語言、匯編語言和高級語言。機器語言:用二進制編碼表示每條指令,是計算機能直接識別和執(zhí)行的語言。匯編語言:是用助記符、符號和數字等來表示指令的程序設計語言。它與機器語言指令是一一對應的。BACK§3.1.2指令格式89C51匯編語言指令格式操作碼[目的操作數][,源操作數][;注釋]匯編語言指令對應的二進制代碼格式單字節(jié)指令(49條)雙字節(jié)指令(45條)三字節(jié)指令(17條)單字節(jié)指令(49條)1、指令碼中隱含著對某一種寄存器的操作如:指令“INCDPTR”的指令代碼格式為:A3H=101000112、由指令中的rrr三位的不同編碼指定某一寄存器如:指令“MOVA,Rn”的指令代碼格式為:11101rrr雙字節(jié)指令(45條)用一個字節(jié)表示操作碼,另一個字節(jié)表示操作數或操作數所在的地址。格式為:操作碼立即數或地址BACK三字節(jié)指令(17條)一個字節(jié)操作碼,兩個字節(jié)操作數。格式為:操作碼立即數或地址立即數或地址§3.2尋址方式什么是尋址方式:如何找到存放操作數的地址,把操作數提取出來的方法。

1、7種尋址方式2、尋址空間及符號注釋1.7種尋址方式:1)寄存器尋址2)直接尋址3)立即數尋址4)寄存器間接尋址5)變址尋址6)相對尋址7)位尋址(1)寄存器尋址寄存器尋址:由指令指出寄存器組R0~R7中的某一個或其他寄存器(A,B,DPTR等)的內容作為操作數。例如:MOVA,R0;(R0)→AMOVP1,A;(A)→P1口

ADDA,R0;(A)+(R0)→A(2)直接尋址

直接尋址方式:在指令中直接給出操作數所在存儲單元的地址。指令中操作數部分是操作數所在地址。直接尋址方式可訪問片內RAM的128個單元以及所有的SFR。對于SFR,既可以使用它們的地址,也可以使用它們的名字。例如:MOVA,3AH;(3AH)→AMOVA,P1;(P1口)→A

或:MOVA,90H;90H是P1口的地址(3)立即數尋址立即數尋址:指令操作碼后面緊跟的是一字節(jié)或兩字節(jié)操作數,用“#”號表示,以區(qū)別直接地址。例如:MOVA,3AH;(3AH)→AMOVA,#3AH;3AH→AMOVDPTR,#2000H;2000H→DPTR

;(DPH)=20H

;(DPL)=00H(4)寄存器間接尋址

寄存器間接尋址:操作數的地址事先存放在某個寄存器中,寄存器間接尋址是把指定寄存器的內容作為地址,由該地址所指定的單元內容作為操作數。89C51規(guī)定R0或R1為間接尋址寄存器,它可尋址片內RAM低128B單元內容和片外RAM低地址256B單元的內容。還可采用DPTR作為間接尋址寄存器,尋址外部數據存儲器的64KB空間。但不能用這種尋址方式尋址特殊功能寄存器。例如:例如:將片內RAM65H單元內容47H送A,可執(zhí)行指令“MOVA,@R0”。其中R0內容為65H。如圖所示:65H47HR0A47H片內數據存儲器地址┋┋65H①②以指令中所指定的R0內容(65H)為指針將片內RAM65H單元內容47H送A(5)變址尋址

(基址寄存器+變址寄存器間接尋址)變址尋址:以某個寄存器的內容為基地址,在這個基地址的基礎上加上地址偏移量形成真正的操作數地址。89C51中采用DPTR或PC為變址寄存器,A的內容為地址偏移量。注意:變址尋址只能訪問程序存儲器,訪問范圍為64KB。這種尋址方式多用于查表。

MOVCA,@A+DPTRMOVCA,@A+PC例如:例如:MOVCA,@A+DPTR;((A)+(DPTR))→A1EH0302HROMDPTRAA02F1H11H1EH+①②DPTR內容與A的內容之和為程序存儲器地址程序存儲器內容送A(6)相對尋址相對尋址:是以當前的PC值加上指令中規(guī)定的偏移量rel而形成實際的轉移地址。相對尋址只出現在相對轉移指令中。當前的PC值是指執(zhí)行完相對指令后的PC值;相對轉移指令操作碼所在地址稱為源地址;轉移后的地址稱為目的地址。目的地址=源地址+2(相對轉移指令字節(jié)數)+relrel為補碼表示的有符號數。例如:JCrel,設rel=75H,CY=1。

(0100000001110101)(7)位尋址位尋址:采用位尋址方式的指令的操作數是8位二進制數中的某一位,指令中給出的是位地址。位地址在指令中用bit表示。例如:CLRbit;位地址的兩種表示方法:直接使用位地址,如D3H;直接用寄存器名字加位數,如PSW.3。位尋址區(qū)域:1、片內RAM的20H-2FH的16個單元中的128位;2、字節(jié)地址能被8整除的SFR。2、尋址空間及符號注釋(1)尋址空間:見表3-2(2)尋址方式中常用符號注釋表3-2操作數尋址方式和有關空間符號注釋Rn(n=0~7):當前選中的工作寄存器組R0~R7。Ri(i=0,1):作為地址指針的兩個工作寄存器R0,R1。#data:8位立即數。#data16:16位立即數。direct:8位片內RAM單元(包括SFR)的直接地址。addr11:11位目的地址,用于ACALL和AJMP指令中。addr16:16位目的地址。用于LCALL和LJMP指令中。rel:補碼表示的8位地址偏移量。范圍:-128~+127D。bit:片內RAM或SFR的直接尋址位地址。@:間接寄存器的符號。/:位操作指令中對該位先取反再參與操作,不影響原值。(×):×中的內容。((×)):×指出的地址單元中的內容?!褐噶畈僮髁鞒谭较?。概述:

89C51指令系統(tǒng)由111條指令組成。其中,單字節(jié)指令49條,雙字節(jié)指令45條,三字節(jié)指令17條。從指令執(zhí)行時間看,單周期指令64條,雙周期45條,只有乘、除指令為4個周期。

該指令系統(tǒng)有255種指令代碼,助記符42種?!?.389C51指令系統(tǒng)89C51指令系統(tǒng)可分為五大類[1]數據傳送指令:28條[2]算術運算指令:24條[3]邏輯運算及移位指令:25條[4]控制轉移指令:17條[5]位操作指令(布爾操作):17條Back§3.3.1數據傳送指令1.以累加器A為目的操作數的指令(4條,即4種尋址方式)◆2.以寄存器Rn為目的操作數的指令(3條)◆3.以直接地址為目的操作數的指令(5條)◆4.以間接地址為目的操作數的指令(3條)◆5.十六位數據傳送指令(1條)◆6.查表指令(2條)◆7.累加器A與片外RAM傳送指令(4條)◆8.棧操作指令(2條)◆9.交換指令(5條)◆1.以累加器A為目的操作數的指令(4條,即4種尋址方式)例:匯編指令機器碼操作注釋MOVA,Rn11101rrr(Rn)→A將工作寄存器Rn(即R0~R7)內容傳送到累加器A中MOVA,direct11100101direct(direct)→A將直接尋址所得的片內RAM單元內容或特殊功能寄存器中的內容傳送到累加器AMOVA,@Ri1110011i((Ri))→A將間接尋址(Ri為R0或R1)所得的片內RAM單元內容或特殊功能積存器中的內容傳送到累加器A中MOVA,#data01110100#data#data→A將立即數傳送到累加器A中

MOVA,#30H;(A)=30HMOVA,30H ;(A)=11HMOVA,@R1 ;(A)=11HMOVA,R1;(A)=30H例:起始30H單元內容為11H,R1中為30HBack

2、以寄存器Rn為目的操作數的指令(3條)這組指令的功能是把源操作數所指定的內容送到當前工作寄存器組R0-R7中的某個寄存器。源操作數有寄存器尋址、直接尋址和立即數尋址三種方式。Back匯編指令機器碼操作注釋MOVRn,A11111rrr(A)→Rn將累加器A中內容傳送到工作寄存器Rn(即R0-R7)中MOVRn,direct10101rrrdirect(direct)→Rn將直接尋址所得的片內RAM單元內容或特殊功能寄存器中的內容傳送到工作寄存器Rn(即R0-R7)中MOVRn,#data01111rrr#data#data→Rn將立即數傳送到工作寄存器Rn(即R0-R7)中如:(A)=78H,(R5)=47H,(70H)=F2H,執(zhí)行指令:MOVR5,A;(A)→ R5,(R5)=78HMOVR5,70H;(70H)→R5,(R5)=F2HMOVR5,#A3H;A3H→R5,(R5)=A3H注意:在89C51指令系統(tǒng)中沒有“MOVRn,Rn”傳送指令。

3、以直接地址為目的操作數的指令(5條)這組指令的功能是把源操作數所指定的內容送入由直接地址direct所指出的片內存儲單元中。源操作數有寄存器尋址,直接尋址,寄存器間接尋址和立即尋址等方式。匯編指令機器碼操作注釋MOVdirect,A11110101direct(A)→direct將A中內容傳送到直接地址direct所指出的片內存儲單元中。MOVdirect,Rn1rrrdirectRn→direct將工作寄存器Rn(即R0-R7)中內容傳送到直接地址direct所指出的片內存儲單元中。MOVdirect1,direct210000101Direct2direct1direct2→direct1將直接地址源direct2所指出的片內存儲單元中內容傳送到直接地址目的direct1所指出的片內存儲單元中MOVdirect,@Ri011idirect((Ri))→direct將間接尋址(Ri為R0或R1)所得的片內RAM單元內容傳送到直接地址direct所指出的片內存儲單元中MOVdirect,#data01110101direct#data#data→direct將立即數傳送到直接地址direct所指出的片內存儲單元中4、以間接地址為目的操作數的指令(3條)(Ri)表示Ri中的內容為指定的RAM單元的地址。 匯編指令機器碼操作注釋MOV@Ri,A1111011i(A)→(Ri)將累加器A中內容傳送到間接尋址(Ri為R0或R1)所指的片內RAM單元中。MOV@Ri,direct0101011i(direct)→(Ri)將直接尋址得到的片內RAMdirect單元內容或特殊功能寄存器中內容傳送到間接尋址(Ri為R0或R1)所指的片內RAM單元中。

MOV@Ri,#data0111011idata#data→(Ri)

將立即數傳送到間接尋

址(Ri為R0或R1)所指的片內RAM單元中。

MOV指令在片內存儲器的操作功能如圖3.2-1示。圖3.2-1傳送指令在片內存儲器的操作功能@RidirectRn#dataACC5、十六位數據傳送指令(1條)

這條指令的功能是把16位常數送入DPTR。DPTR由DPH和DPL組成。例:MOVDPTR,#1000H;

(DPTR)=1000H, (DPH)=10H,(DPL)=00H匯編指令機器碼操作MOVDPTR,#data1610010000Data(h)Data(l)#data16→DPTR6、查表指令(2條)例如上述兩條指令的操作過程如圖3.2-2所示。匯編指令機器碼操作MOVCA,@A+DPTR10010011((A)+(DPTR))→A(對ROM,遠程查表)MOVCA,@A+PC10000011先(PC)+1→PC再((A)+(PC))→A(對ROM,近程查表)基地址寄存器+變址寄存器間接尋址@PC+A(程序存儲器256B)基地址寄存器+變址寄存器間接尋址@DPTR+A(程序存儲器0-64K)A寄存器圖3.2-2程序存貯器傳送Back執(zhí)行下面程序段后結果如何?MOVDPTR,#2000H;(DPTR)=2000HMOVA,#0AH;(A)=0AHMOVCA,@A+DPTR;(A)=(200AH)=11H例1:若初始ROM內容:2000H00H2001H01H2002H09H2003H04H2004H06H2005H08H2006HFFH2007H66H2008H45H2009HABH200AH11HBack例2:若初始ROM內容為:

100FH 01H

1010H 02H

1011H 03H

1012H 04H

所以,最后結果為:(A)=02H(R0)=02H(PC)=1004H執(zhí)行下面程序后的結果如何?

1000H740DMOV

A,#0DH;(A)=0DH1002H83MOVCA,@A+PC;(PC)=1002+1=1003H,(A)=((A)+(PC))=(0D+1003)

=(1010H)(A)=02H1003HF8MOVR0,A;(R0)=(A)=02H7、累加器A與片外RAM傳送指令(4條,I/O指令)

在89C51指令系統(tǒng)中,CPU對片外RAM的訪問只能用寄存器間接尋址的方式,且僅有四條指令:

第2,4兩條指令以DPTR為片外數據存儲器16位地址指針,尋址范圍達64KB。其功能是DPTR所指定的片外數據存儲器與累加器A之間傳送數據。 第1,3兩條指令是用R0或R1作低8位地址指針,由P0口送出,尋址范圍是256字節(jié)。這兩條指令完成以R0或R1為地址指針的片外數據存儲器與累加器A之間的傳送數據。 上述四條指令的操作如圖3.2-3所示:匯編指令機器碼操作MOVXA,@Ri1110001i((Ri))→AMOVXA,@DPTR11100000(DPTR)→AMOVX@Ri,A1111001i(A)→(Ri)MOVX@DPTR,A11110000(A)→(DPTR)圖3.2-3

外部數據存儲器傳送操作A寄存器寄存器間接尋址@R1.@R0片外RAM0-255B寄存器間接尋址@DPTR片外RAM0-64KB

若片外數據存儲器的地址空間上有片外I/O接口芯片,則上述指令就是89C51的輸入/輸出指令。例:若片內RAM(30H)=01H,片外RAM(30H)=02H,執(zhí)行下面程序段后的結果如何?

MOVR1,#30H;(R1)=30H MOVXA,@R1;(A)=02H MOVR0,A ;(R0)=(A)=02H MOVA,@R1 ;(A)=((R1))=01H MOVR2,A ;(R2)=(A)=01H8、棧操作指令(2條)

在89C51片內的128字節(jié)單元中,可設定一個區(qū)域作為堆棧(一般可設在30H~7FH單元中),棧頂由堆棧指針SP指出,89C51復位后為07H,若要更改,需重新賦值。

PUSH和POP操作不影響標志位。匯編指令機器碼操作PUSHdirect11000000direct先(SP)+1→SP后(direct)→(SP),壓棧POPdirect11010000direct先((SP))→(direct)后(SP)-1→SP,出棧

例:MOVSP,#18H

;(SP)=18HMOVA,#30H

;(A)=30HMOVDPTR,#1000H ;(DPTR)=1000HPUSHA

;(SP)=19H,(19H)=30HPUSHDPH ;(SP)=1AH,(1AH)=10HPUSHDPL ;(SP)=1BH,(BH)=00H

POPDPL ;(DPL)=00H,(SP)=1AHPOPDPH ;(DPH)=10H,(SP)=19HPOPA

;(A)=30H,(SP)=18H9、交換指令(4+1條)(1)字節(jié)交換指令例:初始時:(A)=34H,(30H)=11H

XCHA,30H; (A)=11H,(30H)=34H MOVR1,#30H; (R1)=30H XCHA,@R1 ; (A)=34H,(30H)=11H匯編指令機器碼操作XCHA,Rn11001rrr(A)?(Rn)XCHA,direct11000101direct(A)?(direct)XCHA,@Ri1100011i(A)?((Ri))(2)半字節(jié)交換指令

XCHD指令為低半字節(jié)交換指令。該指令將累加器A的低4位與R0或R1所指出的片內RAM單元的低4位數據相互交換,各自的高4位不變,其操作表示為:如:(R1)=30H,(30H)=11H,(A)=34H則:XCHDA,@R1;(A)=31H;(30H)=14H

匯編指令機器碼操作XCHDA,@Ri1101011i(A)0-3?((Ri))0-3SWAPA11000100§3.3.2算術運算指令(24條)1.不帶進位加法指令(4條)2.帶進位加法指令(4條)3.帶借位減法指令(4條)4.乘法指令(1條)5、除法指令(1條)6、加1指令(5條)7、減1指令(4條)8、十進制調整指令(1條)1、不帶進位加法指令(4條)匯編指令機器碼操作ADDA,Rn00101rrr(A)+(Rn)→AADDA,direct00100101direct(A)+(direct)→AADDA,@Ri0010011i(A)+((Ri))→AADDA,#data00100100data(A)+#data→A說明:上述指令的執(zhí)行將影響標志位AC,CY,OV,P。當“和”的第3位或第7位有進位時,分別將AC,CY標志位置1,否則為0。溢出標志位OV=C7⊕C6(異或),該標志位只有帶符號數運算時才有用。例:若:(A)=78H,(R0)=64H

執(zhí)行ADDA,R0后,結果及PSW=?

(A):78H=01111000B

+(R0):64H=01100100B

(A):DCH=11011100B標志位: CY=0,AC=0,OV=1,P=1,即:PSW=05H

結果:(A)=DCH(R0)=64H2、帶進位加法指令(4條)匯編指令機器碼操作ADDCA,Rn00111rrr(A)+(Rn)+CY→AADDCA,direct00110101direct(A)+(direct)+CY→AADDCA,@Ri0011011i(A)+((Ri))+CY→AADDCA,#data00110100#data(A)+#data+CY→A說明:本組指令的功能是同時把源操作數所指出的內容和進位標志未CY都加到累加器A中,結果存放到A中,其余的功能和上面的ADD指令相同。本組指令常用于多字節(jié)加法。

例:設(A)=0C3H,(R0)=0AAH,(CY)=1。

執(zhí)行指令“ADDCA,R0”后的結果及標志位如何?解:

(A):C3H=11000011

+(CY):1=0000000111000100

+(R0):AAH=10101010

(A):6EH=01101110標志位:CY=1,OV=1,AC=0,結果:(A)=6EH,(R0)=0AAH。

例:編程,將(30H),(31H)單元中的數與(40H),(41H)單元中的數相加,結果存于(30H),(31H)單元中。解:

MOVA,30H ADDA,40H MOV30H,A MOVA,31H ADDCA,41H MOV31H,A3、帶借位減法指令(四條)匯編指令機器碼操作SUBBA,Rn10011rrr(A)-(Rn)-CY→ASUBBA,direct10010101direct(A-(direct)-CY→ASUBBA,@Ri1001011i(A)-((Ri))-CY→ASUBBA,#data10010100#data(A)-#data-CY→A

說明:這組指令的功能是從累加器A中減去源操作數所指出的數及進位位CY的值,差保留在累加器A中。 由于89C51指令系統(tǒng)中沒有不帶借位的減法指令,如需要的話,可以在“SUBB”指令前用“CLRC”指令將CY清0,這一點必須注意。例:設(A)=0C9H,(R2)=54H,Cy=1。

執(zhí)行指令“SUBBA,R2”的結果如何?

解: (A)=0C9H=11001001B-)CY

=1=00000001B11001000B-)(R2)=54H=01010100B

(A)=74H=01110100B結果為:(A)=74H標志位為:CY=0AC=0OV=1P=04、乘法指令(1條)該指令若乘積大于0FFH,則OV置1,否則OV清0,Cy位總是被清0。該指令將累加器A和寄存器B中兩個無符號數相乘,所得16位積的低字節(jié)存放在A中,高字節(jié)存放中B中。例:(A)=4EH,(B)=5DH,執(zhí)行指令“MULAB”后結果如何?解:

結果為:(B)=1CH,(A)=56H,表示積(BA)=1C56H,OV=1。匯編指令機器碼操作MULAB10100100(A)×(B)→B15-8A7-05、除法指令(1條)例:(A)=BFH,(B)=32H。執(zhí)行指令“DIVAB”后:

結果為(A)=03H,(B)=29H;標志位CY=0,OV=0。該指令執(zhí)行后,CY和OV均被清0。 若原(B)=00H,則結果無法確定,用OV=1表示,CY仍為0。匯編指令機器碼操作DIVAB10000100(A)/(B)的商→A,(A)/(B)的余數→B6、加1指令(5條)匯編指令機器碼操作注釋INCA00000100(A)+1→AA中內容加1INCRn00001rrr(Rn)+1→RnRn中內容加1INCdirect00000101direct(direct)+1→directDirect單元中內容加1INC@Ri0000011i((Ri))+1→(Ri)Ri間接尋址所得片內RAM單元中內容加1INCDPTR10100011(DPTR)+1→DPTRDPTR中內容加1

該組指令的操作不影響PSW。例1:比較指令“INCA”和“ADDA,#01H”的結果。解:“INCA”指令只將A的內容加1,標志位沒有變化。而“ADDA,#01H”指令不僅將A的內容加1,還影響標志位變化。

該組指令的操作不影響PSW。若原單元內容為FFH,加1后溢出為00H,也不影響PSW標志。例2:若:(R1)=30H,(30H)=11H

求執(zhí)行下面指令后的結果。

INC@R1;(30H)=12H

INCR1;(R1)=31H解:結果為:(30H)=12H,(R1)=31H。不影響PWS.7、減1指令(4條)

該組指令的操作不影響PSW。Back匯編指令機器碼操作注釋DECA00010100(A)-1→AA中內容減1DECRn00011rrr(Rn)-1→RnRn中內容減1DECdirect00010101direct(direct)-1→directDirect單元中內容減1DEC@Ri0001011i((Ri))-1→(Ri)Ri間接尋址所得片內RAM單元中內容減18、十進制調整指令(1條)☆該指令調整累加器內容為BCD碼。☆

這條指令跟在ADD或ADDC指令后,將相加后存放在累加器中的結果進行十進制調整,完成十進制加法運算功能。

必須注意,本指令不能簡單地把累加器A的16進制數變換成BCD碼,也不能用于十進制減法的調整。

匯編指令機器碼操作DAA11010100若(A0-3)>9或AC=1,則(A0-3)+6→A0-3同時,若(A4-7)>9或CY=1,則(A4-7)+6→A4-7例:

設累加器A內容為:01010110B(即為59的BCD碼),寄存器R3的內容為01100111B(即68的BCD碼),CY內容為1。求執(zhí)行下列指令后的結果。 ADDCA,R3;

DAA;解:先執(zhí)行ADDCA,R3; (A):01011001BCD:59

(R3):01101000BCD:68

(+)(CY):00000001BCD:01

和:11000010即(A)=11000001且影響標志位CY=0,AC=1;

再執(zhí)行DAA;因為A中的高四位值為11,大于9,低四位值為17,AC有進位,所以內部調整自動進行加66H的操作:

11000010

調整+

01100110 100101001BCD:129即(A)=00100100=29(BCD),CY=1;AC=1。Back§3.3.3邏輯操作指令

邏輯操作指令包括:與、或、異或、清零、求反、移位等操作。該指令組全部操作數都是8位,共24條指令。1.簡單操作指令(2條)2.移位指令(4條)3.邏輯“與”指令(6條)4.邏輯“或”指令(6條)5.邏輯“異或”指令(6條)Back1.簡單操作指令(2條)(A)→A0→A操作累加器A取反指令,不影響標志位11110100CPLA累加器A清0指令,只影響標志位P。11100100CLRA注釋機器碼匯編指令2.移位指令(4條)我們通常用RLCA指令將累加器A的內容做乘2運算。

例如:無符號8位二進制數(A)=10111101B=BDH,(CY)=0。將(A)乘2,執(zhí)行指令“RLCA”后結果:(A)=01111010B=7AH,(CY)=1,而17AH正是BDH的2倍。匯編指令機器碼操作注釋RLA00100011A中內容循環(huán)左移一位RRA00000011A中內容循環(huán)右移一位RLCA00110011A中內容連同進位位CY一起循環(huán)左移一位RRCA00010011A中內容連同進位位CY一起循環(huán)右移一位a7←a0a7→a0a7←a0CYa7→

a0CY3.邏輯“與”指令(6條)這組指令中前四條指令是將累加器A的內容和操作數所指出的內容按位進行邏輯“與”,結果存放在A中。后兩條指令是將直接地址單元中的內容和操作數所指出的單元的內容按位進行邏輯“與”,結果存入直接地址單元中。若直接地址正好是I/O端口,則為“讀——改——寫”操作。匯編指令機器碼操作ANLA,Rn01011rrr(A)∧(Rn)→AANLA,direct01010101direct(A)∧(direct)→AANLA,@Ri0101011i(A)∧((Ri))→AANLA,#data01010100data(A)∧data→AANLdirect,A01010010direct(direct)∧(A)→directANLdirect,#data01010011directdata(direct)∧#data→direct4.邏輯“或”指令(6條)這組指令的功能是將兩個指定的操作數按位進行邏輯“或”,前四條指令的操作結果存放在累加器A中,后兩條指令的操作結果存放在直接地址單元中,若直接地址正好是I/O端口,則同樣具有“讀——修改——寫”操作。匯編指令機器碼操作ORLA,Rn01001rrr(A)∨(Rn)→AORLA,direct01000101direct(A)∨(direct)→AORLA,@Ri0100011i(A)∨((Ri))→AORLA,#data01000100data(A)∨#

data→AORLdirect,A01000010direct(direct)∨(A)→directORLdirect,#data01000011directdata(direct)∨

#data→direct5.邏輯“異或”指令(6條)這組指令的功能是將兩個指定的操作數按位進行“異或”,前四條指令的結果存放在累加器A中,后兩條指令中若直接地址正好是I/O端口,則同樣具有“讀——修改——寫”操作。這類指令的操作均只影響標志位P。匯編指令機器碼操作XRLA,Rn01101rrr(A)⊕(Rn)→AXRLA,direct01100101direct(A)⊕(direct)→AXRLA,@Ri0110011i(A)⊕((Ri))→AXRLA,#data01100100data(A)⊕

#data→AXRLdirect,A01100010direct(direct)⊕(A)→directXRLdirect,#data01100011directdata(direct)⊕

#data→direct§3.3.4控制程序轉移類指令

1.無條件轉移指令(4條)

2.空操作指令(1條)

3.條件轉移指令(8條)

4.調用和返回指令(4條)

89C51單片機有豐富的轉移類指令(17條),包括無條件轉移、條件轉移和調用指令及返回指令等。所有這些指令的目標地址都是在64K字節(jié)程序存儲器地址空間范圍內。1、無條件轉移指令(4條)

無條件轉移指令是當程序執(zhí)行到該指令時,程序無條件的轉移到指令所提供的地址處執(zhí)行。無條件轉移指令有長轉移、短轉移、相對轉移和間接轉移4條指令。

(1)長轉移指令

指令提供16位目標地址,將指令的第二、第三字節(jié)地址碼分別裝入PC的高8位和低8位中,程序無條件轉向指定的目標地址去執(zhí)行。由于直接提供16位目標地址,所以程序可轉向64K程序存儲器地址空間的任何單元。匯編指令機器碼操作LJMPaddr1600000010a15_a8a7_a0

addr16→PC例:若程序存儲器中,指令LJMPLOOP的首地址為1000H,其轉向的目標地址為1234H,執(zhí)行下列程序:

ORG1000HLJMPLOOP┇ ORG1234HLOOP:MOVA,R2┇此時指令的指令碼(機器碼)為:02H12H34H即:

1000H1001H1002H

1234HROM02H12H34H┆

EAH┆

(2)短轉移指令(絕對轉移)匯編指令機器碼操作AJMPaddr11a10a9a800001a7_a0先(PC)+2→PC后addr11→PC10-0(PC)15-11不變這條指令提供了11位地址,可在2K范圍內無條件轉移到由a10-a0所指出的地址單元中。因為指令只提供低11位地址,高5位為原PC11-15位值,因此,轉移的目標地址必須在AJMP指令后面指令的第一個字節(jié)開始的同一2K字節(jié)范圍內。例1:ORG 0500H0500H:AJMP 0703H

分析:0703H=0000011100000011BAddr11=11100000011B

指令地址PC=0500H 即:PC=0000010100000000B該指令為二字節(jié)指令在執(zhí)行時先PC+2,(PC=0502H=0000010100000010B,PC的高五位為:00000B,與0703H的高五位相同,在同一個2k范圍內。)然后將Addr11送PC的低11位:

PC=0000011100000011B.指令的機器碼:a10a9a800001=11100001=E1H a7-a0 =00000011=03H

例2:ORG 0700H0700H: AJMP 0832H

分析:0832H=0000100000110010B Addr11=00000110010B 指令地址PC=0700H即:PC=0000011100000000B該指令為二字節(jié)指令在執(zhí)行時先PC+2,(PC=0702H=0000011100000010B,PC的高五位為:00000B,與0832H的高五位不同,不在同一個2k范圍內。)該指令跨越2k的范圍,錯誤。

(3)相對轉移指令(短轉移)

指令的操作數是相對地址,rel是一個帶符號的偏移字節(jié)數(補碼表示),其范圍為-128~+127,負數表示反向轉移,正數表示正向轉移。該指令為二字節(jié),執(zhí)行時先將PC內容加2,再加相對地址,就得到了轉移目標地址。

例1:

1000HSJMP55H其轉移目的地址=?解: ∵rel=55H=01010101B,為正數。 ∴目的PC=1000H+2+rel =1002H+55H =1057H匯編指令機器碼操作SJMPrel10000000rel先(PC)+2→PC后(PC)+rel→PC例2:

1000HSJMPF6H;其轉移目的地址=?解:∵rel=F6H=11110110B為負數,表示向低地址方向轉移。∴目的PC=1000H+2+rel=1002H+F6H不能直接相加,要先計算出F6H的真值。即:F6H=11110110B取反加1后為:00001010B=0AH ∴目的PC=1002H+(F6H)真 =1002H-0AH =0FF8H例3指令碼 源程序

ORG 1000H1000H:E4H CLR A1001H:78H30H MOV R0,#30H1003H:C3H CLR C1004H:36H LOOP: ADDC A,@R01005H:F6H MOV @R0, A1006H:08H INC R01007H:02H10H04H

LJMP LOOP(1007H: 01H04H) (AJMPLOOP)(1007H:80HFBH) (SJMPLOOP)AJMPLOOP指令的機器碼:1004H=10000

00000100Addr11=000

0000010000000001=01H00000100=04HSJMPLOOP指令的機器碼:80Hrelrel=目的地址-(源地址+2)=1004H-(1007H+2)=-05H=FBH

(4)間接轉移指令(散轉)該指令的轉移地址由數據指針DPTR的16位數和累加器A的8位數作無符號數相加形成,并直接送入。指令執(zhí)行過程對DPTR、A和標志位均無影響。這條指令可代替眾多的判別跳轉指令,具有散轉功能。匯編指令機器碼操作JMP@A+DPTR01110011

(A)+(DPTR)→PC例如:根據累加器A中命令鍵鍵值,設計命令鍵操作程序入口跳轉表:

CLRC;清進位

RLCA ;鍵值乘2MOVDPTR,#JPTAB;指向命令鍵跳轉表首址

JMP@A+DPTR ;散轉入命令鍵入口JPTAB:AJMPCCS0 ;雙字節(jié)指令

AJMPCCS1AJMPCCS2……

從程序中看出,當(A)=00H時,散轉到CCS0;當(A)=01H時,散轉到CCS1;……。由于AJMP是雙字節(jié)指令,散轉前中的鍵值應乘2。2、空操作指令(1條)

這是一條單字節(jié)指令,除PC加1外,不影響其它寄存器和標志位?!癗OP”指令常用于產生一個機器周期的延遲。Back匯編指令機器碼操作NOP00000000

(PC)+1→PC3、條件轉移指令(8條)(1)判零轉移指令JZ和JNZ指令分別對累加器A的內容為全零和不為零進行檢測并轉移,當不滿足各自的條件時,程序繼續(xù)往下執(zhí)行,當各自的條件滿足時,則程序轉向指定的目標地址。其目標地址是以下一條指令第一個字節(jié)的地址為基礎加上指令的第二各字節(jié)中的相對偏移量。相對偏移量為一個帶符號的8位數,偏移范圍為-128—+127字節(jié),在指令匯編和手工匯編時被確定,它是目標地址于下條指令地址之差。本指令不改變累加器A內容和影響任何標志位。匯編指令機器碼操作JZrel01100000rel先(PC)+2→PC若(A)=0,則(PC)+rel→PC;否則(A)≠0,程序順序執(zhí)行。JNZrel01100000rel先(PC)+2→PC若(A)≠0,則(PC)+rel→PC;否則(A)=0,程序順序執(zhí)行。(2)比較轉移指令(4條)CJNE(目的字節(jié)),(源字節(jié)),rel;三字節(jié)指令

它的功能是對指定的目的字節(jié)和源字節(jié)進行比較,先(PC)+3→PC:若(目的字節(jié))≠(源字節(jié)),則轉移,PC的當前值(PC)+rel→PC。若(目的字節(jié))>(源字節(jié)),則清0進位標志位CY;若(目的字節(jié))<(源字節(jié)),則置位進位標志位CY;若(目的字節(jié))=(源字節(jié)),則往下執(zhí)行。該組指令執(zhí)行后不影響任何操作數。匯編指令機器碼操作CJNEA,direct,rel10110101directrel先(PC)+3→PC若(A)≠(direct),則(PC)+rel→PC;若(A)>(direct),Cy=0;若(A)<(direct),Cy=1;否則(A)=(direct),程序順序執(zhí)行CJNEA,#data,rel10110100datarel先(PC)+3→PC若(A)≠#data,則(PC)+rel→PC;若(A)>#data,Cy=0;若(A)<#data,Cy=1;否則(A)=#data,程序順序執(zhí)行CJNERn,#data,rel10110rrrdatarel先(PC)+3→PC若(Rn)≠#data,則(PC)+rel→PC;若(Rn)>#data,Cy=0;若(Rn)<#data,Cy=1;否則(Rn)=#data,程序順序執(zhí)行CJNE@Ri,#data,rel1011011idatarel先(PC)+3→PC若((Ri))≠#data,則(PC)+rel→PC;若((Ri))>#data,Cy=0;若((Ri))<#data,Cy=1;否則((Ri))=#data,程序順序執(zhí)行(3)循環(huán)轉移指令(2條)程序每執(zhí)行一次本指令,將第一操作數的字節(jié)變量減1,并判字節(jié)變量是否為零,若不為0,則轉移到目標地址,繼續(xù)執(zhí)行循環(huán)程序段;若為0,則結束循環(huán)程序段的執(zhí)行,程序往下執(zhí)行。其中,rel為相對于DJNZ指令的下一條指令的第一個字節(jié)相對偏移量,用一個帶符號的8位數表示。所以,循環(huán)轉移的目標地址應為DJNZ指令的下條指令地址和偏移量之和。匯編指令機器碼操作DJNZRn,rel11011rrrrel先(PC)+2→PC,(Rn)-1→Rn若(Rn)≠0,則(PC)+rel→PC;否則:(Rn)=0,程序順序執(zhí)行DJNZdirect,rel11010101directrel先(PC)+3→PC,(direct)-1→direct若(direct)≠0,則(PC)+rel→PC;否則:(direct)=0,程序順序執(zhí)行4、調用和返回指令

在程序設計中,有時因操作要求,需反復執(zhí)行某段程序,使這段程序能被公用。這樣可減少程序編寫和調試的工作量,于是引進了主程序和子程序的概念。指令系統(tǒng)中一般都有主程序調用子程序的指令和從子程序返回主程序的指令。通常把具有一定功能的公用程序段作為子程序,子程序的最后一條指令為返回主程序指令(RET)。(1)短調用指令短調用指令提供了11位目標地址,限定在2K地址空間內調用。

匯編指令機器碼操作ACALLaddr11a10a9a810001a7_a0先(PC)+2→PC(斷點PC),后(SP)+1→SP,(PC7-0)→(SP)(保護斷點)(SP)+1→SP,(PC15-8)→(SP)addr10-0→PC10-0(子程序地址送PC)(PC15-11)

不變(2)長調用指令長調用指令提供了16位目標地址,在64K地址空間內調用。

匯編指令機器碼操作LCALLaddr1600010010a15~a8a7~a0先(PC)+3→PC(斷點PC),后(SP)+1→SP,(PC7-0)→(SP)(保護斷點)(SP)+1→SP,(PC15-8)→(SP)addr15-0→PC(子程序地址送PC)(3)返回指令匯編指令機器碼操作RET00100010((SP))→PC15-8

,(SP)-1→SP,(彈出斷點高8位)

((SP))→PC7-0

,(SP)-1→SP,(彈出斷點低8位)RETI00110010((SP))→PC15-8

,(SP)-1→SP,(彈出斷點高8位)

((SP))→PC7-0

,(SP)-1→SP,(彈出斷點低8位)開放中斷邏輯例如:主程序及子程序段如下:

ORG 0100H

0100H MAIN: MOV SP,#60H

0103H LCALL SUB1

0106H …

ORG 0200H

0200H SUB1: …

RET

分析執(zhí)行LCALLSUB1

及RET指令后的結果。解:執(zhí)行LCALLSUB1的過程:結果如圖所示。(PC)+3→PC: (PC)=0106H(SP)+1→SP: (SP)=61H(PC0-7)→(SP): (61H)=06H(SP)+1→SP: (SP)=62H(PC8-15)→(SP): (62H)=01Haddr0-15→PC: (PC)=0200H(進入子程序)

執(zhí)行RET的過程:如圖所示。

((SP))→PC8-15: (PC8-15)=01H

(SP)-1→SP: (SP)=61H ((SP))→PC0-7: (PC0-7)=06H (SP)-1→SP: (SP)=60H所以:(PC)=0106H,返回主程序。

01H06H/////////64H63H62H61H60H

RAMPC0200HSP62H/////////64H63H62H61H60H

RAMPC0106HSP60H例如:主程序及子程序段如下:

ORG 0100H

0100H MAIN: MOV SP,#60H

0103H ACALL SUB1

0105H …

ORG 0200H

0200H SUB1: …

RET

分析執(zhí)行ACALLSUB1

指令后的結果。解:執(zhí)行ACALLSUB1的過程:結果如圖所示。(PC)+2→PC: (PC)=0104H(SP)+1→SP: (SP)=61H(PC0-7)→(SP): (61H)=05H(SP)+1→SP: (SP)=62H(PC8-15)→(SP): (62H)=01Haddr0-10→PC0-10:(PC0-10)=addr0-10=01000000000B(PC11-15)不變:(PC11-15)=00000B,與SUB1的地址的高5位相同(同一個2K范圍內)?!?PC)=0000001000000000B=0200H01H05H/////////64H63H62H61H60H

RAMPC0200HSP62HBack§3.3.5位操作(布爾處理)類指令(17條)在進行位操作時,進位標志位CY——布爾累加器(位累加),簡寫成C。位尋址區(qū):片內RAM字節(jié)地址20H~2FH單元中連續(xù)的128位(位地址00H~7FH)和部分特殊功能寄存器SFR。位地址的表達方式:直接寫位地址:如D4H;點操作符號:如PSW.4或(D0H).4;位名稱方式:如RS1;用戶定義名方式:如用偽指令bit1、位數據傳送指令(2條)

2、位修正指令(6條)

3、邏輯運算指令(4條)

4、位條件轉移類指令(5條)位操作(布爾處理)類指令1、位數據傳送指令(2條)例如:初始時位地址(20H)=1MOVC,20H;CY=1 MOVP1.0,C;P1.0=12、位修正指令(6條)匯編指令機器碼操作CLRC110000110→CCLRbit11000010位地址bit0→bitSETC110100111→CSETbit11010010位地址bit1→bitCPLC10110011/C→C

CPLbit10110010位地址bit/bit→bit

例如:CLRC ;CY=0CLRACC.0 ;ACC.0=0CPL ACC.0 ;ACC.0=1SETBRS1 ;RS1=1CLR RS0;RS0=0選擇當前工作寄存器為第2組CPLC ;CY=13、位邏輯運算指令(4條)例:若位地址(20H)=1,位累加器(C)=0

執(zhí)行指令:ANLC,/20H;后的結果:(C)=0,(20H)=1。

而執(zhí)行指令:CPL20H;

ANLC,20H; 后的結果:(C)=0,(20H)=0。匯編指令機器碼操作ANLC,bit10000010位地址bit(C)∧(bit)→CANLC,/bit10110000位地址bit(C)∧(/bit)→CORLC,bit01110010位地址bit(C)∨(bit)→C

ORLC,/bit01010000位地址bit(C)∨(/bit)→C

4、位條件轉移類指令(5條)(1)判布爾累加器C轉移指令(2條)

(2)判位變量轉移指令(2條)匯編指令機器碼操作JCrel01000000rel先(PC)+2→PC若(C)=1,則(PC)+rel→PC;否則(C)=0,程序順序執(zhí)行。JNCrel01010000rel先(PC)+2→PC若(C)=0,則(PC)+rel→PC;否則(C)=1,程序順序執(zhí)行。匯編指令機器碼操作JBbit,rel00100000bitrel先(PC)+3→PC若(bit)=1,則(PC)+rel→PC;否則(bit)=0,程序順序執(zhí)行。JNBbit,rel00110000bitrel先(PC)+3→PC若(bit)=0,則(PC)+rel→PC;否則(bit)=1,程序順序執(zhí)行。(3)判位變量并清0轉移指令(1條)匯編指令機器碼操作JBCbit,rel00010000bitrel先(PC)+3→PC若(bit)=1,則(PC)+rel→PC,0→bit;否則(bit)=0,程序順序執(zhí)行。例如:編程設計,若片內RAM30H單元內容大于0,40H單元置00;30H單元內容小于0,40H單元置FFH;30H單元內容等于0,40H單元置1;例如:編程設計,若片內RAM30H單元內容大于0,40H單元置00;30H單元內容<于0,40H單元置FFH;30H單元內容等于0,40H單元置1;(30H)=0?(40H)=1(40H)=00CY=1?(40H)=FFH開始結束YNYN MOVA,30HCJNEA,#00H,LP1 MOV 40H,#01H SJMP LP2LP1: JC LP3 MOV 40H,#00H SJMP LP2LP3: MOV 40H,#0FFHLP2: SJMP $LP1LP3LP2程序設計舉例一簡單程序設計舉例二分支程序三循環(huán)程序四子程序設計舉例五代碼轉換程序設計舉例六運算類程序設計舉例一、簡單程序設計舉例例1:拆字。將片內RAM20H單元的內容拆成兩段,每段四位。并將它們分別存入21H與22H單元中。程序如下:解: ORG 2000HSTART: MOV R0,#21H;21H→R0

MOV A,20H ;(20H)→A

ANL A,#0FH;A∧#0FH→A

MOV @R0,A;(A)→(R0)

INC R0 ;R0+1(R0

MOV A,20H

溫馨提示

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

評論

0/150

提交評論