指令系統(tǒng)及程序設計(第一部分).ppt
《指令系統(tǒng)及程序設計(第一部分).ppt》由會員分享,可在線閱讀,更多相關《指令系統(tǒng)及程序設計(第一部分).ppt(68頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1,3.1指令系統(tǒng)簡介,本章分為五節(jié),主要介紹:,3.2尋址方式,3.3指令系統(tǒng),3.4匯編語言程序設計,3.5設計實例,,,2,3.1指令系統(tǒng)簡介,3.1.1機器語言和匯編語言,,,,,機器語言:‘0’或‘1’等組合而成的二進制編碼。缺點:人不容易記?。。?!匯編語言:用英文單詞及其縮寫表示機器語言的、有利于記憶的符號,實際上是符號化的機器語言。例如:INCA,該指令的二進制編碼(機器語言)為:00000100B匯編:把用匯編語言寫的源程序翻譯成機器語言的過程,稱為匯編。,3,指令系統(tǒng):所有的指令的集合。MCS-51系列單片機指令系統(tǒng)共有111條指令。(1)指令的分類標準之一:按照所占存儲空間大小分類:單字節(jié)指令、雙字節(jié)指令、三字節(jié)指令。(2)指令的分類標準之二:按照執(zhí)行時耗費時間長短分類:單周期、雙周期、四周期等。(3)其他分類方法:功能,操作數(shù)數(shù)量等了解上述分類方法,3.1指令系統(tǒng)簡介,4,3.1.2指令的格式,,,,,一般格式為:操作助記符[目的操作數(shù)][,源操作數(shù)][;注釋],關于“[]”符號:指令的一般格式中使用了可選擇符號“[]”,包含的內容因指令的不同可以有或無。,5,3.1.3符號說明(暫時了解),,,,,Rn(n=0~7)--當前選中的工作寄存器組中的寄存器R0~R7之一;Ri(i=0,1)--當前選中的工作寄存器組中的寄存器R0或R1;@---------------間址寄存器前綴;#data------------8位立即數(shù);#data16---------16位立即數(shù);direct--------片內低128個RAM單元地址及SFR地址(可用符號名稱表示);,6,addr11-----------11位目的地址;addr16-----------16位目的地址;rel-----------------補碼形式表示的8位地址偏移量,值在-128~+127范圍內;bit----------------片內RAM位地址、SFR的位地址(可用符號名稱表示);/-------------------位操作數(shù)的取反操作前綴;()-----------表示地址單元或寄存器中的內容;←----------------將箭頭右邊的內容送入箭頭左邊的單元中。,,,,,3.1.3符號說明(暫時了解,結合后邊指令逐步掌握),7,3.2尋址方式,,尋址:是尋找操作數(shù)或指令的地址的方式。,尋址方式:寄存器尋址、直接尋址、寄存器間接尋址、立即尋址、基址寄存器加變址寄存器變址尋址、相對尋址和位尋址。,若不特別聲明,我們后面提到的尋址方式均指源操作數(shù)的尋址方式。,,,,,指令格式:操作助記符[目的操作數(shù)][,源操作數(shù)],8,操作數(shù)存放在寄存器中,指令中直接給出該寄存器名稱的尋址方式。,,,如:MOVA,R0;A<-(R0)注意括號的含義,尋址空間(寄存器可以)是:R0~R7;A;B(以AB寄存器對形式出現(xiàn));DPTR。,3.2尋址方式-寄存器尋址,特點:較高的傳送和運算速度。,9,指令操作碼之后的字節(jié)存放的是操作數(shù)的地址,操作數(shù)本身存放在該地址指示的存儲單元中的尋址方式稱為直接尋址。,,,如:MOVA,50H;A<-(50H),,,,,,直接尋址中的SFR經(jīng)常采用符號形式表示。尋址空間為:片內RAM低128字節(jié);SFR。,3.2尋址方式-直接尋址,10,2020/4/27,10,3.2.3寄存器間接尋址,寄存器中的內容是操作數(shù)的地址尋址空間:片內RAM(@Ri)片外RAM(@Ri、@DPTR),【例】若(R0)=30H,(30H)=5AH,執(zhí)行MOVA,@R0后,(A)=5AH,片內:MOV(暫時了解)片外:MOVX,3.2尋址方式-寄存器間接尋址,11,2020/4/27,11,操作數(shù)在指令編碼中尋址空間:ROM,,對于MOVDPTR,#2100H指令,立即數(shù)高8位“21H”裝入DPH00裝入DPL,【例】執(zhí)行MOVA,#50H,結果:(A)=50H,3.2尋址方式-立即尋址,12,2020/4/27,12,操作數(shù)地址:基地址+偏移量尋址空間:ROM,,,變址尋址還用于跳轉指令,如JMP@A+DPTR,【例】(A)=0FH,(DPTR)=2400H,執(zhí)行MOVCA,@A+DPTR”后,結果:(A)=88H,3.2尋址方式-變址尋址,13,將PC中的當前內容與指令第二字節(jié)給出的數(shù)相加,結果作為跳轉指令的轉移地址(轉移目的地址)。PC中的當前內容稱為基地址(本指令后的字節(jié)地址)指令第二字節(jié)給出的數(shù)據(jù)稱為偏移量,1字節(jié)帶符號數(shù)(-128~+127).,3.2尋址方式-相對尋址,常用于跳轉指令。如:JC23H若C=0,不跳轉;C=1,跳轉.執(zhí)行過程如下,14,JC23H執(zhí)行過程,1025H,23H,1002H,指令代碼,當前PC,,3.2尋址方式-相對尋址,上述的用法實際很少,了解一下就可以。更多的時候使用標號,比如:JZlOOP(暫時先了解),15,尋址位數(shù)據(jù)(實質屬于位的直接尋址)。尋址空間為:片內RAM的20H~2FH單元中的128可尋址位;SFR的可尋址位。,,,,,,習慣:特殊功能寄存器的尋址位常用符號位地址表示。如:CLRACC.0MOV30H,C,3.2尋址方式-位尋址,16,本節(jié)總結,尋址:查找源操作數(shù)的方法,注意:重點明白指令的含義,而不是單純的去區(qū)分尋址方式!,17,3.3指令系統(tǒng),助記符:MOV、MOVX、MOVCXCH、XCHD、SWAPPUSH、POP除了目的操作數(shù)為ACC的指令影響偶校驗標志P外,一般不影響標志位。當A中為偶數(shù)個1時,p=0;當A中為奇數(shù)個1時,p=1;湊成偶數(shù)個1關于偶校驗了解即可,3.3.1數(shù)據(jù)傳送類指令(29條),18,MOVDPTR,#data1651是一種8位機,這是唯一的一條16位立即數(shù)傳遞指令。功能:將一個16位的立即數(shù)送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例:MOVDPTR,#1234H執(zhí)行完了之后DPH中的值為12H,DPL中的值為34H。如果我們分別向DPH,DPL送數(shù),則結果也一樣。如下面兩條指令:MOVDPH,#35HMOVDPL,#12H則就相當于執(zhí)行了MOVDPTR,#3512H,3.3.1數(shù)據(jù)傳送類指令-十六位數(shù)的傳遞指令,19,,MOVXA,@RiMOVX@Ri,AMOVXA,@DPTRMOVX@DPTR,A說明:1.在51中,與外部存儲器RAM打交道的只可以是A累加器。所有需要送入外部RAM的數(shù)據(jù)必需要通過A送去,而所有要讀入的外部RAM中的數(shù)據(jù)也必需通過A讀入。2、外部RAM的數(shù)據(jù)不能夠直接傳輸。比如,要將外部RAM中某一單元(設為0100H單元的數(shù)據(jù))送入另一個單元(設為0200H單元),也必須先將0100H單元中的內容讀入A,然后再送到0200H單元中去。但內部RAM間可以直接進行數(shù)據(jù)的傳遞。,3.3.1數(shù)據(jù)傳送類指令-累加器A與片外RAM之間的數(shù)據(jù)傳遞類指令,20,2.要讀或寫外部的RAM,當然也必須要知道RAM的地址,在后兩條指令中,地址是被直接放在DPTR中的。而前兩條指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口來提供(暫時了解)。3.使用時應先將要讀或寫的地址送入DPTR或Ri中,然后再用讀寫命令。例:將外部RAM中100H單元中的內容送入外部RAM中200H單元中。MOVDPTR,#0100HMOVXA,@DPTRMOVDPTR,#0200HMOVX@DPTR,A,3.3.1數(shù)據(jù)傳送類指令-累加器A與片外RAM之間的數(shù)據(jù)傳遞類指令,21,MOVCA,@A+DPTRMOVCA,@A+PC本組指令是將ROM中的數(shù)送入A中。本組指令也被稱為查表指令,常用此指令來查一個已做好在ROM中的表格(暫時了解,后續(xù)學習)說明:查找到的結果被放在A中,,上述兩條指令的區(qū)別以及應用在后續(xù)課程中學習,此處先掌握指令的功能,3.3.1數(shù)據(jù)傳送類指令-讀程序存儲器指令,注意(暫時了解)(1)A中存放8位無符號數(shù),即表格的變化范圍為256;(2)PC的內容為當前值,即MOVCA,@A+PC指令下邊一個單元的地址,22,PUSHdirect;SP?SP+1,(SP)?(direct)POPdirect;(direct)?(SP),SP?SP-1第一條為壓入指令,就是將direct中的內容送入堆棧中,第二條為彈出指令,就是將堆棧中的內容送回到direct中。例:MOVSP,#5FHMOVA,#100MOVB,#20PUSHACCPUSHB執(zhí)行PUSHACC過程:將SP中的值加1,即變?yōu)?0H,然后將A中的值送到60H單元中,結果,(60H)=100,執(zhí)行PUSHB時,是將SP+1,即變?yōu)?1H,然后將B中的值送入到61H單元中,即執(zhí)行完本條指令后,(61H)=20。注意:堆棧指針sp一直指向棧頂,3.3.1數(shù)據(jù)傳送類指令-堆棧操作指令,23,2020/4/27,23,字節(jié)交換指令XCH,數(shù)據(jù)交換屬于同時進行的雙向傳送,【例】若(R0)=80H,(A)=20H。執(zhí)行指令XCHA,R0后,(A)=80H,(R0)=20H。,,3.3.1數(shù)據(jù)傳送類指令-數(shù)據(jù)交換指令,24,2020/4/27,24,半字節(jié)交換指令XCHD,【例】若(R0)=30H,(30H)=67H,(A)=20H。執(zhí)行指令XCHDA,@R0指令后,(A)=27H,(30H)=60H。,,,XCHD是間址操作數(shù)的低半字節(jié)與A的低半字節(jié)互換。SWAP是累加器的高低4位互換,【例】若(A)=30H,執(zhí)行指令SWAPA后,(A)=03H。,3.3.1數(shù)據(jù)傳送類指令-數(shù)據(jù)交換指令,25,主要對8位無符號數(shù);也可用于帶符號數(shù)運算。包括:加、減、乘、除、加1、減1運算指令,影響PSW有關位。,3.3.2算數(shù)運算類指令-24條,26,ADDA,#data;(A)←(A)+#dataADDA,direct;(A)←(A)+(direct)ADDA,@Ri;(A)←(A)+((Ri))ADDA,Rn;(A)←(A)+(Rn)上述指令,把源字節(jié)變量(立即數(shù),直接、間接地址單元,工作寄存器內容)與累加器相加,結果保存在累加器中,影響標志AC、CY、OV、P。例執(zhí)行指令:MOVA,#0C3HADDA,#0AAH運算后,CY=1,OV=1,AC=0,(PSW)=85H,(A)=6DH注意:1:OV溢出標志取決于帶符號數(shù)運算時。OV=1表示兩正數(shù)相加,和變成負數(shù),或兩負數(shù)相加,和變成正數(shù)的錯誤結果。2:進行無符號數(shù)運算時,要看Cy位(最高位有進位或借位),3.3.2算數(shù)運算類指令-不帶進位位加法指令,27,例:,先做67H+A0H=107H,而107H顯然超過了0FFH,因此最終保存在A中的是07H,而1則到了PSW中的CY位了。換言之,CY就相當于是100H。然后再做10H+30H+CY,結果是41H,所以最終的結果是4107H-引出帶進位位的加法指令。,1067H+30A0H,0001000001100111,0011000010100000,,0100000100000111,1067H,30A0H,,4107H,帶進位位的加法實例,28,ADDCA,Rn;A+Rn+CY→AADDCA,direct;A+(direct)+CY→AADDCA,@Ri;A+(Ri)+CY→AADDCA,#data;A+data+CY→A用途:將A中的值和其后面的值以及進位位C中的值相加,最終結果存在A,常用于多字節(jié)數(shù)運算中。說明:由于51單片機是一種8位機,所以只能做8位的數(shù)學運算,但8位運算的范圍只有0~255,這在實際工作中是不夠的,因此就要進行擴展,一般是將2個8位(兩字節(jié))的數(shù)學運算合起來,成為一個16位的運算,這樣,可以表達的數(shù)的范圍就可以達到0~65535。,3.3.2算數(shù)運算類指令-帶進位位加法指令,29,設:1067H存在R1R0中,30A0H存在R3R2中,計算R1R0+R3R2,結果存在R5R4中。,MOVA,R0ADDA,R2;R0+R2→A和CYMOVR4,AMOVA,R1ADDCA,R3;R1+R3+CY→A和CYMOVR5,A,帶進位位的加法指令實例,30,在進行BCD碼加法運算時,跟在ADD和ADDC指令之后,用于對累加器A中剛進行的兩個BCD碼的加法的結果進行十進制調整。,;A=23H,按十進制規(guī)律加,DAA,3.3.2算數(shù)運算類指令-十進制調整指令,例:A=00010101BCD(代表十進制數(shù)15)執(zhí)行ADDA,#08后,A=1DH,按二進制規(guī)律執(zhí)行BCD數(shù)加后,得到非法的BCD數(shù),31,SUBBA,#data;(A)←(A)-#data-(C)SUBBA,direct;(A)←(A)-(direct)-(C)SUBBA,@Ri;(A)←(A)-((Ri))-(C)SUBBA,Rn;(A)←(A)-(Rn)-(C)由于減法只有帶借位減一條指令,所以在單字節(jié)相減時,須先清借位位,以免相減后結果出錯。,例1設累加器內容為D9H,R0內容為87H,求兩者相減結果。CLRCSUBBA,R0執(zhí)行后(A)=52H,CY=0,OV=0若運算兩數(shù)為無符號數(shù),則其溢出與否和“OV”狀態(tài)無關而靠CY是否有借位予以判別,OV僅表明帶符號數(shù)運算時是否溢出。,3.3.2算數(shù)運算類指令-帶借位減指令,32,乘法指令MULAB該指令把累加器A和寄存器B中的8位無符號整數(shù)相乘,16位乘積的低字節(jié)在累加器A中,高字節(jié)在寄存器B中,如果乘積大于255(0FFH),則溢出標志位置1,否則清0,運算結果總使進位標志CY清0。例1設(A)=80H(128),(B)=32H(50),執(zhí)行指令:MULAB執(zhí)行結果:乘積為1900H(6400),(A)=00H,(B)=19H,OV=1,CY=0,3.3.2算數(shù)運算類指令-乘除法指令,33,除法指令DIVAB該指令把累加器A中的8位無符號整數(shù)除以寄存器B中8位無符號整數(shù),所得商放在累加器A中,余數(shù)存在寄存器B中,標志位CY和OV均清0。若除數(shù)(B中內容)為00H,則執(zhí)行后結果為不定值,并置位溢出標志OV,在任何情況下進位標志CY總清0。例設累加器內容為135(87H),B寄存器內容為12(0CH),則執(zhí)行命令:DIVAB;將使(A)=0BH,(B)=03H,OV=0,CY=0,3.3.2算數(shù)運算類指令-乘除法指令,34,增1指令INCA;(A)←(A)+1INCdirect;(direct)←(direct)+1INC@Ri;((Ri))←((Ri))+1INCRn;(Rn)←(Rn)+1INCDPTR;(DPTR)←(DPTR)+1INC指令把所指出的變量加1,結果仍送回原地址單元,原來若為0FFH,加1后將變成00H,運算結果不影響任何標志位。,3.3.2算數(shù)運算類指令-增1、減1指令,35,例1設(R0)=7EH,內部數(shù)據(jù)RAM中(7EH)=0FFH,(7FH)=40H,則執(zhí)行下列指令:INC@R0;(7EH)←00HINCR0;(R0)←7FHINC@R0;(7FH)←41H執(zhí)行結果:(R0)=7FH,(7EH)=00H,(7FH)=41H例2執(zhí)行指令序列:MOVDPTR,#1FFEH;(DPTR)←1FFEHINCDPTR;(DPTR)←1FFFHINCDPTR;(DPTR)←2000HINCDPTR;(DPTR)←2001H將使(DPTR)=2001H,3.3.2算數(shù)運算類指令-增1、減1指令,增1指令實例,36,減1指令DECA;(A)←(A)-1DECdirect;(direct)←(direct)-1DEC@Ri;((Ri))←((Ri))-1DECRn;(Rn)←(Rn)-1上述指令將指定變量減1,結果仍存在原指定單元,原指定單元內容若為00H,減1操作后變成0FFH,不影響任何標志位。例執(zhí)行下述程序:MOVR1,#7FH;(R1)←#7FHMOV7EH,#00H;(7EH)←#00HMOV7FH,#40H;(7FH)←#40HDEC@R1;(7FH)←3FHDECR1;(R1)←7EHDEC@R1;(7EH)←0FFH結果:(R1)=7EH,(7EH)=0FFH,(7FH)=3FH,3.3.2算數(shù)運算類指令-增1、減1指令,37,3.3.3邏輯運算類指令(24條),功能:對2個操作數(shù)按位進行邏輯操作,結果送到A或直接尋址單元。主要操作與、或、異或、移位、取反、清零等。對標志位的影響除了目的操作數(shù)為ACC的指令影響奇偶標志P外,一般不影響標志位。,38,ORLA,Rn;A∨Rn→AORLA,direct;A∨(direct)→AORLA,@Ri;A∨(Ri)→AORLA,#data;A∨data→AORLdirect,A;(direct)∨A→(direct)ORLdirect,#data;(direct)∨data→(direct),例:71H和56H相或:01110001(71H)∨)01010110(56H),01110111即77H,,3.3.3邏輯運算類指令-邏輯或指令,39,ANLA,Rn;A∧Rn→AANLA,direct;A∧(direct)→AANLA,@Ri;A∧(Ri)→AANLA,#data;A∧data→AANLdirect,A;(direct)∧A→(direct)ANLdirect,#data;(direct)∧data→(direct),例:71H和56H相與:01110001(71H)∧)01010110(56H),01010000即50H,,3.3.3邏輯運算類指令-邏輯與指令,40,例:71H和56H相異或:01110001(71H)⊕)01010110(56H),XRLA,Rn;A⊕Rn→AXRLA,direct;A⊕(direct)→AXRLA,@Ri;A⊕(Ri)→AXRLA,#data;A⊕data→AXRLdirect,A;(direct)⊕A→(direct)XRLdirect,#data;(direct)⊕data→(direct),00100111即27H,,3.3.3邏輯運算類指令-邏輯異或指令,41,1.累加器A清0指令:CLRA;(A)←0功能:把00H送入累加器A中2.累加器A求反指令:CPLA;(A)←()功能:把累加器內容求反后送入累加器A中。例設累加器原來內容為07H,則執(zhí)行CLRA后將變成00H,再執(zhí)行CPLA后將變?yōu)?FFH。,3.3.3邏輯運算類指令-清零和取反,42,RLARRARLCARRCA,RLCA和RRCA指令,影響P標志和CY。,3.3.3邏輯運算類指令-循環(huán)移位指令,43,當最高位為0時,左移一位相當于乘2。例MOVA,#01H;01H送累加器ARLA;02H送ARLA;04H送ARLA;08H送A當最低位為0時,右移一位相當于除2,上述累加器(A)=08H,執(zhí)行指令:RRA;(A)←04HRRA;(A)←02HRRA;(A)←01H將使累加器內容又變?yōu)?。,3.3.3邏輯運算類指令-循環(huán)移位指令,44,3.3.4程序轉移指令-無條件轉移指令,1.無條件轉移指令作用:控制程序計數(shù)器從現(xiàn)行值轉移到目標地址,該目標地址可通過直接,間接或相對尋址得到。(1)長轉移指令LJMPaddr16;(PC)←addr16指令提供16位目標地址,將指令中第二,第三字節(jié)地址碼分別裝入PC的高8位和低8位中,程序無條件轉向指定的目標地址去執(zhí)行。不影響標志位。由于直接提供16位目標地址,所以執(zhí)行這條指令可以使程序從當前地址轉移到64K程序存儲器地址空間的任何單元。經(jīng)常使用的格式:LJMP標識符….標識符:例在程序存儲器0000H單元存放一條指令LJMP2030H則上電復位后程序將跳到2030H單元去執(zhí)行,45,(2)短轉移指令-轉移的目標地址不能夠超出2K。如果超過了2K范圍,匯編程序會提示出錯信息。本指令不影響標志位(了解這個過程和2K的含義)。經(jīng)常使用的格式:AJMP標識符、….標識符:,AJMPaddr11;PC←(PC)+2,PC10~0←addr11,3.3.4程序轉移指令-無條件轉移指令,46,(3)相對短轉移指令SJMPrel;(PC)←(PC)+2;(PC)←(PC)+rel其中,rel為相對偏移量,是一個8位帶符號的數(shù)。經(jīng)常使用的格式:sjmp標識符….標識符:如果程序中使用:HARE:SJMPHARE將會造成單指令的無限循環(huán)。sjmp$,3.3.4程序轉移指令-無條件轉移指令,47,,,,,“標號”(插入的內容)[標號:]操作碼[操作數(shù)][;注釋],如:LJMPLOOP…….LOOP:MOVA,#7FH;A←7FH,標號是語句地址的標志符號,有關標號的規(guī)定為:,由1~8個ASCII字符組成。第一個字符必須是字母,其余字符可以是字母、數(shù)字或其他特定字符;不能使用已經(jīng)定義了的符號作為標號。如指令助記符、寄存器符號名稱等;后邊必須跟冒號。,48,(4)間接轉移指令(散轉)JMP@A+DPTR;(PC)←(A)+(DPTR)過程:把A里的8位無符號數(shù)與作為基址寄存器DPTR中的16位數(shù)據(jù)相加,所得的值裝入PC做為轉移的目標地址。不影響任何標志。特點:其轉移地址不是匯編或編程時確定的,而是在程序運行時動態(tài)決定的,這是和前三條指令的主要區(qū)別,3.3.4程序轉移指令-無條件轉移指令,49,該類指令執(zhí)行滿足某種特定條件的轉移,其目標地址在以下一條指令的起始地址為中心的256字節(jié)范圍中(-128到+127)(了解)。(1)累加器判零轉移指令JZrel;累加器為0轉移JNZrel;累加器不為0轉移經(jīng)常使用的格式:JZ標識符….標識符:該指令不改變累加器內容,不影響標志位。(例子見下頁),3.3.4程序轉移指令-條件轉移指令,50,例執(zhí)行程序:MOVA,#01H;01送累加器AJZBRAN1;A非零不轉,繼續(xù)執(zhí)行DECA;A減1內容為0JZBRAN2;A為0轉BRAN2執(zhí)行BRAN1:…..BRAN2:…..或執(zhí)行:CLRA;A清0JNZBRAN1;A為0繼續(xù)執(zhí)行INCA;A內容加1JNZBRAN2;A內容非零轉BRAN2執(zhí)行BRAN1:…..BRAN2:…程序都轉移到BRAN2去執(zhí)行。,3.3.4程序轉移指令-條件轉移指令,51,CJNE(目的字節(jié)),(源字節(jié)),rel;比較不等跳功能:比較兩個操作數(shù)的大小,如不相等則轉移,相等則繼續(xù)執(zhí)行。如果目的字節(jié)的無符號整數(shù)值小于源字節(jié)的無符號整數(shù)值,則置位進位標志,否則清0進位位,指令不影響任何一個操作數(shù)。(了解rel的使用)經(jīng)常使用的格式:CJNE(目的字節(jié)),標識符….標識符:,具體的比較轉移指令有4條(p65):CJNEA,#data,relCJNEA,direct,relCJNE@Ri,#data,relCJNERn,#data,rel,3.3.4程序轉移指令-條件轉移指令,52,DJNZ(字節(jié)),rel減一非零跳功能:把第一操作數(shù)字節(jié)變量減1,結果送回到第一操作數(shù)中,并判字節(jié)變量是否為0,不為0轉移,否則順序執(zhí)行。如果字節(jié)變量值原為00H,則下溢得0FFH,不影響任何標志(了解rel形式)。常用共有兩條指令構成循環(huán)。DJNZdirect,標識符DJNZRn,標識符….標識符:….,3.3.4程序轉移指令-條件轉移指令,53,例軟件延時。DJNZ指令執(zhí)行時間為2個機器周期,這樣循環(huán)一次可產生2個機器周期延時。下例在程序段中插入2條指令,當主頻12MHz,循環(huán)次數(shù)為24時,可產生49us的軟件延時循環(huán),在P1.7引腳上輸出一個約50us的脈沖。CLRP1.7;P1.7輸出變低電平MOVR2,#18H;賦循環(huán)初值HARE:DJNZR2,HARE;(R2)←(R2)-1,不為零繼續(xù)循環(huán)SETBP1.7;P1.7輸出高電平,3.3.4程序轉移指令-條件轉移指令,54,3.3.5子程序調用和返回指令,子程序調用的必要性:減少重復代碼;子程序調用要注意的問題:1、保護斷點:斷點:下一條將要執(zhí)行的指令的地址,通常壓入堆棧2、建立子程序入口;3、保護現(xiàn)場:保護部分寄存器單元的內容,通常壓入堆棧,55,1.長調用指令LCALLaddr16;PC<-(PC)+3,SP<-(SP)+1,(SP)<-(PC7-0)SP<-(SP)+1,(SP)<-(PC15-8)PC<-addr16;功能:調用64K范圍內所指定的子程序,執(zhí)行過程(了解):(1)首先得到下一條指令的地址(斷點地址);由于為三字節(jié)指令,所以執(zhí)行時首先(PC)+3→(PC)’(2)把PC內容壓入堆棧作為返回地址,(3)目標地址addr16裝入PC,轉去執(zhí)行子程序。經(jīng)常使用的形式:LCALL標識符…..ORGXXXXH標識符:….,3.3.5子程序調用和返回指令,56,2.絕對調用指令ACALLaddr11:PC<-(PC)+2,SP<-(SP)+1,(SP)<-(PC7-0)SP<-(SP)+1,(SP)<-(PC15-8)PC10—0<-addr11;該指令提供11位目標地址,限在2K地址內調用。執(zhí)行過程(了解):(1)獲得斷點地址:由于是雙字節(jié)指令,(PC)+2→(PC)以獲得下一條指令的地址;(2)把斷點地址壓入堆棧作為返回地址,(3)目標地址addr11裝入PC,轉去執(zhí)行子程序,3.3.5子程序調用和返回指令,經(jīng)常使用的形式:ACALL標識符…..ORGXXXXH標識符:….,57,3.返回指令,執(zhí)行該指令時,分別從棧中彈出調用子程序時壓入的返回地址,使程序從調用指令(LCALL或ACALL)的下面相鄰指令開始繼續(xù)執(zhí)行程序。例設(SP)=55H,RAM中(54H)=03H,(55H)=20H,則執(zhí)行RET后,使(SP)=53H,(PC)=2003H,程序由2003H開始繼續(xù)執(zhí)行。,4.中斷返回指令RETI;該指令用于中斷服務子程序的返回,其執(zhí)行過程類似于RET,詳見中斷一章介紹。,3.3.5子程序調用和返回指令,58,LCALL和ACALL指令與LJMP和AJMP區(qū)別:LCALL和ACALL在轉移前,要把執(zhí)行完該指令后PC的內容自動壓入堆棧,才做addr16(或addr11)→PC的工作,這樣設計是為了便于當子程序執(zhí)行完后,CPU可以找到(返回)原出發(fā)點處。RET指令是子程序返回指令,執(zhí)行時,從堆棧中把原出發(fā)地址彈回PC,讓CPU返回執(zhí)行原主程序。,3.3.5子程序調用和返回指令,59,操作:(PC)←(PC)+1執(zhí)行本指令除了PC加1外,機器不作任何操作,而轉向下一條指令去執(zhí)行。不影響任何寄存器和標志。由于為單周期指令,所以時間上只有一個機器周期,常用于精確延時或等待。例利用NOP指令產生方波。LOOP:CLRP2.7;P2.7清0輸出NOP;NOP;空操作NOP;NOP;SETBP2.7;置位P2.7高電平NOP;NOP;空操作NOP;NOP;LJMPLOOP,3.3.6空操作指令-NOP,60,3.3.7位操作指令(17條),MCS-51單片機的硬件結構中,有一個位處理器(又稱布爾處理器),它有一套位變量處理的指令集,包括位變量傳送、邏輯運算、控制程序轉移等。在MCS-51中可以進行位操作的RAM區(qū):內部RAM的20H-2FH這16個字節(jié)單元,即128個位單元(位地址空間位00~7FH);可以位尋址的特殊功能寄存器,61,以PSW中位4(RS1)為例。直接(位)地址方式:如D4H;點操作符號方式:如PSW.4,D0H.4;位名稱方式:如RS1;用戶定義名方式:如用偽指令bitSUB.REGbitRS1定義后,可用SUB.REG代替RS1。,位地址表達方式,3.3.7位操作指令,62,3.3.7位操作指令-位傳送指令(2條),MOVC,bit;bit→CMOVbit,C;C→bit這組指令的功能是實現(xiàn)位累加器(CY)和其它位地址之間的數(shù)據(jù)傳遞。例:MOVC,P1.0;將P1.0的狀態(tài)送給C。MOVP1.0,C;將C中的狀態(tài)送到P1.0;引腳上去。,63,位清0指令CLRC;使CY=0CLRbit;使指令的位地址等于0。例:CLRP1.0;即使P1.0變?yōu)?位置1指令SETBC;使CY=1SETBbit;使指定的位地址等于1。例:SETBP1.0;使P.0變?yōu)?,3.3.7位操作指令-位清0和置位,64,位與指令ANLC,bit;Cy與指定位的值相與,結果送CyANLC,/bit;先將指定的位地址中的值取出后取反,再和Cy相與,結果送回Cy。但注意:指定的位地址中的值本身并不發(fā)生變化。例:ANLC,/P1.0,3.3.7位操作指令-位邏輯運算指令,65,位取反指令CPLC;使Cy值取反。CPLbit;使指定的位的值取反。例:CPLP1.0,位或指令ORLC,bitORLC,/bit,3.3.7位操作指令-位邏輯運算指令,66,位復位指令CLRC;使Cy值取反。CLRbit;使指定的位的值取反。例:CLRP1.0,位置位指令SETBCSETBbit,3.3.7位操作指令-位置位和復位指令,67,判Cy轉移指令JCrelJNCrel第一條指令的功能是如果Cy=1就轉移,否則就順序執(zhí)行。第二條指令則和第一條指令相反,即如果Cy=0就轉移,否則就順序執(zhí)行。經(jīng)常使用的形式:JC標號(或JNC標號)ORGXXXXH標號:,3.3.7位操作指令-位條件轉移指令,68,判位變量轉移指令JBbit,relJNBbit,relJBCbit,rel第一條指令:如果指定的(bit)=1,則轉移,否則順序執(zhí)行,第二條指令功能相反。第三條指令是如果指定的(bit)=1,則轉移,并把該位清0,否則順序執(zhí)行。,3.3.7位操作指令-位條件轉移指令,經(jīng)常使用的形式:JB標號(或JNB標號)ORGXXXXH標號:,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 指令系統(tǒng) 程序設計 第一 部分
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權,請勿作他用。
相關資源
更多
正為您匹配相似的精品文檔
相關搜索
鏈接地址:http://m.zhongcaozhi.com.cn/p-11534995.html