| The 8051 Programmer's Reference: A must have for Assembly Programming | |||||||||
| This guide helps in easy Understanding and Visualisation of the instruction Set (Compare the Mnemonic and the Description) | |||||||||
| Internal RAM | External RAM | ||||||||
| Accumulator | Any Program can be written using the following operations: | ||||||||
| A (add) | |||||||||
| Moving Data in RAM | |||||||||
| Register Banks | Arithmetic operations | ||||||||
| Rn (add) | Program Memory | Logic Operations | |||||||
| Moving Data in ROM | |||||||||
| Rest Of The Bytes | Bit Operations and | ||||||||
| add | No operations! | ||||||||
| Comments Welcome! | |||||||||
| The 8051 programmer's model | |||||||||
| Direct addressing | |||||||||
| Register | Name | Address | |||||||
| Immediate Addressing | |||||||||
| Numbers(bin,hex,dec) | |||||||||
| Indirect Addressing | |||||||||
| R0 | R1 | ||||||||
| PSW | |||||||||
| Addressing Methods for the above blocks | |||||||||
| Data Movement | |||||||||
| Opcode | Mnemonic | Description | B | C | Flags | ||||
| MOVING NUMBERS | |||||||||
| 74 | mov A, # n | move into A , a number n(#n) | 2 | 1 | P | ||||
| 78+n | mov Rn, # n | move into a register R0 to R7 (Rn), a number n(#n) | 2 | 1 | |||||
| 75 | mov add, # n | move into a direct address(name) ,a number n(#n) | 3 | 2 | |||||
| 76+p | mov @ Rp, # n | move into an address pointed by R0 or R1( @Rp) , a number n(#n) | 2 | 1 | |||||
| MOVING ACCUMLATOR VALUES | |||||||||
| F8+n | mov Rn,A | move into a register R0 to R7(Rn) the value in A | 1 | 1 | |||||
| F5 | mov add,A | move into a direct address(name) , the value in A | 2 | 1 | |||||
| F6+p | mov @ Rp,A | move into an address pointed by R0 or R1 (@Rp) , the value in A | 1 | 1 | |||||
| MOVING REGISTERS VALUES | |||||||||
| E8+n | mov A,Rn | move into A , the value in the register R0 to R7(Rn) | 1 | 1 | P | ||||
| 88+n | mov add,Rn | move into a direct address(name) , the value in the register Rn | 2 | 2 | |||||
| MOVING DIRECT ADDRESSES (NAME) VALUES | |||||||||
| E5 | mov A,add | move into A , the value in the direct address(name) | 2 | 1 | P | ||||
| A8+n | mov Rn,add | move into a register R0 to R7(Rn),the value in the direct address(name) | 2 | 2 | |||||
| 85 | mov add1,add2 | move into the direct address(name)1, the value in address(name) 2 | 3 | 2 | |||||
| A6+p | mov @ Rp,add | move into an address pointed by R0 or R1 (@Rp),the value in address | 2 | 2 | |||||
| MOVING VALUES IN ADDRESSES POINTED BY R0 AND R1/PSW | |||||||||
| E6+p | mov A,@Rp | move into A , the value in the address pointed by R0 or R1(@Rp) | 1 | 1 | P | ||||
| 86+p | mov add,@Rp | move into the dir. Addr.add, value in the addr. pointed by R0 R1( @Rp) | 2 | 2 | |||||
| Opcode | Mnemonic | Description | B | C | Flags | ||||
| MOVING DATA FROM ROM | |||||||||
| 93 | movC A,@A+DPTR | move Code into A ,from the address given by A+DPTR (@A+DPTR) | 1 | 2 | P | ||||
| 83 | movC A,@A+PC | move Code into A ,from the address given by A+PC (@A+PC) | 1 | 2 | P | ||||
| MOVING DATA FROM EXTERNAL RAM | |||||||||
| E0 | movX A,@DPTR | move from eXt.RAM into A, the value in the addr. pointed by DPTR | 1 | 2 | P | ||||
| E2+p | movX A,@Rp | move from eXt.RAM into A, the val. in the addr. pointed by R0 or R1(@Rp) | 1 | 2 | P | ||||
| MOVING DATA INTO EXTERNAL RAM | |||||||||
| F0 | movX @DPTR,A | move into eXt.RAM at the addr. pointed by DPTR ,the value in A | 1 | 2 | |||||
| F2+p | movX @Rp,A | move into eXt.RAM at the addr. pointed by R0 or R1( @Rp),the value in A | 1 | 2 | |||||
| MOVING A WORD INTO DPTR | |||||||||
| 90 | mov DPTR, # w | move into DPTR, a word(two bytes) (# w) | 3 | 2 | |||||
| Opcode | Mnemonic | Description | B | C | Flags | ||||
| Push and Pop | |||||||||
| C0 | Push add | Push value in dir.addr. add into addr. pointed by SP+1(push on stack) | 2 | 2 | SP | ||||
| D0 | Pop add | Pop into the dir.addr.add,value in addr.pointed by SP (pop from stack) | 2 | 2 | SP | ||||
| EXCHANGE | |||||||||
| C8+n | xchA, Rn | Exchange the values in A and Rn | 1 | 1 | P | ||||
| C5 | xch A, add | Exchange the values in A and dir. Addr. add (name) | 2 | 1 | P | ||||
| C6+p | xch A, @Rp | Exchange the values in A and the address pointed by R0 or R1 (@Rp) | 1 | 1 | P | ||||
| D6+p | xchD A, @Rp | Exchange the LSDs of A and the value in addr.pointed by R0 or R1 (@Rp) | 1 | 1 | P | ||||
| SWAP | |||||||||
| C4 | swap A | Swap the nibbles(hex digits) in A | 1 | 1 | |||||
| MOVE ZERO INTO A | |||||||||
| E4 | clr A | Clear the Accumulator | 1 | 1 | P | ||||
| ROTATION | |||||||||
| 23 | rlA | Rotate left the contents of A(bits moved left once,msb into lsb) | 1 | 1 | |||||
| 03 | rr A | Rotate right the contents of A(bits moved rt. once,lsb into msb) | 1 | 1 | |||||
| 33 | rlc A | Rotate left into carry the contents of A (move msb into carry) | 1 | 1 | C P | ||||
| 13 | rrc A | Rotate right into carry the contents of A (move lsb into carry) | 1 | 1 | C P | ||||
| ARITHMETIC OPERATIONS | |||||||||
| Opcode | Mnemonic | Description | B | C | Flags | ||||
| ADDITION | |||||||||
| 24 | add A,#n | add value in A with the number n(#n) and store in A | 2 | 1 | C AC OV P | ||||
| 28+n | add A,Rn | add value in A with value in register Rn and store in A | 1 | 1 | C AC OV P | ||||
| 25 | add A,add | add value in A with value in dir.addr.add(name) and store in A | 2 | 1 | C AC OV P | ||||
| 26+p | add A,@Rp | add value in A with value in addr.pointed by R0 or R1(@Rp) and store in A | 1 | 1 | C AC OV P | ||||
| ADDITION WITH CARRY | |||||||||
| 34 | addcA,#n | add carry,the value in A , and the number n(#n) . store in A | 2 | 1 | C AC OV P | ||||
| 38+n | addc A,Rn | add carry, the value in A, and the value in Rn. store in A | 1 | 1 | C AC OV P | ||||
| 35 | addc A,add | add carry,the value in A,and the value in dir. Addr.add. store in A | 2 | 1 | C AC OV P | ||||
| 36+p | addcA,@Rp | add carry,the value in A,and the value in addr.pointed by R0 or R1(@Rp). | 1 | 1 | C AC OV P | ||||
| SUBTRACTION | |||||||||
| 94 | subbA,#n | sub borrow (C) from the value in A,and also the number n( #n) . | 2 | 1 | C AC OV P | ||||
| 98+n | subb A,Rn | sub borrow (C) from the value in A, and also the value in Rn. | 1 | 1 | C AC OV P | ||||
| 95 | subb A,add | sub borrow (C) from the value inA,and also the value in add. | 2 | 1 | C AC OV P | ||||
| 96+p | subb A,@Rp | sub borrow (C) from the val. in A,and also the val. pntd by R0 or R1(@Rp) | 1 | 1 | C AC OV P | ||||
| MULTIPLICATION | |||||||||
| A4 | mulAB | Multiply the values in A and B . store lsbyte in A,msbyte in B | 1 | 4 | C OV P | ||||
| DIVISION | |||||||||
| 84 | divAB | Divide the value in A by the value in B.store quotient in A,remainder in B | 1 | 4 | C OV P | ||||
| Opcode | Mnemonic | Description | B | C | Flags | ||||
| INCREMENT | |||||||||
| 04 | incA | Increment the value in A by 1 | 1 | 1 | P | ||||
| 08+n | inc Rn | Increment the value in Register Rn by 1 | 1 | 1 | |||||
| 05 | inc add | Increment the value in dir.addr.add(name) by 1 | 2 | 1 | |||||
| 06+p | inc @Rp | Increment the value in the addr.pointed by R0 or R1(@Rp) by 1 | 1 | 1 | |||||
| A3 | inc DPTR | Increment the value in DPTR by 1 | 1 | 2 | |||||
| DECREMENT | |||||||||
| 14 | dec A | Decrement the value in A by 1 | 1 | 1 | P | ||||
| 18+n | dec Rn | Decrement the value in Register Rn by 1 | 1 | 1 | |||||
| 15 | dec add | Decrement the value in dir.addr.add(name) by 1 | 2 | 1 | |||||
| 16+p | dec @Rp | Decrement the value in the addr.pointed by R0 or R1(@Rp) by 1 | 1 | 1 | |||||
| DECIMAL ADJUST ACCUMULATOR | |||||||||
| D4 | da A | Decimal adjust the Accumulator(BCD adjustment) | 1 | 1 | C P | ||||
| LOGIC OPERATIONS | |||||||||
| Opcode | Mnemonic | Description | B | C | Flags | ||||
| AND LOGIC, IN ACCUMULATOR | |||||||||
| 54 | anl A,#n | Apply AND Logic to value in A and the number n(#n). | 2 | 1 | P | ||||
| 58+n | anl A,Rn | Apply AND Logic to value in A and value in Rn. | 1 | 1 | P | ||||
| 55 | anl A,add | Apply AND Logic to value in A and value in addr.add.(name) | 2 | 1 | P | ||||
| 56+p | anl A,@Rp | Apply AND Logic to val. in A and val. in addr.pointed by R0 or R1(@Rp) | 1 | 1 | P | ||||
| OR LOGIC, IN ACCUMULATOR | |||||||||
| 44 | orl A,#n | Apply OR Logic to value in A and the number n(#n). | 2 | 1 | P | ||||
| 48+n | orlA,Rn | Apply OR Logic to value in A and value in Rn. | 1 | 1 | P | ||||
| 45 | orl A,add | Apply OR Logic to value in A and value in addr.add (name) | 2 | 1 | P | ||||
| 46+p | orlA,@Rp | Apply OR Logic to val. in A and val. in addr.pointed by R0 or R1(@Rp). | 1 | 1 | P | ||||
| EXCLUSIVE OR LOGIC, IN ACCUMULATOR | |||||||||
| 64 | xrl A,#n | Apply EX OR Logic to value in A and the number n(#n). | 2 | 1 | P | ||||
| 68+n | xrl A,Rn | Apply EX OR Logic to value in A and value in Rn. | 1 | 1 | P | ||||
| 65 | xrl A,add | Apply EX OR Logic to value in A and value in addr.add (name). | 2 | 1 | P | ||||
| 66+p | xrl A,@Rp | Apply EX OR Logic to val. in A and val. in addr.pointed by R0 or R1(@Rp). | 1 | 1 | P | ||||
| AND LOGIC, IN DIRECT ADDRESS | |||||||||
| 53 | anl add,#n | Apply AND Logic to value in the dir.addr.add and the number n(#n). | 3 | 2 | |||||
| 52 | anl add,A | Apply AND Logic to value in the dir.addr.add (name)and value in A. | 2 | 1 | |||||
| OR LOGIC, IN DIRECT ADDRESS | |||||||||
| 43 | orl add,#n | Apply OR Logic to value in the dir. Addr.add and the number n(#n). | 3 | 2 | |||||
| 42 | orl add,A | Apply OR Logic to value in the dir.addr.add (name)and value in A. | 2 | 1 | |||||
| EXCLUSIVE OR LOGIC, IN DIRECT ADDRESS | |||||||||
| 63 | xrl add,#n | Apply EX OR Logic to value in the dir. Addr.add and the number n(#n). | 3 | 2 | |||||
| 62 | xrl add,A | Apply EX OR Logic to value in the dir.addr. add (name)and value in A. | 2 | 1 | |||||
| COMPLEMENTING ACCUMULATOR | |||||||||
| F4 | cpl A | Compliment the value in A | 1 | 1 | P | ||||
| MOVING ABOUT IN THE ROM | |||||||||
| Opcode | Mnemonic | Description | B | C | Flags | ||||
| UNCONDITIONAL JUMPS | |||||||||
| 80 | sjmpslabel | Take a short jump to slabel (within + -128 bytes from PC) | 2 | 2 | |||||
| 01+a | ajmp plabel | Take an absolute jump to plabel (within the same 2k page) | 2 | 2 | |||||
| 02 | ljmp label | Take a long jump to label (anywhere you like!,0000 to FFFFh) | 3 | 2 | |||||
| 73 | jmp @A+DPTR | Take a jump to the address pointed by the sum of A + DPTR | 1 | 2 | |||||
| CONDITIONAL JUMPS ,NUMBERS | |||||||||
| B4 | cjne A,#n,slabel | comp.& jump if not equal, the val. in A and the number n (#n)to slabel | 3 | 2 | C | ||||
| B8+N | cjne Rn,#n,slabel | comp. & jump if not equal, the val. in Rn and the number n (#n)to slabel | 3 | 2 | C | ||||
| B6+p | cjne @Rp,#n,slabel | comp.& jmp if not eq, the val.in addr.pntd by Rp and numr. #n to slabel | 3 | 2 | C | ||||
| CONDITIONAL JUMPS,VALUES IN ADDRESSES | |||||||||