單片微型計算機原理及接口技術(shù)-9-指令系統(tǒng)-3_第1頁
單片微型計算機原理及接口技術(shù)-9-指令系統(tǒng)-3_第2頁
單片微型計算機原理及接口技術(shù)-9-指令系統(tǒng)-3_第3頁
單片微型計算機原理及接口技術(shù)-9-指令系統(tǒng)-3_第4頁
單片微型計算機原理及接口技術(shù)-9-指令系統(tǒng)-3_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

單片微型計算機原理及接口技術(shù)(9)1/37內(nèi)容提綱一位操作指令二控制轉(zhuǎn)移類指令2/37位操作指令一3/37位操作指令簡介位操作指令以位為處理對象,分別完成位傳送、位狀態(tài)控制、位邏輯操作、位條件轉(zhuǎn)移等功能,共有17條??杀粎R編程序所識別的位地址表示方式如下:1)直接用位地址(十進制或十六進制數(shù))表示,或?qū)懗晌坏刂繁磉_式表示。2)寫成“字節(jié)地址.位號”的形式。例如0B8H.0,20H.1等。3)位寄存器的定義名稱,如C、EA等。4)對于可位尋址寄存器,使用“字節(jié)寄存器名.位號”的形式。例如P1.0,PSW.4等。5)用戶使用偽指令事先定義過的符號地址。4/37位操作指令簡介表4-4位操作指令的操作碼助記符及對應(yīng)的操作數(shù)操

作功

能操

碼操

數(shù)備

注位傳送

MOVC,bit或者bit,C源地址和目的地址可互換位狀態(tài)控制位清0CLRC或bitbit表示直接尋址位位取反CPL位置位SETB位邏輯操作邏輯與操作ANLC

∧bit(或/bit)→C/bit表示直接尋址位的非邏輯或操作ORLC∨bit(或/bit)→C位跳轉(zhuǎn)判C轉(zhuǎn)移JCrelrel為相對偏移量JNC判直接尋址位轉(zhuǎn)移JBbit,relJNB為0轉(zhuǎn)移,JB為1轉(zhuǎn)移JNBJBC尋址位為1轉(zhuǎn)移并清0該位5/371.

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

MOV C,bit ;(C)←(bit)MOV bit,C ;(bit)←(C)指令的功能是把第二操作數(shù)所指出的布爾變量送到由第一操作數(shù)指定的布爾變量中。其中一個操作數(shù)必為位累加器(進位標志CY),另一個可以是任何直接尋址位(bit)。指令執(zhí)行結(jié)果不影響其他寄存器或標志。例:設(shè)片內(nèi)數(shù)據(jù)RAM中(20H)=79H,執(zhí)行指令:

MOVC,07H;07H是位地址,即字節(jié)地址20H的第7位,將使(C)=0。6/372.位狀態(tài)控制指令位狀態(tài)控制指令包括位的清零、取反和置位。(1)位清0指令CLR bit ;(bit)←0CLR C ;(C)←0上述指令可使直接尋址位(bit)或位累加器C清零,不影響其他標志。例: 片內(nèi)數(shù)據(jù)RAM字節(jié)地址25H的內(nèi)容為34H(00110100B),執(zhí)行指令:

CLR2AH;2AH為字節(jié)地址25H第2位的位地址

25H的內(nèi)容變?yōu)?0H(00110000B)。7/37例:

執(zhí)行指令序列MOV 25H,#5DH ;(25H)=(01011101B)CPL 2BH ;(25H)=(01010101B)CPL P1.2 ;P1.2求反(2)位求反指令CPL bit ;(bit)←(/bit)CPL C ;(C)←(/C)上述指令可把直接尋址位(bit)或位累加器C內(nèi)容取反,不影響其他標志。(3)位置位指令SETBbit ;(bit)←1SETBC ;CY←1例如,輸出口P1原已寫入了49H(01001001B),則執(zhí)行:SETBP1.7將使P1口輸出數(shù)據(jù)變?yōu)镃9H(11001001B)。8/373.位邏輯操作指令位邏輯操作有兩種:位邏輯與,位邏輯或。(1)位邏輯“與”指令ANLC,bit ;(C)∧(bit)ANLC,/bit ;(C)∧(/bit

)上述指令將直接尋址位的內(nèi)容或直接尋址位內(nèi)容取反后(不改變原內(nèi)容)與位累加器C相與,結(jié)果保存在C中。“/bit”表示對將位內(nèi)容取反后再參與位操作?!芭c”邏輯操作示意圖如圖所示。例當位地址(7FH)=1并且累加器中(ACC.7)=1時,進位標志CY置1,否則CY清0,可編程序如下:

MOV C,7FH ;(7FH)=1送CANLC,ACC.7;(C)∧(ACC.7)→(C)9/37(2)位邏輯“或”指令ORLC,bit ;(C)←(C)∨(bit)ORLC,/bit ;(C)←(C)∨(/bit)上述指令把直接尋址位的內(nèi)容或直接尋址位的內(nèi)容取反后(不改變原內(nèi)容)與位累加器C進行邏輯“或”,結(jié)果保存在C中。位邏輯“或”操作的示意圖如圖所示:。例:

位地址7FH中的內(nèi)容和累加器ACC.7中的內(nèi)容相“或”的程序如下:

MOVC,7FHORLC,ACC.7 ;相“或”的結(jié)果存C中。10/374.位條件轉(zhuǎn)移指令

位條件轉(zhuǎn)移指令分為判進位標志C或判直接尋址位狀態(tài)轉(zhuǎn)移兩種。(1)判進位標志C轉(zhuǎn)移指令JC rel ;若(CY)=1,則(PC)←(PC)+rel,否則順序執(zhí)行。 JNC rel ;若(CY)=0,則(PC)←(PC)+rel,否則順序執(zhí)行。前一條若進位標志為1,后一條若進位標志為0,可使程序轉(zhuǎn)向目標地址,否則順序執(zhí)行下一條指令。目標地址為第二字節(jié)中的帶符號的偏移量與PC當前值之和,不影響任何標志。11/37

實際應(yīng)用中,一般在rel的位置寫入欲跳轉(zhuǎn)到的標號地址,偏移量由匯編程序自動進行計算。這樣做有兩個好處,一是程序的可讀性好,二是不必進行偏移量的計算。例如,ADDA,#30H;加法指令,影響標志位CJC YESC ;若C=1(有進位),則轉(zhuǎn)YESC,否則,繼續(xù)執(zhí)行

… YESC: … 12/37(2)判直接尋址位轉(zhuǎn)移指令JBbit,rel ;若(bit)=1,(PC)←(PC)+relJNBbit,rel ;若(bit)=0,(PC)←(PC)+relJBCbit,rel ;若(bit)=1,(PC)←(PC)+rel,(bit)←0

上述指令檢測直接尋址位,若位變量為1(第一、三條指令)或位變量為0(第二條指令),則程序轉(zhuǎn)向目標地址去執(zhí)行,否則順序執(zhí)行下條指令。

目標地址為PC當前值((PC)←(PC)+3)與第三字節(jié)所給帶符號的相對偏移量之和。測試位變量時,不影響任何標志,前兩條指令不影響原變量值,但后一條指令不管原變量為何值,檢測后即行清0。13/37在實際應(yīng)用中,一般在rel的位置寫入欲跳轉(zhuǎn)到的標號地址,偏移量由匯編程序自動進行計算。例

指令序列:MOV P1,#0CAH ;(P1)←0CAH(11001010B)MOV A,#56H ;(A)←56H(01010110B)JB P1.2,P12SET ;(P1.2)=0不轉(zhuǎn),繼續(xù)執(zhí)行JNB ACC.3,ACC3CLR ;(ACC.3)=0轉(zhuǎn)ACC3CLR處執(zhí)行P12SET:…… ACC3CLR:……

14/37指令序列:

MOVA,#43H ;A←43H(01000011B)

JBCACC.6,ACC6CLR;ACC.6=1轉(zhuǎn)ACC6CLR,且ACC.6←0 … ACC6CLR:… 執(zhí)行后使程序轉(zhuǎn)向ACC6CLR處,并把ACC.6清0。15/37控制轉(zhuǎn)移類指令二16/37控制轉(zhuǎn)移類指令簡介控制轉(zhuǎn)移類類指令用于控制程序的走向??刂妻D(zhuǎn)移類指令可分為兩種:一種是程序轉(zhuǎn)移指令,另一種稱為子程序調(diào)用和返回指令。17/371.程序轉(zhuǎn)移指令(1)無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令操作碼助記符中的基本部分是“JMP”(轉(zhuǎn)移或者跳轉(zhuǎn)),它表示要把目標地址(要轉(zhuǎn)去的某段程序第一條指令的地址號)送入程序計數(shù)器PC,根據(jù)轉(zhuǎn)移距離和尋址方式不同又可分為LJMP(長轉(zhuǎn)移)、AJMP(絕對轉(zhuǎn)移)、SJMP(相對短轉(zhuǎn)移)和JMP(間接轉(zhuǎn)移)。1)長轉(zhuǎn)移指令LJMPaddr16;(PC)←addr16

指令提供16位目標地址,將指令中第二、第三字節(jié)地址碼分別裝入PC的高8位和低8位中,程序無條件轉(zhuǎn)向指定的目標地址去執(zhí)行,不影響標志位。例:

如果在程序存儲器0000H單元存放一條指令

LJMP0100H

則復位后程序?qū)⑻?100H單元去執(zhí)行。18/372)絕對轉(zhuǎn)移指令AJMPaddrlla10a9a800001a7~a0;(PC)←(PC)+2,(PC11~15)不變;(PC0~10)←addr0~10第二字節(jié)存放的是低8位地址,第一字節(jié)5、6、7位存放著高3位地址a8~a10。指令執(zhí)行時分別把高3位和低8位地址值取出送入程序計數(shù)器PC的低11位,維持PC的高5位((PC)+2后的)地址值不變,實現(xiàn)2K范圍內(nèi)的程序轉(zhuǎn)移,如圖所示。AJMP為雙字節(jié)指令,當程序真正轉(zhuǎn)移時PC值已加2了,因此,目標地址應(yīng)與AJMP后面相鄰指令的第一字節(jié)地址在同一2K字節(jié)范圍內(nèi)。如果超過了2K范圍,匯編程序會提示出錯(可以采用多級跳轉(zhuǎn)的方式解決該錯誤)。本指令不影響標志位。跳轉(zhuǎn)范圍有限,很少使用。19/373)相對短轉(zhuǎn)移指令SJMPrel;(PC)←(PC)+2,(PC)←(PC)+rel其中,rel為相對偏移量,是一個8位帶符號的數(shù)

指令控制程序無條件轉(zhuǎn)向指定地址。該指定地址由指令第二字節(jié)的相對地址和程序計數(shù)器PC的當前值(執(zhí)行SJMP前的PC值加2)相加形成。由于AJMP和SJMP指令的跳轉(zhuǎn)范圍有限,而LJMP(長轉(zhuǎn)移指令)不受跳轉(zhuǎn)范圍的限制,因此,一般情況下都可使用LJMP指令代替AJMP和SJMP指令。4)間接轉(zhuǎn)移指令JMP@A+DPTR ;(PC)←(A)+(DPTR)該指令把累加器里的8位無符號數(shù)與作為基址寄存器DPTR中的16位數(shù)據(jù)相加,所得的值裝入程序計數(shù)器PC做為轉(zhuǎn)移的目標地址。由于執(zhí)行16位加法,從低8位產(chǎn)生的進位將傳送到高位去。指令執(zhí)行后不影響累加器和數(shù)據(jù)指針中的原內(nèi)容,不影響任何標志。20/37程序轉(zhuǎn)移指令是一條極其有用的多分支選擇轉(zhuǎn)移指令,其轉(zhuǎn)移地址不是匯編或編程時確定的,而是在程序運行時動態(tài)決定的。因此,可在DPTR中裝入多分支轉(zhuǎn)移程序的首地址,而由累加器A的內(nèi)容來動態(tài)選擇其中的某一個分支予以轉(zhuǎn)移,這就可用一條指令代替眾多轉(zhuǎn)移指令,實現(xiàn)以DPTR內(nèi)容為起始的256個字節(jié)范圍的選擇轉(zhuǎn)移。對比C語言中的switch…case語句?21/37例:

要求當(A)=0轉(zhuǎn)處理程序CASE_0,(A)=1轉(zhuǎn)處理程序CASE_1,(A)=2轉(zhuǎn)處理程序CASE_2(A)=3轉(zhuǎn)處理程序CASE_3,(A)=4轉(zhuǎn)處理程序CASE_4。程序代碼如下:MOVDPTR,#JUMP_TABLE ;表首址送入DPTR中MOVA,INDEX_NUMBER ;取得跳轉(zhuǎn)索引號RLA ;將索引號乘以2(由于AJMP指令是2字節(jié)指令)JMP@A+DPTR ;以A中內(nèi)容為偏移量JUMP_TABLE:AJMP CASE_0 ;(A)=0轉(zhuǎn)CASE_0執(zhí)行AJMP CASE_1 ;(A)=1轉(zhuǎn)CASE_1執(zhí)行AJMP CASE_2 ;(A)=2轉(zhuǎn)CASE_2執(zhí)行AJMP CASE_3 ;(A)=3轉(zhuǎn)CASE_3執(zhí)行AJMP CASE_4 ;(A)=4轉(zhuǎn)CASE_4執(zhí)行22/37無條件轉(zhuǎn)移指令跳轉(zhuǎn)小結(jié)注:在實際應(yīng)用中,由于AJMP和SJMP指令的跳轉(zhuǎn)范圍有限,而LJMP(長轉(zhuǎn)移指令)不受跳轉(zhuǎn)范圍的限制,因此一般情況下可以使用LJMP指令代替AJMP和SJMP指令。23/37(2)條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令執(zhí)行滿足某種特定條件的轉(zhuǎn)移,其目標地址在以下一條指令的起始地址為中心的256字節(jié)范圍中(-128到+127)。1)累加器判零轉(zhuǎn)移指令JZrel ;累加器為0轉(zhuǎn)移JNZrel ;累加器不為0轉(zhuǎn)移JZ表示累加器的內(nèi)容為0,則轉(zhuǎn)向指定的地址,否則順序執(zhí)行下條指令;JNZ指令剛好相反,只須累加器不等于0,則轉(zhuǎn)向指定地址,否則順序執(zhí)行下條指令。兩條指令均為雙字節(jié),其中第二條字節(jié)為符號的相對偏移量,PC現(xiàn)行值(PC加2后)與偏移量相加即得轉(zhuǎn)移地址。該指令不改變累加器內(nèi)容,不影響標志位。a)JZrel指令 b)JNZrel指令24/37例如,

MOV A,P0 ;P0口內(nèi)容送累加器A JZ AIS0 ;A不為0,則不跳轉(zhuǎn),繼續(xù)執(zhí)行;A=0,則跳轉(zhuǎn)到AIS0 DEC A ;A減1AIS0: …25/372)比較轉(zhuǎn)移指令CJNE(目的字節(jié)),(源字節(jié)),relCJNE類指令比較前面兩個操作數(shù)的大小,如果它們的值不相等則轉(zhuǎn)移,相等則繼續(xù)執(zhí)行。該類指令均為三字節(jié)指令,PC當前值((PC)+3→

(PC))與指令第三字節(jié)帶符號的偏移量相加即得到轉(zhuǎn)移地址,如果目的字節(jié)的無符號整數(shù)值小于源字節(jié)的無符號整數(shù)值,則置位進位標志,否則清0進位位,指令不影響任何一個操作數(shù)。比較轉(zhuǎn)移指令的源和目的操作數(shù)有4種尋址方式組合:累加器可以和任何直接尋址字節(jié)或立即數(shù)比較,而任何間接尋址RAM單元或工作寄存器能與立即數(shù)比較,如圖所示。CJNE指令的源、目的操作數(shù)關(guān)系26/37比較轉(zhuǎn)移指令有4條:CJNE A,#data8,rel CJNE A,addr8,rel CJNE @Ri,#data8,rel CJNE Rn,#data8,rel例如,設(shè)(R7)=53H,則執(zhí)行下列指令時,將轉(zhuǎn)移到K1執(zhí)行,且CY←1。CJNER7,#68H,NOTEQ;由于(R7)<68H,轉(zhuǎn)移到NOTEQ執(zhí)行,且CY←1

… ;在此處理相等的情況NOTEQ:JCLESS68 ;因為CY=1,判出(R7)<68H,轉(zhuǎn)LESS68執(zhí)行

LESS68:…27/373)循環(huán)轉(zhuǎn)移指令DJNZ(字節(jié)),rel

該指令是一條減1與0比較指令,程序每執(zhí)行一次該指令,就把第一操作數(shù)字節(jié)變量減1,結(jié)果送回到第一操作數(shù)中,并判字節(jié)變量是否為0,不為0轉(zhuǎn)移,否則順序執(zhí)行。如果字節(jié)變量值原為00H,則變?yōu)?FFH,不影響任何標志。在循環(huán)轉(zhuǎn)移類指令中,有兩條常用指令:DJNZ addr8,relDJNZ Rn,rel由圖可以看出,循環(huán)轉(zhuǎn)移的目標地址為DJNZ之后相鄰指令的第一個字節(jié)地址與帶符號的相對偏移量相加之和。使用該指令可以很容易地構(gòu)成循環(huán),只要給直接地址或工作寄存器賦不同初值,就可方便地控制循環(huán)次數(shù)。28/37例,利用DJNZ指令可實現(xiàn)軟件延時。下面的程序可產(chǎn)生50us的軟件延時:DELAY50US: ;@11.0592MHz NOPNOP PUSH30H MOV30H,#181NEXT: DJNZ30H,NEXT POP30H RET29/37多項單字節(jié)數(shù)求和。設(shè)數(shù)組長度放R0,數(shù)組存放首地址在R1中,數(shù)組之和則存在20H單元中,因為是8位字長,所以此和不應(yīng)大于256??删幊倘缦拢篊LR A ;A清0SUMD: ADD A,@R1 ;相加 INC R1 ;地址指針增1 DJNZ R0,SUMD ;字節(jié)數(shù)減1不為0繼續(xù)加 MOV 20H,A ;結(jié)果存20H單元30/372.子程序調(diào)用和返回指令有兩條調(diào)用指令:LCALL(長調(diào)用)及ACALL(絕對調(diào)用)和一條與之配對的子程序返回指令RET。LCALL和ACALL指令類似于轉(zhuǎn)移指令LJMP和AJMP,不同之處在于它們在轉(zhuǎn)移前,要把執(zhí)行完該指令后PC的內(nèi)容自動壓入堆棧,才做addr16(或addr11)→PC的工作(其中addr16或addr11是子程序的首地址或稱子程序入口地址)。RET指令是子程序返回指令,執(zhí)行時,從堆棧中把原出發(fā)地址彈回PC,讓CPU返回執(zhí)行原主程序。由此可見,RET指令一定在子程序中。31/37(1)長調(diào)用指令LCALLaddr16

;

(PC)

←addr0~15((SP))←(PC8~15)(SP)←

(SP)+1((SP))←(PC0~7)(SP)←(SP)+1(PC)←(PC)+3

長調(diào)用與LJMP一樣提供16位地址,可調(diào)用64K范圍內(nèi)所指定的子程序。

由于為三字節(jié)指令,執(zhí)行時首先(PC)+3→(PC)以獲得下一條指令地址,并把此時PC內(nèi)容壓入(作為返回地址,先壓入低字節(jié)后壓入高字節(jié))堆棧,堆棧指針SP加2指向棧頂,然后把目標地址addr16裝入PC,轉(zhuǎn)去執(zhí)行子程序。

使用該指令可使子程序在64K范圍內(nèi)任意存放。指令執(zhí)行不影響標志位。例:

LCALL STR

;表示調(diào)用STR子程序32/37(2)絕對調(diào)用指令ACALLaddr11a10a9a810001

溫馨提示

  • 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

提交評論