版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第三章指令系統3.1指令格式和常用標識符3.1.1指令系統概述指令是使計算機完成某種操作的命令。指令系統是全部指令的集合。MCS-51系列單片機指令系統功能強、指令短、執(zhí)行快,共有111條指令。存儲空間單字節(jié)指令:49條雙字節(jié)指令:45條三字節(jié)指令:17條運算速度單周期指令:64條雙周期指令:45條四周期指令:2條功能數據傳送類:29條算術運算類:24條邏輯運算及移位類:24條控制轉移類:17條位操作類:17條3.1.2指令的機器碼計算機操作的直接代碼。一般用十六進制數表示。一、單字節(jié)指令1.8位編碼僅為操作碼如:INCA功能是累加器A的內容加1。該指令的編碼為:00000100B,十六進制表示為04H,累加器A隱含在操作碼中。2.8位編碼含有操作碼和寄存器編碼高5位為操作碼,低3位為存放操作數的寄存器編碼。如:MOVA,R0
功能是將當前工作寄存器R0中的數據傳送到累加器A中。編碼為11101000B,低3位000為寄存器R0的編碼。其十六進制表示為E8H。二、雙字節(jié)指令第一字節(jié)表示操作碼,第二個字節(jié)表示參與操作的數據或數據存放的地址。如:MOVA,#50H
功能是將立即數“50H”傳送到累加器A中。
編碼為01110100B,01010000B。其十六進制表示為74H,50H。三、三字節(jié)指令第一字節(jié)表示該指令的操作碼,后兩個字節(jié)表示參與操作的數據或數據存放的地址。如:MOV20H,#50H
功能是將立即數“50H”傳送到內部RAM的20H單元中。
編碼為01110101B,00100000B,01010000B。其十六進制表示為75H,20H,50H。3.1.3指令的格式操作碼助記符操作數;注釋操作碼助記符●
表示指令的操作功能●為便于記憶,通常用與操作相應的英文縮寫表示,如加法用ADD,減法用SUBB,傳送用MOV等,編譯時還原成一定的二進制代碼。操作數●
指參加操作的數據或數據的地址●
操作數的個數無操作數單操作數兩操作數三操作數●
在兩操作數的指令中,通常目的操作數寫在左邊,源操作數寫在右邊。
●
操作數之間用逗號隔開。注釋●
是對指令所做的簡要說明●可有可無,不是必備的●
便于閱讀、理解和使用指令●以分號開始,其后為注釋部分3.1.4指令中所用到的標識符
Rn(n=0~7):當前選中的工作寄存器組中的寄存器R0、R1…R7之一;
Ri(i=0,1):當前選中的工作寄存器組中的寄存器R0或R1;
#data:8位立即數,00~FFH中的一個;
#data16:16位立即數;
direct
:片內低128個RAM或SFR的地址;
addr11
:11位目的地址,用于ACALL和AJMP指令;
addr16
:16位目的地址,用于LCALL和LJMP指令;
rel
:補碼形式表示的8位帶符號地址偏移量,偏移范圍為-128~+127;
bit:片內RAM或SFR的位地址;
/
:該位求反后參與操作,不影響該位原值;
@
:間接尋址寄存器的前綴;
←
:箭頭右邊的內容送入箭頭左邊的單元內;
$
:當前指令的地址。@Ri:寄存器間接尋址,Ri為R0或R1;@DPTR:間接尋址,對外部RAM/ROM尋址。(×)
:表示由×所指的地址單元的內容
;3.2MCS-51單片機尋址方式尋址CPU到不同的地址空間尋找操作數的過程。尋址方式尋找操作數地址的方法。對MCS-51單片機,操作數存放在哪些地方?尋址方式有哪些呢?
注意:下面所提到的尋址方式均指源操作數的尋址方式。寄存器尋址直接尋址寄存器間接尋址立即尋址變址尋址相對尋址位尋址1、寄存器尋址操作數存放在寄存器中,指令中直接給出寄存器名稱。尋址空間為當前選中的通用寄存器R0~R7;部分SFR。如累加器A,寄存器B,數據指針DPTR等。MOVA,R5;A←R5,即R5里面的數送到A中指令代碼為EDH(11101101),低3位中的101表示操作數在R5中。若R5中的數為4AH,則指令執(zhí)行后A中的數也是4AH。2、直接尋址操作數在存儲單元中,指令中直接提供存儲單元地址。尋址空間為片內RAM128個單元;所有特殊功能寄存器(SFR)。說明:這是唯一能訪問SFR的尋址方式。注意1低128單元,在指令中應以單元地址的形式出現。MOVA,direct;A←(direct),即直接地址單元中的內容送到A中MOVA,65H;A←(65H)即將65H單元中的數送到A中MOVdirect,direct;(direct)←(direct)即直接地址單元中的內容送到另一個直接地址單元中注意2對特殊功能寄存器,在指令中可以SFR的名稱出現,也可以SFR所在的單元地址出現,但通常都以SFR的名稱出現。MOVA,P0;A←P0,將P0中的數送到A中MOVA,80H;A←(80H),將80H單元的內容送到A中。匯編后機器碼完全一樣,都是E5H,80H注意3通用寄存器Rn是內存單元的一部分,在指令中若以Rn的名稱出現,則屬于寄存器尋址方式;若以Rn所在的單元地址出現,則屬于直接尋址方式。設通用寄存器選擇第0組,則R0就是片內RAM00H單元MOVA,R0;A←R0,即R0里面的數送到A中MOVA,00H;A←(00H),即00H單元中的數送到A中這兩條指令執(zhí)行的結果是完全相同的,都是將00H單元中的內容送到A中去。區(qū)別:機器碼不同第一個指令為E8H,第二個為E5H,00H。注意4累加器有A、ACC、E0H三種表示形式,指令的執(zhí)行結果相同,但分屬于兩種不同的尋址方法。INCA;寄存器尋址,機器碼為04HINCACCINC0E0H直接尋址,機器碼為05H,E0H
說明:在指令中,多數情況下累加器用“A”表示,僅在直接尋址方式中,用“ACC”表示累加器在SFR區(qū)的具體地址E0H。3、立即尋址操作數是常數,包含在指令當中,位于操作碼之后,與操作碼一起存放在程序存儲器中,可以立即得到并執(zhí)行,不需要經過別的途徑去尋找。常數又稱為立即數,故又稱為立即尋址。尋址空間為ROM在匯編指令中,立即數前面以“#”符號作前綴。立即數可以是1個字節(jié),也可以是兩個字節(jié)。說明由于立即數是一個常數,故只能作為源操作數。在程序中通常用于給寄存器或存儲器單元賦初值。MOVA,#20H;A←20HMOVR7,#0F5H;R7←F5H
MOVP1,#80H;P1←80H
MOVDPTR,#3FA6H;DPH←3FH,DPL←A6H
4、寄存器間接尋址——間址
以某寄存器的內容為地址,從該地址去取操作數。@為間址提示符??捎玫拈g址寄存器為R0或R1——用于尋址片內RAM低128字節(jié)及片外RAM低256字節(jié)。DPTR——用于尋址片外RAM64K字節(jié)。注意“間址”不能用來訪問SFR。片內RAM訪問用MOV指令;片外RAM訪問用MOVX指令。MOVA,@R0;A←(R0),操作數在片內RAM中.以R0的內容為地址,將該地址中的內容送到A中。MOVXA,@R0;A←(R0),操作數在片外RAM中.MOVXA,@DPTR;A←(DPTR),操作數在片外RAM中.以DPTR的內容為地址,將該地址中的內容送到A中。5、變址尋址基址寄存器+變址寄存器間接尋址把兩者內容相加,結果作為操作數的地址。以DPTR或PC為基址寄存器,累加器A為變址寄存器。尋址空間為ROM,用于訪問ROM中的數據表格JMP@
A+DPTR;無條件轉移指令A+DPTR作為一個地址,程序跳轉到該地址執(zhí)行。MOVCA,@
A+DPTR;A←(A+DPTR)MOVCA,@
A+PC;A←(A+PC)MOVCA,@
A+DPTR;A←(A+DPTR)E0A程序存儲區(qū)2040H9320E0H
472041H………DPH20DPL00ALU設DPTR=2000H,A=E0H20E0H47指令代碼MOVCA,@
A+PC;A←(A+PC)E0A程序存儲區(qū)ALU設A=E0H2121H452040H832121H
452041H
………2120H47當前PC指令代碼DPTR在使用前可以賦值,查表范圍可達64K。PC的值是固定的,A的內容為無符號數,因此只能在當前指令下256個地址單元范圍內進行查表。MOVCA,@
A+DPTR;A←(A+DPTR)MOVCA,@
A+PC;A←(A+PC)查表操作,功能一樣,區(qū)別是6、相對尋址
PC的當前值與指令中給出的偏移量rel相加,結果作為跳轉指令的目標地址。注意
PC的當前值是跳轉指令執(zhí)行時的PC值,即轉移指令的下一條地址。偏移量rel是8位帶符號數。以補碼表示,它的取值范圍為-128~+127。當為負值時,向前轉移,當為正數時向后轉移。
如:SJMPrel;轉移指令設rel=23H程序存儲區(qū)ALU1025H1000H801025H
××1001H
23……1024H××1002H
××23H1002H指令代碼當前PC6、位尋址MCS-51單片機具有位處理功能,因此有相應的位尋址方式。尋址空間為片內RAM20H~2FH,共16個單元,128個位地址,范圍為00H~7FH。11個可位尋址的SFR,83個位地址。位地址的表示方式1、直接使用位地址(00~7FH,SFR的83個位地址)如:SETB3DH;將27H.5位置1MOVC,30H;C←26H.0
CLR0D7H;將PSW.7位清零2、字節(jié)地址帶位號如:SETB27H.5;
MOVC,26H.0;
CLR0D0H.7;
3、特殊功能寄存器名帶位號例如:CLRPSW.7;PSW.7表示
PSW的第7位;SETBP0.1;P0.1表示P0口的第1位。4、特殊功能寄存器所含位的位名稱CYACF0RS1RS0OV—PPSW.0PSW.1PSW.2PSW.3PSW.4PSW.5PSW.6PSW.7例如:CLRC;MOV30H,C3.3數據傳送指令數據傳送指令有29條,是指令系統中數量最多、使用也最頻繁的一類指令。這類指令可分為三組:普通傳送指令;數據交換指令;堆棧操作指令。指令助記符:
MOV、MOVX、MOVCXCH、XCHD、SWAPPUSH、POP
源操作數可以是:累加器A、通用寄存器Rn、直接地址direct、間接地址和立即數;
目的操作數可以是:累加器A、通用寄存器Rn、直接地址direct、間接地址。
一、普通傳送指令(22條)普通傳送指令以助記符MOV為基礎。分成片內數據存儲器傳送指令、片外數據存儲器傳送指令和程序存儲器傳送指令。1.片內數據存儲器傳送指令MOV(16條)指令格式:MOV目的操作數,源操作數
源操作數可為:A、Rn、@Ri、direct、#data;目的操作數可為:A、Rn、@Ri、direct。按目的操作數的尋址方式劃分為五組:(1)以A為目的操作數(4條)MOVA,Rn ;A←Rn,Rn的內容送給AMOVA,direct ;A←(direct)MOVA,@Ri ;A←(Ri)MOVA,#data ;A←#data(2)以Rn為目的操作數(3條)MOVRn,A ;Rn←AMOVRn,direct ;Rn←(direct)MOVRn,#data ;Rn←#data(3)以直接地址direct為目的操作數(5條) MOVdirect,A ;(direct)←A MOVdirect,Rn ;(direct)←Rn MOVdirect,direct ;(direct)←(direct) MOVdirect,@Ri ;(direct)←(Ri) MOVdirect,#data ;(direct)←#data例:MOV20H,A ;20H←A MOV20H,R1 ;20H←R1 MOV20H,30H ;20H←(30H) MOV20H,@R1 ;20H←(R1) MOV0A0H,#34H;A0H←34H MOVP2,#34H ;P2←34H(4)以間接地址@Ri為目的操作數(3條) MOV@Ri,A ;(Ri)←A MOV@Ri,direct ;(Ri)←(direct) MOV@Ri,#data ;(Ri)←#data例: MOV@R0,A MOV@R1,20H MOV@R0,#34H
功能:把源操作數指定的內容送入以R0或R1為地址指針的片內存儲單元中。(5)以DPTR為目的操作數(1條)MOVDPTR,#data16 ;DPTR←#data16功能:將一個16位的立即數送入DPTR中去。其中高8位送入DPH,低8位送入DPL。8051是8位機,這是唯一的一條16位立即數傳送指令。例:MOVDPTR,#1234H ;DPH=12H,DPL=34H等同于分別向DPH,DPL送數,即MOVDPH,#12HMOVDPL,#34H注意
源操作數和目的操作數中的Rn和@Ri不能相互配對。即在MOV指令中,不允許在一條指令中同時出現工作寄存器,無論它是寄存器尋址還是寄存器間接尋址。例如,不允許下面的指令MOVRn,RnMOV@Ri,RnMOVA,#30H MOV4FH,A MOVR0,#20H MOV@R0,4FH MOV21H,20H;A=30H;(4FH)=30H;R0=20H;(20H)=30H;(21H)=30H例:順序執(zhí)行下列指令序列,求每一步執(zhí)行結果。練習題:用兩種尋址方式實現,將片內RAM60H單元的數據傳送給累加器A。MOVR0,#60HMOVA,@R0解:MOVA,60H說明:①一條指令中不能同時出現兩個工作寄存器。
非法指令: MOVR1,R2
MOVR2,@R0②間址寄存器只能使用R0、R1。
非法指令:MOVA,@R2③
SFR區(qū)只能直接尋址,不能用寄存器間接尋址。
非法指令:MOVR0,#80H
MOVA,@R0⑥關注指令表中指令字節(jié)數、機器周期數。除操作碼外,直接地址或立即數要占一個字節(jié)。⑦只有指令表中的指令才有對應機器碼,計算機才能執(zhí)行。編程時,不能自己隨意發(fā)明創(chuàng)造指令。⑤除了以A為目的操作數的指令影響PSW中的奇偶標志P外,一般不影響標志位。④目的操作數不能為立即數。
非法指令: MOV#data,AMOV23H,#30HMOV12H,#34HMOVR0,#23HMOVR7,12HMOVR1,#12HMOVA,@R0MOV34H,@R1MOV45H,34HMOVDPTR,#6712HMOV12H,DPHMOVR0,DPLMOVA,@R0;(23H)=30H;(12H)=34H;R0=23H;R7=34H;R1=12H;A=30H;(34H)=34H;(45H)=34H;DPTR=6712H;(12H)=67H;R0=12H;A=67HSubtitle課堂練習2.片外數據存儲器傳送指令MOVX(4條)(1)DPTR作16位數據指針,尋址64KB片外RAM空間:MOVXA,@DPTR
;A←(DPTR)
(讀)MOVX@DPTR,A
;(DPTR)←A
(寫)(2)Ri作8位數據指針,尋址256B片外RAM空間:MOVXA,@Ri
;A←(Ri)
(讀)MOVX@Ri,A
;(Ri)←A
(寫)說明:①在51單片機中,與外部存儲器RAM打交道的只能是累加器A。所有需要送入外部RAM的數據必需要通過A送去,而所有要讀入的外部RAM中的數據也必需通過A讀入。例:實現片外數據存儲器數據傳送(2000H)→(2100H)。
MOVDPTR,#2000H MOVXA,@DPTR MOVDPTR,#2100H MOVX@DPTR,A
;DPTR←2000H ;A←X ;DPTR←2100H ;(2100H)←X②片外數據存儲器不能直接尋址。使用時應先將要讀或寫的地址送入DPTR或Ri中,然后再用讀寫命令。非法指令:MOVXA,2000HMOVX2100H,2000H③訪問片外、片內數據存儲器的指令是不同的。MOVXA,@Ri;片外MOVA,@Ri;片內3.程序存儲器傳送指令MOVC(2條)——查表指令
(1)DPTR為基址寄存器:MOVCA,@A+DPTR;A←(A+DPTR)(讀)
使用前,A為偏移量,DPTR為表格首地址;DPTR可任意被賦值,故可訪問整個ROM的64KB空間,表格可放在ROM的任何位置,與MOVC指令無必然的關系。(2)PC為基址寄存器:MOVCA,@A+PC;A←(A+PC)(讀)
表格只能存放在查表指令以下的256個單元內。
當表格首地址與本指令間有其它指令時,必須調整偏移量,調整量等于當前程序計數器PC值到表格首址之間的字節(jié)數。注意:查表指令的長度為1個字節(jié),當前程序計數器PC值應為查表指令的地址加1。Subtitle課堂練習寫出完成下列功能的程序段。(1)將R0的內容送R6中。MOVA,R0MOVR6,A
(2)將片內RAM30H單元的內容送片外60H單元。MOVR0,#60HMOVA,30HMOVX@R0,A(3)將片外RAM1000H單元的內容送片內20H單元。MOVXA,@DPTRMOV@DPTR,#1000HMOV20H,A(4)將ROM2000H單元的內容送片內RAM的30H單元。MOV@DPTR,#2000HMOVA,#00H(#0)MOVA,@A+DPTRMOV30H,A二、數據交換指令普通傳送指令實現將源操作數的數據傳送到目的操作數,指令執(zhí)行后源操作數不變,數據傳送是單向的。數據交換指令數據作雙向傳送,傳送后,前一個操作數原來的內容傳送到后一個操作數中,后一個操作數原來的內容傳送到前一個操作數中。數據交換指令(5條)字節(jié)交換1XCHA,Rn ;A←→RnXCHA,direct ;A←→(direct)XCHA,@Ri ;A←→(Ri)練習:若R0=80H,A=20H。執(zhí)行指令XCHA,R0后,A=
,R0=
。半字節(jié)交換2XCHDA,@Ri ;A3~0←→(Ri)3~0SWAPA ;A3~0←→A7~4
XCHD指令的功能是間址操作數的低半字節(jié)與A的低半字節(jié)內容互換。
SWAP指令的功能是累加器A的高低4位互換。練習(1)若R0=30H,(30H)=67H,A=20H。XCHDA,@R0;A=67H
,(30H)=20H(2)若A=30H,則SWAPA;A=
03H
三、堆棧操作指令(2條)入棧1PUSHdirect;SPSP+1,(SP)(direct)將direct中的內容送入堆棧中。出棧2POPdirect;(direct)(SP),SPSP-1將堆棧中的內容送回direct中?!羧霔rSP指針先加1,再入棧;◆出棧時內容先出棧,SP指針再減1;◆用堆棧存取數據的規(guī)律是“先進后出”或“后進先出”。注意:例:若入棧保存時入棧的順序為: PUSHA PUSHB 則出棧的順序為: POPB POPA例:設
A=02H,B=56H,執(zhí)行下列指令后,SP=?,A=?,B=?。SBR: MOV SP,#30H;設棧底 PUSHA PUSHB MOVA,#00H MOV B,#01H … POP B POPASP→××
××
×SP→B02H××
×02H
×56HASP→B02H××
56H02H
×56HASP→B00H××
56H02H
×01HASP→B00H××
56H02H
×56HASP→B02H××
56H02H
×56HA02H56H30HB02H56HA3.4算術運算類指令主要對8位無符號數;也可用于帶符號數運算。包括:加、減、乘、除、加1、減1運算指令影響PSW有關位。1.不帶進位的加法指令(4條)ADDA,Rn ;A←A+RnADDA,direct ;A←A+(direct)ADDA,@Ri ;A←A+(Ri)ADDA,#data ;A←A+#data用途:將A中的值與源操作數所指內容相加,最終結果存在A中。一、加法注意(1)參加運算的兩個操作數必須是8位二進制數,操作結果也是一個8位二進制數。(2)用戶根據編程需要既可把參加運算的兩個操作數看作時無符號數(0~255),又可看作帶符號數。若看作帶符號數,一般采用補碼形式(-128~127)。例如:11010011B看作無符號數,其十進制值為211;若看作帶符號數,則其為補碼形式,其值為-45。(3)ADD指令對PSW中所有標志位產生影響◆CY:D7位有進位時,CY=1;否則,CY=0;◆AY:D3位有進位時,AY=1;否則,AY=0;◆OV:D7、D6位只有一個有進位時,OV=1;即OV=D7位進位⊕D6位進位;
溢出表示運算的結果超出了數值所允許的范圍。對帶符號數的運算,當OV=1,結果是錯誤的。如:兩個正數相加結果為負數或兩個負數相加結果為正數時屬于錯誤結果,此時OV=1。例:下面指令執(zhí)行后A及PSW中各標志位的值是?MOVA,#19HADDA,#66H◆P:累加器ACC中“1”的個數為奇數時,P=1;為偶數時,P=0。A中的值為7FH;C=0,AC=0,OV=0,P=1。對無符號數:結果為7FH;對帶符號數運算:因為OV=0,結果7FH是正確的。例:下面指令執(zhí)行后A及PSW中各標志位的值是?MOVA,#5AHADDA,#6BHA中的值為C5H;C=0,AC=1,OV=1,P=0;對無符號數:結果為C5H,正確;對帶符號數運算:因為OV=1,結果錯誤。例:下面指令執(zhí)行后A及PSW中各標志位的值是?MOVA,#0AEHADDA,#81HA中的值為2FH;C=1,AC=0,OV=1,P=1;對無符號數:結果為12FH,正確;對帶符號數運算:因為OV=1,結果錯誤。0AEH、81H為補碼,都是負數,而和2FH也是補碼,卻為正數,結果是錯的?!魧τ跓o符號運算,要注意檢查進位C的值;總結◆對于有符號運算,要注意檢查OV的值,OV=1,表示溢出,計算結果錯誤;OV=0,無溢出,結果正確。2.帶進位的加法指令(4條)ADDCA,Rn ;A←A+Rn+CADDCA,direct ;A←A+(direct)+CADDCA,@Ri ;A←A+(Ri)+CADDCA,#data ;A←A+#data+C用途:將A中的值與其后面的值以及進位C中的值相加,最終結果存在A,常用于多字節(jié)數運算中。加的進位C的值是在該指令執(zhí)行之前C里面的值,而不是執(zhí)行該指令過程中產生的進位。說明:由于51單片機是一種8位機,所以只能做8位的數學運算,但8位運算的范圍只有0~255,這在實際工作中是不夠的,因此就要進行擴展,一般是將2個8位(兩字節(jié))的數學運算合起來,成為一個16位的運算,這樣,可以表達的數的范圍就可以達到0~65535。例:67+A0CY=1,AC=0,OV=0,P=110+30+1CY=0,AC=0,OV=0,P=01067H+30A0H0001000001100111001100001010000001000001000001111067H30A0H4107HR1R0R3R2R5R4C+ADDADDCC MOV A,R0 ADD A,R2 MOV R4,A MOV A,R1 ADDCA,R3 MOV R5,A+3.加1指令(5條)INCA ;A←A+1INCRn ;Rn←Rn+1INCdirect ;(direct)←(direct)+1INC@Ri ;(Ri)←(Ri)+1INCDPTR ;DPTR←DPTR+1
功能簡單,將后面目標中的值加1。
僅INCA影響P標志。其余指令都不影響標志位。例:A=12H,R0=33H,(21H)=32H,(34H)=22H,DPTR=1234H。連續(xù)執(zhí)行下面的指令:INCAINCR0INC21HINC@R0INCDPTR;A=13H;R0=34H;(21H)=33H;(34H)=23H;DPTR=1235H二、十進制調整指令在進行BCD碼加法運算時,跟在ADD和ADDC指令之后,用來對BCD碼加法運算結果進行自動修正。DAA例:A=15H(BCD)(代表十進制數15)ADDA,#8;A=1DH,按二進制規(guī)律加
DAA;A=23H,按十進制規(guī)律加例:R3中存有67H(BCD),R2中存有85H(BCD),求兩數之和,結果放于R5中。MOVA,R3 ;A=R3=67H(BCD)ADDA,R2 ;R2=85H(BCD),A=0ECHDAA ;A=52HMOVR5,A ;R5=52H程序中DA指令對ADD指令運算出來的放于累加器A中的結果進行調整,調整后,累加器A中的內容為52H,CY為1,則結果為152,最后放于R5中的內容為52H(BCD)。三、減法1.帶借位的減法指令(4條)SUBBA,Rn ;A←A-Rn-CSUBBA,direct ;A←A-(direct)-CSUBBA,@Ri ;A←A-(Ri)-CSUBBA,#data ;A←A-#data-
C將A中的值減去源操作數所指內容以及進位位C中的值,最終結果存在A中。CY:D7位需借位時,CY=1;否則CY=0。AC:D3位需借位時,AC=1;否則AC=0。OV:D7、D6位只有一個需借位時,OV=1;
對于帶符號數的計算,要注意OV的值:
OV=1,計算結果出錯。P:累加器ACC中“1”的個數為奇數時,P=1;為偶數時,P=0。SUBB指令在執(zhí)行時要影響CY、AC、OV和P標志位沒有不帶借位的減法指令,如果要做不帶借位的減法,還是用SUBB指令,只要將CY預先清零即可。試編寫1234H-0FA3H的程序段,將結果高8位存入51H,低8位存入50H單元。課堂練習CLRCMOVA,#34HSUBBA,#0A3HMOV50H,AMOVA,#12HSUBBA,#0FHMOV51H,A2.減1指令DECA ;A←A-1DECRn ;Rn←Rn-1DECdirect ;(direct)←(direct)-1DEC@Ri ;(Ri)←(Ri)-1與加1指令類似,但沒有“DECDPTR”指令。除第一條“DECA”指令影響P標志外,其它指令不影響任何標志位。四、乘法指令MULAB ;BA←A×B將A和B中的兩個8位無符號數相乘,積的高8位放在B中,低8位放在A中。指令執(zhí)行后將影響CY和OV標志:
CY清0;
OV:當積大于FFH(255)時(即B中不為0),OV為1;否則,OV為0。
五、除法指令DIVAB ;A←商,B←余數將A和B中的兩個8位無符號數相除(A÷B),商的整數部分放在A中,余數部分放在B中。指令執(zhí)行后將影響CY和OV標志:一般情況下CY、OV都清0;
當除數為0時,則結果A和B中內容不定,且溢出標志位(OV)=1,表示除數為0結果無意義。3.5邏輯運算類指令主要用于對2個操作數按位進行邏輯操作,結果送到A或直接尋址單元。
主要操作與、或、異或、移位、取反、清零等。
對標志位的影響除了目的操作數為ACC的指令影響奇偶標志P外,一般不影響標志位。ANLA,Rn ;A←ARnANLA,direct ;A←A(direct)ANLA,@Ri ;A←A(Ri)ANLA,#data ;A←AdataANLdirect,A ;(direct)←(direct)AANLdirect,#data;(direct)←(direct)data一、邏輯與指令影響P標志二、邏輯或指令ORLA,Rn ;A←ARnORLA,direct ;A←A(direct)ORLA,@Ri ;A←A(Ri)ORLA,#data ;A←AdataORLdirect,A ;(direct)←(direct)AORLdirect,#data;(direct)←(direct)data影響P標志三、邏輯異或指令XRLA,Rn ;A←A⊕RnXRLA,direct ;A←A⊕(direct)XRLA,@Ri ;A←A⊕(Ri)XRLA,#data ;A←A⊕dataXRLdirect,A ;(direct)←(direct)⊕AXRLdirect,#data;(direct)←(direct)⊕data影響P標志例:71H和56H相與: 01110001 ∧)0101011001010000例:71H和56H相或:
01110001 ∨)0101011001110111例:71H和56H相異或: 01110001 ⊕)0101011000100111清0:與0不變:與1置1:或1不變:或0取反:異或1不變:異或0
邏輯與用于實現對指定位清0,其余位不變;
邏輯或用于實現對指定位置1,其余位不變;
邏輯異或用于實現指定位取反,其余位不變。例寫出完成下列功能的指令段。1.對累加器A中的1、3、5位清0,其余位不變 ANLA,#11010101B2.對累加器A中的2、4、6位置1,其余位不變 ORLA,#01010100B3.對累加器A中的0、1位取反,其余位不變 XRLA,#00000011B四、累加器清零和取反指令清零指令:CLRA ;A←0求反指令:CPLA ;A←ā在MCS-51系統中,只能對累加器A中的內容進行清零和取反,如要對其它的寄存器或存儲單元進行清零和取反,則須放在累加器A進行,運算后再放回原位置。例:寫出對R0寄存器內容取反的程序。
MOVA,R0 CPLA MOVR0,A四、循環(huán)移位指令不帶進位的循環(huán)移位:RLA
;A循環(huán)左移一位RRA
;A循環(huán)右移一位AA帶進位循環(huán)移位:RLCA;帶CY循環(huán)左移一位RRCA;帶CY循環(huán)右移一位ACAC例:若A=5CH,CY=1,執(zhí)行RLCA
后,結果:A=B9H,CY=0,P=1010111001101110010利用帶進位的循環(huán)移位指令實現多字節(jié)移位:例:編程將寄存器R6R5中的雙字節(jié)數X左移一位。CLR CMOV A,R5RLC AMOV R5,AMOV A,R6RLC AMOV R6,A;CY=0,設R6=55H,R5=0AAH;R6=01010101B,R5=10101010B,CY=0;A=01010100B,CY=1;R6=01010101B,R5=01010100B,CY=101CYR6R5CY;R6=10101011B,R5=01010100B,CY=0
對RLC、RRC指令,在CY=0時,RLC相當于乘以2,RRC相當于除以2;例:若A=BDH=10111101B,CY=0。執(zhí)行指令RLCA后,CY=1,A=01111010B=7AH。即:BDH×2=17AH(189×2=378)3.6控制轉移類指令
通常情況下,程序的執(zhí)行是順序進行的,但也可以根據需要改變程序的執(zhí)行順序,稱為程序轉移。無條件轉移指令條件轉移指令子程序調用及返回指令一、無條件轉移指令無條件轉移指令是指當執(zhí)行該指令后,程序將無條件地轉移到指令指定的地方去。LJMPaddr16長轉移指令AJMPaddr11絕對轉移指令SJMPrel相對轉移指令JMP@A+DPTR間接轉移指令
把指令碼中的目標地址addr16裝入PC,使機器執(zhí)行下一條指令時無條件轉移addr16到處執(zhí)行,不影響標志位。
addr16是一個16位地址(范圍0000H~FFFFH),可在64KB范圍內轉移。
為編程方便,addr16常用標號地址表示,如LOOP、LOOP1、MAIN、START、NEXT……,最后通過編譯軟件匯編成16位二進制地址。
3字節(jié)雙周期指令。1、長轉移指令(64KB范圍內轉移指令)
LJMPaddr16;PC←addr16
執(zhí)行時,先將PC的值加2(該指令長度為2字節(jié)),再把指令中的11位地址addr11送給PC的低11位。轉移的目標地址是:當前PC的高5位+addr11。
由于addr11是11位地址的,轉移范圍為2KB。
在程序中,addr11可用標號代替。
雙字節(jié)單周期指令。2、絕對轉移指令(2KB范圍內的轉移指令)
AJMPaddr11;PC←PC+2;PC10~0←addr11;PC15~11
不變例:若AJMP指令地址為3000H,addr11為123H,則執(zhí)行指令AJMPaddr11后轉移的目的位置是多少?AJMP指令的PC值加2=3000H+2=3002H=0011000000000010B指令中的addr11=123H=00100100011B轉移的目的地址為00110
00100100011B=3123H3、相對轉移指令SJMPrel;PC←PC+2+rel
rel為偏移量,8位帶符號補碼數,取值范圍為-128~+127。
轉移的目的地址=SJMP指令所在地址+2+rel
在程序中,rel可用標號代替,由匯編軟件自動編譯成具體的數值。
兩字節(jié)雙周期指令。注意:在程序設計中,通常用到一條SJMP指令:
SJMP$該指令等效于HERE:SJMPHERE功能是原地踏步,進入等待狀態(tài)。其中符號$表示轉移到本身,它的機器碼為80FEH。程序的最后一條指令通常用它,可使程序固定下來,不再向后執(zhí)行,以避免執(zhí)行后面的內容而出錯。4、間接轉移指令(又稱為散轉指令)JMP@A+DPTR;PC←A+DPTR
轉移地址由數據指針DPTR的16位數和累加器A的8位數進行無符號數相加形成,并直接裝入PC。指令對A、DPTR和標志位均無影響。
數據指針DPTR的內容為基址,累加器A的內容為相對偏移量,在64KB范圍內無條件轉移。根據累加器A的值來實現轉移到不同的分支。在使用時往往與一個轉移指令表一起來實現多分支轉移。例:MOVDPTR,#TAB;將TAB代表的地址送入DPTRJMP@A+DPTR;跳轉TAB:AJMPROUT0;跳轉ROUT0開始的程序段 AJMPROUT1;跳轉ROUT1開始的程序段 AJMPROUT2;跳轉ROUT2開始的程序段 AJMPROUT3;跳轉ROUT3開始的程序段...ROUT0:...ROUT1:...ROUT2:...ROUT3:執(zhí)行該段程序后,程序將根據A中的內容轉移到不同的程序段去執(zhí)行----散轉。A=0,轉ROUT0A=2,轉ROUT1A=4,轉ROUT2A=6,轉ROUT3二、條件轉移指令條件轉移指令是指當條件滿足時,程序轉移到指定位置,條件不滿足時,程序將繼續(xù)順次執(zhí)行。MCS-51系統中,條件轉移指令有三種:累加器A判零條件轉移指令比較不等轉移指令減1不為零轉移指令1、累加器A判零條件轉移指令
JZrel
;如果A=0,則轉移,否則順序執(zhí)行。
JNZrel
;如果A≠0,就轉移。轉移到相對于當前PC值的8位偏移量的地址去。即:新的PC值=指令所在的地址+2+偏移量rel編程時,用“
JZ標號”,即轉移到標號處。例:把片外RAM的30H單元開始的數據塊傳送到片內RAM的40H開始的位置,直到出現零為止。片內、片外數據傳送以累加器A過渡。每次傳送一個字節(jié),通過循環(huán)處理,直到處理到傳送的內容為0結束。
程序如下: MOVR0,#30H MOVR1,#40HLOOP: MOVXA,@R0 MOV@R1,A INCR1 INCR0 JNZLOOP SJMP$2、比較不等轉移指令CJNEA,#data,rel
;若A=data,則PC←PC+3,不轉移,繼續(xù)執(zhí)行
若A>data,則C=0,PC←PC+3+rel,轉移 若A<data,則C=1,PC←PC+3+rel,轉移CJNERn,#data,rel
;若Rn=data,則PC←PC+3,不轉移,繼續(xù)執(zhí)行 若Rn>data,則C=0,PC←PC+3+rel,轉移 若Rn<data,則C=1,PC←PC+3+rel,轉移CJNE@Ri,#data,rel
;若(Ri)=data,則PC←PC+3,不轉移,繼續(xù)執(zhí)行 若(Ri)>data,則C=0,PC←PC+3+rel,轉移 若(Ri)<data,則C=1,PC←PC+3+rel,轉移CJNEA,direct,rel
;若A=(direct),則PC←PC+3,不轉移,繼續(xù)執(zhí)行 若A>(direct),則C=0,PC←PC+3+rel,轉移 若A<(direct),則C=1,PC←PC+3+rel,轉移比較兩個操作數的大小,若不相等,就轉移;若相等,就順序執(zhí)行。若兩數不相等,用CY反映哪個數大,哪個數小。如果前面的數大,則CY=0,否則CY=1。編程時,我們可以將rel寫成標號,即:
CJNEA,#data,標號 CJNEA,direct,標號 CJNERn,#data,標號 CJNE@Ri,#data,標號舉例:MOVR0,#0FH
MOVA,R0CJNEA,#10H,L1;A<#10H,CY=1,A>10H,CY=0
MOVR1,#0;如R0=10H,則不轉移R1=00H;AJMPL3L1:JCL2 ;如CY=1即R0<10H,則轉移 MOVR1,#0AAH;否則CY=0即R0>10H,則轉移 AJMPL3L2:MOVR1,#0FFHL3:SJMPL3因此最終結果是:本程序執(zhí)行前,如果R0=10H,則R1=00H;如果R0>10H,則R1=0AAH;如果R0<10H,則R1=0FFH。3、減1不為0轉移指令DJNZRn,rel;Rn-1≠0,則PC←PC+2+rel;Rn-1=0,則PC←PC+2DJNZdirect,rel;(direct)-1≠0,則PC←PC+3+rel;(direct)-1=0,則PC←PC+3執(zhí)行過程:它將第一個參數中的值減1,然后看這個值是否等于0,如果等于0,就往下執(zhí)行,如果不等于0,就轉移。例:有一段程序如下:MOV23H,#0AHCLRALOOPX:ADDA,23HDJNZ23H,LOOPXSJMP$該程序執(zhí)行后:
A=10+9+8+7+6+5+4+3+2+1=37H三、調用與返回指令為減少程序編寫和調試的工作量,以及節(jié)省存儲空間,把具有完整功能的程序段定義為子程序。
調用指令——主程序調用子程序時使用。
自動保護PC中的斷點地址到堆棧;
子程序入口地址自動送到PC中。
返回指令——子程序執(zhí)行完后返回主程序時使用。
把堆棧中的斷點地址自動恢復到PC。
斷點地址——主程序中調用指令下一條指令地址。調用指令返回指令返回指令調用指令主程序子程序1子程序2斷點1斷點2子程序入口地址必須與ACALL后下一條指令的第一字節(jié)在同一個2KB存儲區(qū)之內,即它們的高5位地址相同。1、子程序調用指令(2條)子程序入口地址為:當前PC的高5位+addr11(1)ACALLaddr11
;短調用指令(2字節(jié));PC←PC+2 ;SP←SP+1,(SP)←PC低8位 ;SP←SP+1,(SP)←PC高8位 ;PC第11位←addr11
例:已知SP=60H,標號MA值為0123H,子程序SUB位于0345H。則執(zhí)行指令:MA:ACALLSUB結果:SP=,(61H)=,(62H)=,PC=LCALL指令可以調用64K字節(jié)范圍內程序存儲器中的任何一個子程序。(2)LCALLaddr16
;長調用指令(3字節(jié));PC←PC+3 ;SP←SP+1,(SP)←PC低8位 ;SP←SP+1,(SP)←PC高8位 ;PC←addr16
例:已知SP=60H,標號START值為0100H,標號DIR值為8100H。則執(zhí)行指令:START:LCALLDIR結果:SP=,(61H)=,(62H)=,PC=2、子程序返回指令(2條)子程序執(zhí)行完后必須回到主程序,如何返回呢?在子程序結尾處執(zhí)行返回指令。RET;子程序返回指令;PC高8位←(SP),SP←SP-1 ;PC低8位←(SP),SP←SP-1
■把堆棧中的斷點地址自動恢復到PC。例:已知SP=62H,(62H)=07H,(61H)=30H。則執(zhí)行指令:RET結果:SP=,PC=例:如圖,在P1.0~P1.3分別裝有兩個紅燈和綠燈。
P1.0VCC1k紅1P1.11k綠2P1.21k紅2P1.31k綠1MAIN:MOVA,#03HML: MOVP1,A ;切換紅綠燈 ACALLDL ;調用延時子程序MXCH:CPLA AJMPMLDL: MOVR7,#200 ;延時子程序DL1:MOVR6,#125DL6:DJNZR6,DL6 DJNZR7,DL1RET(2)RETI;中斷子程序返回指令;PC高8位←(SP),SP←SP-1 ;PC低8位←(SP),SP←SP-1
■RETI只能用于中斷服務程序末尾。除了執(zhí)行RET指令的功能外,還清除內部相應的中斷優(yōu)先級狀態(tài)位,以允許單片機響應低優(yōu)先級的中斷請求。四、空操作指令NOP ;PC←PC+1不產生任何控制操作,只是將程序計數器PC的內容加1。該指令在執(zhí)行時間上要消耗1個機器周期,在存儲空間上可以占用一個字節(jié)。因此,常用來實現較短時間的延時。3.7位操作指令
位操作又稱布爾操作,是以位為單位進行的各種操作。片內RAM的位尋址區(qū)字節(jié)地址為20H-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學中藥炮制(中藥炮制實操)試題及答案
- 2025年高職生物技術(微生物培養(yǎng))試題及答案
- 2025年大學母嬰照護(母嬰健康常識)試題及答案
- 2025年中職美發(fā)與形象設計(化妝技巧)試題及答案
- 2025年大學特種經濟動物飼養(yǎng)(蠶桑養(yǎng)殖技術)試題及答案
- 2025年大學大一(物聯網工程)物聯網安全實務試題及答案
- 2025年大學車輛工程(汽車電子)期末試題
- 2025年中職珠寶玉石加工與營銷(珠寶營銷技巧)試題及答案
- 2025年高職物流審計(物流審計基礎)試題及答案
- 2025年高職計算機網絡技術(網絡安全配置)試題及答案
- GB/T 17642-2025土工合成材料非織造布復合土工膜
- 清欠歷史舊賬協議書
- 臨床創(chuàng)新驅動下高效型護理查房模式-Rounds護士查房模式及總結展望
- 乙肝疫苗接種培訓
- 心衰患者的用藥與護理
- 食品代加工業(yè)務合同樣本(版)
- 車間管理人員績效考核方案
- 安全生產應急平臺體系及專業(yè)應急救援隊伍建設項目可行性研究報告
- 浙江省杭州市北斗聯盟2024-2025學年高二上學期期中聯考地理試題 含解析
- 醫(yī)用化學知到智慧樹章節(jié)測試課后答案2024年秋山東第一醫(yī)科大學
- 中國傳統美食餃子歷史起源民俗象征意義介紹課件
評論
0/150
提交評論