3.1.EM78指令概述 EM78156 & EM78P156 單片機(jī)共有的 58 條指令,其寬度為 13 位。每一個指令碼可分割成兩部份,第一部分為標(biāo)示指令功能的運(yùn)算碼( OPCODE ),第二部份則指出運(yùn)算時所需之參數(shù),亦即運(yùn)算碼( OPERAND )。而指令的類型大致可分為下列四種: (1)控制型指令( control operation ): 如 INT...等等。 (2)面向寄存器(字節(jié)操作)型指令( register oriented ): 如 | ; move Reg_B to A | ADD Reg_B, A | ; add Reg_B with A, and | | ; save in Reg_B |
... 等等。 (3)位操作型指令( bit oriented ): 如 BC,JBS...等等。 (4)常數(shù)型指令( constant operation ):如 MOV A, @0x55 ; move 0x55 to A XOR @0xFF ;Xor A with 0xFF 一般而言,EM78 系列八位微控制器除一個指令需兩個周期之外,其他的指令只需一個指令周期,除了對 PC (Program Counter)做 “寫” 的指令,需二個指令周期,如 (MOV PC, A)。 3.2.EMC 匯編語言指令集符號解說: 1.符號‘R’:代表一般用途寄存器中的其中一個。 2.符號‘B’:代表一般用途寄存器中的某一位。 3.符號‘K’:代表8位或10位的常數(shù)或內(nèi)容。 4.符號‘A’:代表累加寄存器。 3.2.1. 面向寄存器(字節(jié)操作)型指令(26條)助記符號 | 指令動作 | 標(biāo)志影響 | 指令周期 | 語言描述 | ADD A,R | A+R->A | Z,C,DC | 1 | ADD | ADD R,A | A+R->R | Z,C,DC | 1 | ADD | AND A,R | A&R->A | Z | 1 | AND | AND R,A | A&R->R | Z | 1 | AND | CLR R | 0->R | Z | 1 | Clear Register | CLRA | 0->A | Z | 1 | Clear the A register | COM R | /R->R | Z | 1 | Complement R | 助記符號 | 指令動作 | 標(biāo)志影響 | 指令周期 | 語言描述 | COMA R | /R->A | Z | 1 | Complement R,Place in A | DAA | A寄存器調(diào)整為BCD值 | C | 1 | Decimal Adjust | DEC R | R-1->R | Z | 1 | Decrement R | DECA R | R-1->A | Z | 1 | Decrement R,Place in A | DJZ R | R-1->R 結(jié)果為零就跳過下一個指令 | | 1 | Decrement R,Skip if 0 | DJZA R | R-1->A 結(jié)果為零就跳過下一個指令 | | 1 | Decrement R,Please in A register, Skip if 0 | INC R | R+1->R | Z | 1 | Increment R | INCA R | R+1->A | Z | 1 | Increment R,Please in A | JZ R | R+1->R, 結(jié)果為零就跳過下一個指令 | | 1 | Increment R,Skip if 0 | JZA R | R+1->A, 結(jié)果為零就跳過下一個指令 | | 1 | Increment R,Place in the A regiser,Skipif 0 | MOV R,A | A->R | | 1 | Move Data | MOV A,R | R->A | Z | 1 | Move Data | MOV R,R | R->R | Z | 1 | Move Data | OR A,R | A OR R ->A | Z | 1 | Inclusive OR | OR R,A | A OR R->R | Z | 1 | Inclusive OR | SUB A,R | R-A->A | Z,C,DC | 1 | Subtract | SUB R,A | R-A->R | Z,C,DC | 1 | Subtract | XOR A,R | A XOR R->A | Z | 1 | Exclusive OR | XOR R,A | A XOR R->R | Z | 1 | Exclusive OR |
3.2.2. 面向位操作類指令(10條) 助記符號 | 指令動作 | 標(biāo)志影響 | 指令周期 | 語言描述 | BC R,B | 0->R(B) | | 1 | Bit Clear | BS R,B | 1->R(B) | | 1 | Bit Set | JBC R,B | 如果R(B)=0,則跳過下一個指令 | | 1 | Bit Test, Skip if Clear | JBS R,B | 如果R(B)=1,則跳過下一個指令 | | 1 | Bit Test, Skip if Set | RLC R | R(N)->R(N+1) R(7)->C C->R(0) | C | 1 | Rotate Left R through Carry | RLCA R | R(N)->A(N+1) R(7)->C C->A(0) | C | 1 | Rotate Left R through Carry,Place in the A Register | RRC R | R(N)->R(N-1) R(0)->C C->R(7) | C | 1 | Rotate Right R through Carry | 助記符號 | 指令動作 | 標(biāo)志影響 | 指令周期 | 語言描述 | RRCA R | R(N)->A(N-1) R(0)->C C->A(7) | C | 1 | Rotate Right R through Carry,Place in the A Register | SWAP R | R(0-3)->R(4-7) R(4-7)->R(0-3) | | 1 | Swap R | SWAPA R | R(0-3)->A(4-7) R(4-7)->A(0-3) | | 1 | Swap R |
3.2.3. 常數(shù)操作和控制類指令(22條)助記符號 | 指令動作 | 標(biāo)志影響 | 指令周期 | 語言描述 | ADD A,K | A+K->A | Z,C,DC | 1 | ADD | AND A,K | A&K->A | Z | 1 | AND | CALL K | PC+1->[SP] (PAGE,K)->PC | | 1 | Subroutine Call | CONTR | CONT->A | | 1 | Move CONT to the A register | CONTW | A->CONT | | 1 | Move A to CONT | DISI | 禁止中斷 | | 1 | Disable Interrupt | ENI | 使能中斷 | | 1 | Enable Interrupt | INT | PC+1->[SP] 001H->PC | | 1 | Software interrupt | IOR R | IOCR->A | | 1 | Move IOCR to the A register | IOW R | A->IOCR | | 1 | Move A to IOCR | JMP K | (PAGE,K)->PC | | 1 | Unconditional Branch | MOV A,K | K->A | | 1 | Move Data | NOP | | | 1 | No Operation | OR A,K | A OR K->A | Z | 1 | Inclusive OR | RET | [堆棧頂端]->PC | | 1 | Return from Subroutine | RETI | [堆棧頂端]->PC,使能中斷 | | 1 | Return from Interrupt | RETL K | K->A, [堆棧頂端]->PC | | | Return Immediate Data to the A Register | SLEP | 0->WDT,振蕩器停止振蕩 | T,P | 1 | Into Sleep mode | SUB A,K | K-A->A | Z,C,DC | 1 | Subtract | TBL | PC+A->PC | Z,C,DC | 2 | Table Look Up | WDTC | 0->WDT | T,P | 1 | Clear Watchdog Timer | XOR A,K | A XOR K->A | Z | 1 | Exclusive OR |
3.3.EM78指令尋址方式關(guān)于對寄存器的存取,必須要先說明寄存器的位址,說明暫存的位址的方式稱做尋址方式,EM78的尋址方式有兩種,一種為直接尋址,一種為間接尋址。 3.3.1. 立即數(shù)尋址這種方式就是操作數(shù)為立即數(shù),可直接從指令中獲取。 例:MOV A,@0x16 ;將常數(shù)0x16送給寄存器A 3.3.2. 直接尋址若是使用者要存取寄存器的內(nèi)容,可以在運(yùn)算碼上直接描述。 l 例:將寄存器0X20的內(nèi)容,COPY到寄存器0X21中。 MOV A, 0X20 MOV 0X21, A 3.3.3. 間接尋址這種尋址方式是通過寄存器R4來實(shí)現(xiàn)的,R4的bit0-5是用來選擇寄存器(地址:00-06,0F-3F) 若是使用者所需要存取的寄存器,有位址相鄰的特性,使用間接尋址是很方便的。 l 例:寫一個程序,將寄存器0X20~0X3F的值都填0。 ;設(shè)定A = 0X20。 ;設(shè)定間接尋址寄存器(0X04) ;的內(nèi)含值為0X20 ;清除0X04所指的寄存器。 ;遞增間接尋址寄存器(0X04) ;設(shè)定A=0X04寄存器的值。 ;比較間接尋址的位址是否 ;以到0X3F。若是則結(jié)束。 ;否則在繼續(xù)。 | MOV A, @0X20AGAIN: CLR 0 INC 0X04 MOV A, 0X04 XOR A, 0X3F JBS 0X03, 2 JMP AGAIN END: 3.3.4. 位尋址這種位尋址是對寄存器中的任一位(bit)進(jìn)行操作。 例:BS 0x12,2 ;將寄存器0x12的第2位置為“1”。 3.4.EM78指令說明 | | | | 語 法 | ADD A,R | 編 碼 | | | | | | 操作內(nèi)容 | A + R --> A | 受影響的標(biāo)志 | Z,C,DC﹔零標(biāo)志﹐進(jìn)位標(biāo)志和輔助進(jìn)位標(biāo)志都會受影響 | 說 明 | 將A寄存器的內(nèi)含值加上R寄存器的內(nèi)含值﹐並且把結(jié)果載入A寄存器中。 | | | 語 法 | ADD R,A | 編 碼 | | | | | | 操作內(nèi)容 | A + R --> R | 受影響的標(biāo)志 | Z,C,DC﹔零標(biāo)志﹐進(jìn)位標(biāo)志和輔助標(biāo)志都會受影響 | 說 明 | 將A寄存器的內(nèi)含值加上R寄存器的內(nèi)含值﹐並且把結(jié)果載入R寄存器中。 | | | 語 法 | ADD A, k | 編 碼 | | | | | | 操作內(nèi)容 | K + A --> A | 受影響的標(biāo)志 | Z,C,DC﹔零標(biāo)志﹐進(jìn)位標(biāo)志和輔助標(biāo)志都會受影響 | 說 明 | 將A寄存器的內(nèi)含值加上立即值K﹐並且把結(jié)果載入A寄存器中。 | 舉例說明 | 下兩行指令敘述為 A = R 11 + R 12. MOV A,0x11 ADD A,0x12 ;A = R 11 + R 12下兩行指令敘述為 R 10 = R 11 + R 12. MOV A,0x11 MOV 0x10,A MOV A,0x12 ADD 0x10,A ;R 10 = R 11 + R 12
下兩行指令敘述為 A = 0x01 + 0x01. MOV A,@0x01 ;A = 0x01 ADD A,@0x01 ;A = 0x02 |
| | | | 語 法 | AND A,R | 編 碼 | | | | | | 操作內(nèi)容 | A & R --> A | 受影響的標(biāo)志 | Z﹔零標(biāo)志 | 說 明 | 將A寄存器和R寄存器AND在一起﹐并將結(jié)果存入A寄存器。 | | | 語 法 | AND R,A | 編 碼 | | | | | | 操作內(nèi)容 | A & R --> R | 受影響的標(biāo)志 | Z﹔零標(biāo)志 | 說 明 | 將A寄存器和R寄存器AND在一起﹐并將結(jié)果存入R寄存器。 | | | 語 法 | AND A,K | 編 碼 | | | | | | 操作內(nèi)容 | A & K --> A | 受影響的標(biāo)志 | Z﹔零標(biāo)志 | 說 明 | 將A寄存器和立即值K﹐AND在一起﹐并將結(jié)果存入A寄存器。 | | | 舉例說明 | 將port 6和R 10 register AND起來, 并將結(jié)果輸出到port6 MOV A,0x6 ;從port6輸入內(nèi)容 AND A,0x10 ;把內(nèi)容和 R 10 做AND MOV 0x6,A ;將結(jié)果輸出到port6 R 10 = R 11 AND R 12 MOV A,0x11 MOV 0x10,A MOV A,0x12 AND 0x10,A ;R 10 = R 11 AND R 12 |
| | 語 法 | BC R,b | 編 碼 | | | | | | 操作內(nèi)容 | 0 --> R(b) | 受影響的標(biāo)志 | 無 | 說 明 | R寄存器的位 “b”被清為0。 | 舉例說明 | MOV A,@0x0f MOV 0x10,A ;R 10 = 00001111 BC 0x10,3 ;R 10 = 00000111 |
| | 語 法 | BS R,b | 編 碼 | | | | | | 操作內(nèi)容 | 1 --> R(b) | 受影響的標(biāo)志 | 無 | 說 明 | R寄存器的位“b” 被設(shè)成1。 | 舉例說明 | 將狀態(tài)寄存器的零標(biāo)志設(shè)成1。 BS 0x3,2
|
CALL | Subroutine Call | 語 法 | CALL k | 編 碼 | | | | | | 操作內(nèi)容 | PC+1 --> [Top of Stack] k --> PC(9::0) R3(7::5) --> PC(12::10) | 受影響的標(biāo)志 | 無 | 說 明 | 當(dāng)呼叫一個子程序時﹐首先會將下一個指令的執(zhí)行位址存入堆棧中﹐接下來將子程序的進(jìn)入位址載入程序計(jì)數(shù)器中。 | 舉例說明 | HERE: CALL SUBRTN CONT: MOV A,@10 執(zhí)行CALL指令之前 PC = address HERE 執(zhí)行CALL指令之后 PC = address SUBRTN [Top of Stack] = address CONT |
| | | | 語 法 | CLRA | 編 碼 | | | | | | 操作內(nèi)容 | 0 --> A﹔A寄存器清除為0 | 受影響的標(biāo)志 | 1 --> Z﹔零標(biāo)志設(shè)成1 | 說 明 | 清除A寄存器﹐同時設(shè)定Z標(biāo)志 | | | 舉例說明 | CLRA ; 清除A寄存器﹐同時設(shè)定Z標(biāo)志 |
| | | | 語 法 | CLR R | 編 碼 | | | | | | 操作內(nèi)容 | 0 --> R﹔R寄存器清除為0 | 受影響的標(biāo)志 | 1 --> Z﹔零標(biāo)志設(shè)成1 | 說 明 | 清除R寄存器﹐并設(shè)定零標(biāo)志。 | | | 舉例說明 | CLR 0x10 ;清除 0x10寄存器 |
| | 語 法 | COMA R | 編 碼 | | | | | | 操作內(nèi)容 |  --> A | 受影響的標(biāo)志 | Z﹔零標(biāo)志 | 說 明 | 將所指定的寄存器取補(bǔ)數(shù)﹐再放入A寄存器中。 | | 從port6輸入一個值﹐將其取補(bǔ)數(shù)之后在由port6輸出。 |
| | 語 法 | COM R | 編 碼 | | | | | | 操作內(nèi)容 |  .--> R | 受影響的標(biāo)志 | Z﹔零標(biāo)志 | 說 明 | 將R暫存取補(bǔ)數(shù)﹐再存入R寄存器中。 | 舉例說明 | 將0x10寄存器的內(nèi)含值﹐取補(bǔ)數(shù)。 MOV A,@0x11 MOV 0x10,A ;R 10 = 0x11 COM 0x10 ;R 10 = 0xEE |
|