AT89C52汇编
文章目錄
- 微機原理
- 一、AT89C52結構
- 1.引腳
- 2.程序狀態字PSW
- 二、AT89C52匯編指令
- 1.指令符號約定
- 2.指令系統的分類
- 2.1、按指令功能分類(功能)
- 2.2、按指令所占字節數分類(空間)
- 2.3、按指令執行時間分類(時間)
- 3.尋址方式
- 4.數據傳送類指令
- 4.1、片內RAM和SFR數據傳送指令
- 4.2、片外RAM及I/O接口數據傳送指令
- 4.3、查表指令
- 4.4、數據交換指令
- 4.5、堆棧操作指令
- 5.算術運算類指令
- 5.1、加法運算指令
- 5.2、減法運算指令
- 5.3、乘除運算指令
- 6.邏輯操作類指令
- 7.控制轉移指令
- 7.1、無條件轉移指令
- 7.2、條件轉移指令(相對尋址)
- 7.3、子程序調用指令
- 7.4、返回指令與空操作指令
- 8.位操作指令
- 8.1、位傳送指令
- 8.2、位清0與位置1指令
- 8.3、位邏輯運算指令
- 8.4位條件轉移指令(相對尋址)
- 8.5案例
- 三、匯編語言程序設計
- 1.偽指令
- 1.1、匯編起始偽指令ORG
- 1.2、匯編結束指令END
- 1.3、等值偽指令EQU
- 1.4、定義字節偽指令DB
- 1.5、定義字偽指令DW
- 1.6、定義存儲區偽指令DS
- 1.7、位定義偽指令BIT
- 四、輸入/輸出方式與中斷
- 五、8255A
微機原理
一、AT89C52結構
1.引腳
2.程序狀態字PSW
二、AT89C52匯編指令
1.指令符號約定
| A | 累加器ACC |
| B | B寄存器,主要用于乘除指令,也可以作為通用寄存器使用 |
| C | 進位標志CY,在位操作中作為位運算的累加器,也被稱為布爾累加器 |
| Rn(n=0~7) | 當前選中的工作寄存器組中的寄存器R0~R7之一 |
| Ri(i=0~1) | 當前選中的工作寄存器組中的寄存器R0或R1 |
| @ | 間接尋址方式中,作為間接尋址寄存器的前綴 |
| $ | 當前指令地址 |
| #data | 8位立即數 |
| #data16 | 16位立即數 |
| direct | 8位直接地址,表示片內低128個RAM單元地址及SFR地址 |
| addr11 | 11位目的地址 |
| addr16 | 16位目的地址 |
| rel | 補碼形式表示的8位相對偏移地址,其值在-127~+128范圍內 |
| bit | 片內RAM或特殊功能寄存器SFR中某一可尋址位的位地址 |
| / | 位操作數的取反操作前綴符號 |
| (x) | 表示x地址所對應的單元或寄存器中的內容 |
| ((x)) | 表示以x單元或寄存器內容為地址間接尋址單元的內容 |
| ← | 將箭頭右邊的內容送入箭頭左邊的單元中 |
2.指令系統的分類
2.1、按指令功能分類(功能)
數據傳送指令29條、算術運算指令24條、邏輯運算指令24條、控制轉移指令17條和位操作指令17條。
2.2、按指令所占字節數分類(空間)
單字節指令49條、雙字節指令46條、三字節指令16條。
2.3、按指令執行時間分類(時間)
單周期指令65條、雙周期指令44條和四周期指令2條。
功能屬性是指一條指令的操作功能;空間屬性是指一條指令在程序存儲器中存儲所占用的字節數;事件屬性是指一條指令執行所需占用的時間。
3.尋址方式
| 1 | 基本方式 | 寄存器尋址 | 寄存器R0~R7、A、B、AB、DPTR和C(布爾累計器) |
| 2 | 直接尋址 | 片內RAM低128字節、SFR | |
| 3 | 寄存器間接尋址 | 片內RAM(@R0、@R1、SP) 片外RAM(@R0、@R1、DPTR) | |
| 4 | 立即尋址 | ROM(程序存儲器) | |
| 5 | 擴展方式 | 變址尋址 | ROM(@A+DPTR,@A+PC) |
| 6 | 相對尋址 | ROM(PC當前值的-128~+127字節) | |
| 7 | 位尋址 | 可尋址位(片內RAM的20H~2FH單元的位和部分SFR的位) |
位尋址的實質是直接尋址,相對尋址的則是指令地址的尋址。
4.數據傳送類指令
4.1、片內RAM和SFR數據傳送指令
| MOV A,#data | 74H,data | A←data | 2 | 1 |
| MOV A,direct | E5H,direct | A←direct | 2 | 1 |
| MOV A,Rn | E8H+n | A←(Rn) | 1 | 1 |
| MOV A,@Ri | E6H+i | A←((Ri)) | 1 | 1 |
| MOV direct,A | F5H,direct | direct←(A) | 2 | 1 |
| MOV direct,#data | 75H,direct,data | direct←data | 3 | 2 |
| MOV direct,direct | 85H,原地址,目標地址 | direct←(direct) | 3 | 2 |
| MOV direct,Rn | 88H+n,direct | direct←(Rn) | 2 | 2 |
| MOV direct,@Ri | 86H+i,direct | direct←((Ri)) | 2 | 2 |
| MOV Rn,A | F8H+n | Rn←(A) | 1 | 1 |
| MOV Rn,#data | 78H+n,data | Rn←data | 2 | 1 |
| MOV Rn,direct | A8H+n,direct | Rn←(direct) | 2 | 2 |
| MOV @Ri,A | F6H+i | (Ri)←(A) | 1 | 1 |
| MOV @Ri,#data | 76H+i,data | (Ri)←data | 2 | 1 |
| MOV @Ri,direct | A6H+i,direct | (Ri)←(direct) | 2 | 2 |
| MOV DPTR,#data | 90H,data | DPTR←data | 3 | 2 |
4.2、片外RAM及I/O接口數據傳送指令
| MOVX A,@Ri | E2H+i | A←((Ri))(讀) | 1 | 2 |
| MOVX A,@RDPTR | E20H | A←((DPTR))(讀) | 1 | 2 |
| MOVX @Ri,A | F2H+i | (Ri)←A(寫) | 1 | 2 |
| MOVX @DPTR,A | F0H | A←DPTR(寫) | 1 | 2 |
4.3、查表指令
| MOVC A,@A+PC | 83H | PC←(PC)+1, A←((A)+(PC)) | 1 | 2 |
| MOVC A,@A+DPTR | 93H | A←((A)+(DPTR)) | 1 | 2 |
4.4、數據交換指令
| XCH A,direct | C5H+,direct | (A)與(direct)交換 | 2 | 1 |
| XCH A,Rn | C8H+n | (A)與(Rn)交換 | 1 | 1 |
| XCH A,@Ri | C6H+i | (A)與((Ri))交換 | 1 | 1 |
| XCHD A,@Ri | D6H+i | (A3?0)與((Ri)3?0)交換(A_{3-0})與((Ri)_{3-0})交換(A3?0?)與((Ri)3?0?)交換 | 1 | 1 |
| SWAP A | C4H | (A3?0)與(A7?4)交換(A_{3-0})與(A_{7-4})交換(A3?0?)與(A7?4?)交換 | 1 | 1 |
4.5、堆棧操作指令
| PUSH direct | COH,direct | SP←(SP)+1,(SP)←(direct) | 2 | 2 |
| POP direct | DOH,direct | direct←((SP)),SP←(SP)-1 | 2 | 2 |
累加器ACC必須全寫,不能只寫A。
5.算術運算類指令
5.1、加法運算指令
| ADD A,#data | 24H,data | A←(A)+data(不帶進位) | 2 | 1 |
| ADD A,direct | 25H,direct | A←(A)+(direct)(不帶進位) | 2 | 1 |
| ADD A,Rn | 28H+n | A←(A)+(Rn)(不帶進位) | 1 | 1 |
| ADD A,@Ri | 26H+i | A←(A)+((Ri))(不帶進位) | 1 | 1 |
| ADDC A,#data | 34H,data | A←(A)+data+?(帶進位) | 2 | 1 |
| ADDC A,direct | 35H,direct | A←(A)+(direct)+?(帶進位) | 2 | 1 |
| ADDC A,Rn | 38H+n | A←(A)+(Rn)+?(帶進位) | 1 | 1 |
| ADDC A,@Ri | 36H+i | A←(A)+((Ri))+?(帶進位) | 1 | 1 |
| INC A | 04H,data | A←(A)+1(加1) | 1 | 1 |
| INC direct | 05H,direct | A←(direct)+1(加1) | 2 | 1 |
| INC Rn | 08H+n | A←(Rn)+1(加1) | 1 | 1 |
| INC @Ri | 06H+i | A←((Ri))+1(加1) | 1 | 1 |
| INC DPTR | A3H | DPTR←(DPTR)+1(加1) | 1 | 2 |
| DA A | D4H | 若(A3-0)>9或(AC)=1,則(A3-0)←(A3-0)+6 若(A7-4)>9或(C)=1,則(A7-4)←(A~7-4)+6(十進制調整,BCD碼) | 1 | 1 |
5.2、減法運算指令
| SUBB A,#data | 94H,data | A←(A)-data-(C)(帶借位) | 2 | 1 |
| SUBB A,direct | 95H,direct | A←(A)-(direct)-(C) | 2 | 1 |
| SUBB A,Rn | 98H+n | A←(A)-(Rn)-(C) | 1 | 1 |
| SUBB A,@Ri | 96H+i | A←(A)-((Ri))-(C) | 1 | 1 |
| DEC A | 14H,data | A←(A)-1(減1) | 1 | 1 |
| DEC direct | 15H,direct | A←(direct)-1 | 2 | 1 |
| DEC Rn | 18H+n | A←(Rn)-1 | 1 | 1 |
| DEC @Ri | 16H+i | A←((Ri))-1 | 1 | 1 |
5.3、乘除運算指令
| MUL AB | A4H | A←AXB結果低八位,B←AXB結果高八位 | 1 | 4 |
| DIV AB | 84H | A←A/B的商,B←A/B的余數 | 1 | 4 |
6.邏輯操作類指令
| ANL A,#data | 54H,data | A←(A)∧data(與) | 2 | 1 |
| ANL A,direct | 55H,direct | A←(A)∧(direct) | 2 | 1 |
| ANL A,Rn | 58H+n | A←(A)∧(Rn) | 1 | 1 |
| ANL A,@Ri | 56H+i | A←(A)∧((Ri)) | 1 | 1 |
| ANL direct,A | 52H,direct | direct←(direct)∧(A) | 2 | 1 |
| ANL direct,#data | 53H,direct,data | direct←(direct)∧data | 3 | 1 |
| ORL A,#data | 44H,data | A←(A)∨data(或) | 2 | 1 |
| ORL A,direct | 45H,direct | A←(A)∨(direct) | 2 | 1 |
| ORL A,Rn | 48H+n | A←(A)∨(Rn) | 1 | 1 |
| ORL A,@Ri | 46H+i | A←(A∨((Ri)) | 1 | 1 |
| ORL direct,A | 42H,direct | direct←(direct)∨(A) | 2 | 1 |
| ORL direct,#data | 43H,direct,data | direct←(direct)∨data | 3 | 2 |
| XRL A,#data | 64H,data | A←(A)⊕data(異或) | 2 | 1 |
| XRL A,direct | 65H,direct | A←(A)⊕(direct) | 2 | 1 |
| XRL A,Rn | 68H+n | A←(A)⊕(Rn) | 1 | 1 |
| XRL A,@Ri | 66H+i | A←(A)⊕((Ri)) | 1 | 1 |
| XRL direct,A | 62H,direct | direct←(direct)⊕(A) | 2 | 1 |
| XRL direct,#data | 63H,direct,data | direct←(direct)⊕data | 3 | 1 |
| CLR A | E4H | A←0(清零) | 1 | 1 |
| CPL A | F4H | A←(A) ̄(取反)A←\overline{(A)}(取反)A←(A)?(取反) | 1 | 1 |
| RR A | 03H | A6?0←(A7?1),A7←(A0)(循環移位)A_{6-0}←(A_{7-1}),A_7←(A_0)(循環移位)A6?0?←(A7?1?),A7?←(A0?)(循環移位) | 1 | 1 |
| RRL A | 13H | (A6?0)←(A7?1),C←(A0),(A7)←C(A_{6-0})←(A_{7-1}),C←(A_0),(A_7)←C(A6?0?)←(A7?1?),C←(A0?),(A7?)←C | 1 | 1 |
| RL A | 23H | (A7?1)←A6?0,(A0)←A7(A_{7-1})←A_{6-0},(A_0)←A_7(A7?1?)←A6?0?,(A0?)←A7? | 1 | 1 |
| RLC A | 33H | (A7?1)←A6?0,C←(A7),(A0)←C(A_{7-1})←A_{6-0},C←(A_7),(A_0)←C(A7?1?)←A6?0?,C←(A7?),(A0?)←C | 1 | 1 |
7.控制轉移指令
7.1、無條件轉移指令
| SJMP rel | 80H,rel | PC←(PC)+2+rel(相對轉移) | 2 | 2 |
| AJMP addr11 | a10a9a800001B,a7?a0a_{10}a_9a_800001B,a_7-a_0a10?a9?a8?00001B,a7??a0? | PC←(PC)+2,PC10?0←addr11(絕對轉移)PC←(PC)+2,PC_{10-0}←addr11(絕對轉移)PC←(PC)+2,PC10?0?←addr11(絕對轉移) | 2 | 2 |
| LJMP addr16 | 02H,addr15?8,addr7?002H,addr_{15-8},addr_{7-0}02H,addr15?8?,addr7?0? | PC←addr16(長轉移) | 3 | 2 |
| JMP @A+DPTR | 73H | PC←A+(DPTR)(間接轉移,散轉) | 1 | 2 |
7.2、條件轉移指令(相對尋址)
| JZ rel | 60H,rel | 若(A)=00H,則PC←(PC)+2+rel 若(A)≠00H,則PC←(PC)+2 | 2 | 2 |
| JNZ rel | 70H,rel | 若(A)≠00H,則PC←(PC)+2+rel 若(A)=00H,則PC←(PC)+2 | 2 | 2 |
| CJNE A,#data,rel | B4H,data,rel | 若(A)=data,則PC←(PC)+3 若(A)>data,則PC←(PC)+3+rel,C←0 若(A)<data,則PC←(PC)+3+rel,C←1 | 3 | 2 |
| CJNE A,direct,rel | B5H,direct,rel | 若(A)=(direct),則PC←(PC)+3 若(A)>(direct),則PC←(PC)+3+rel,C←0 若(A)<(direct),則PC←(PC)+3+rel,C←1 | 3 | 2 |
| CJNE Rn,#data,rel | B6H+n,data,rel | 若(Rn)=data,則PC←(PC)+3 若(Rn)>data,則PC←(PC)+3+rel,C←0 若(Rn)<data,則PC←(PC)+3+rel,C←1 | 3 | 2 |
| CJNE @Ri,#data,rel | B1H+i,data,rel | 若((Ri))=data,則PC←(PC)+3 若((Ri))>data,則PC←(PC)+3+rel,C←0 若((Ri))<data,則PC←(PC)+3+rel,C←1 | 3 | 2 |
| DJNZ direct,rel | D5H,direct,rel | 先direct←(direct)-1,再判斷 若(direct)≠00H,則PC←(PC)+3+rel 若(direct)=00H,則PC←(PC)+3 | 3 | 2 |
| DJNZ Rn,rel | D8H+n,rel | 先Rn←(Rn)-1,再判斷 若(Rn)≠00H,則PC←(PC)+3+rel 若(Rn)=00H,則PC←(PC)+3 | 2 | 2 |
7.3、子程序調用指令
| ACALL addr11 | a10a9a810001B,a7?a0a_{10}a_9a_810001B,a_7-a_0a10?a9?a8?10001B,a7??a0? | PC←(PC)+2(絕對調用) SP←(SP)+1,(SP)←(PC7-0) S←(SP)+1,(SP)←(PC15-8) PC10-0←addr11 | 2 | 2 |
| LCALL addr16 | $$12H,addr_{15-8},addr_{7-0} | PC←(PC)+3(長調用) SP←(SP)+1,(SP)←(PC7-0) S←(SP)+1,(SP)←(PC15-8) PC10-0←addr16 | 3 | 2 |
7.4、返回指令與空操作指令
| RET | 22H | PC15-8←((SP)),(SP)←(SP)-1(中斷服務程序) PC7-0←((SP)),(SP)←(SP)-1 | 1 | 2 |
| RETI | 32H | PC15-8←((SP)),(SP)←(SP)-1(中斷服務程序) PC7-0←((SP)),(SP)←(SP)-1 | 1 | 2 |
| NOP | 00H | PC←(PC)+1(可以實現延時1μs) | 1 | 1 |
8.位操作指令
位地址的表示方法:
8.1、位傳送指令
| MOV C,bit | A2H,bit | C←(bit) | 2 | 1 |
| MOV bit,C | 92H,bit | bit←(C) | 2 | 2 |
8.2、位清0與位置1指令
| CLR C | C3H | C←0 | 1 | 1 |
| CLR bit | C2H,bit | bit←0 | 2 | 1 |
| SETB C | D3H | C←1 | 1 | 1 |
| SETB bit | D2H,bit | bit←1 | 2 | 1 |
8.3、位邏輯運算指令
| ANL C,bit | 82H,bit | C←(C)∧(bit) | 2 | 2 |
| ANL C,/bit | B0H,bit | C←(C)∧(bit ̄)C←(C)∧(\overline{bit})C←(C)∧(bit) | 2 | 2 |
| ORL C,bit | 72H,bit | C←(C)∨(bit) | 2 | 2 |
| ORL C,/bit | A0H,bit | C←(C)∨(bit ̄)C←(C)∨(\overline{bit})C←(C)∨(bit) | 2 | 2 |
| CPL C | B3H | C←(C ̄)C←(\overline{C})C←(C) | 1 | 1 |
| CPL bit | B2H,bit | bit←(bit ̄)bit←(\overline{bit})bit←(bit) | 2 | 1 |
8.4位條件轉移指令(相對尋址)
| JC rel | 40H,rel | 若(C)=1,則PC←(PC)+2+rel 若(C)=0,則PC←(PC)+2 | 2 | 2 |
| JNC rel | 50H,rel | 若(C)=0,則PC←(PC)+2+rel 若(C)=1,則PC←(PC)+2 | 2 | 2 |
| JB bit,rel | 20H,bit,rel | 若(bit)=1,則PC←(PC)+3+rel 若(bit)=0,則PC←(PC)+3 | 3 | 2 |
| JNB bit,rel | 30H,bit,rel | 若(bit)=0,則PC←(PC)+3+rel 若(bit)=1,則PC←(PC)+3 | 3 | 2 |
| JBC bit,rel | 10H,bit,rel | 若(bit)=1,則PC←(PC)+3+rel 且(bit)←0 若(bit)=0,則PC←(PC)+3 | 3 | 2 |
8.5案例
上面第二行#1FH為最后一個工作寄存器存儲單元,所以INC后為20H(位尋址區)。
三、匯編語言程序設計
AT89C52單片機的常用偽指令有ORG、END、EQU、DB、DW、DS和BIT等。
1.偽指令
1.1、匯編起始偽指令ORG
格式:[標號:]ORG 16位地址
功能:規定程序塊或數據塊在程序存儲器中存放的起始地址。
1.2、匯編結束指令END
格式:[標號:]END [表達式]
功能:結束匯編。匯編程序遇到END偽指令后即結束匯編。處于END之后的程序,匯編程序不予處理。
1.3、等值偽指令EQU
格式:字符名稱 EQU 操作數
功能:將操作數賦予規定的字符名稱。
注:”字符名稱“不是標號,不能使用”:”做分隔符;”操作數可以是一個數值,也可以是一個已經定義的名字或可以求值的表達式。用EQU指令賦值以后字符名稱可以用作數據地址、代碼地址、位地址或直接當做一個立即數使用。字符所賦值可以是8位或16位二進制數。必須先賦值后使用。
1.4、定義字節偽指令DB
各式:[標號:] DB 8位二進制數表
功能:DB指令是在程序存儲器中,從指定的地址單元開始,定義若干個8位內存單元的內容,用來在程序存儲器的某一部分存入一組8位二進制數,也可以是引號引起來的字符,或者將一個表格存入程序存儲器,匯編以后會影響程序存儲器的內容。(存入數據為十六進制形式,一般2000H單元開始存)。
1.5、定義字偽指令DW
各式:[標號:] DW 16位二進制數表
功能:DW指令是在程序存儲器中,從指定的地址單元開始,定義若干個16位數據。一個16位數據要占兩個存儲單元,其中高8位存入地址單元,低8位存入高地址單元。
注:DB和DW偽指令都只對程序存儲器起作用,不能對數據存儲器的內容進行賦值或進行初始化工作。
1.6、定義存儲區偽指令DS
各式:[標號:] DS 表達式
功能:從指定標號(或地址)開始,保留指定數目(表達式的值)的字節單元作為備用存儲區,供程序運行使用(用于程序存儲器)。這些單元的初值為0。
1.7、位定義偽指令BIT
格式:字符名稱 BIT 位地址
功能:將位地址賦予指定的字符名稱。
四、輸入/輸出方式與中斷
5.1
五、8255A
總結
- 上一篇: html语言教案模版,大班语言教案模板
- 下一篇: 基于AT89C52做秒表0~99秒