08-10那会儿还在读大学的时候,迷恋于各种CPU架构不可自拔,MIPS、ARM7、ARM9、那会儿刚兴起的Cortex-M、8051、MSP430、以及Altera的Nios-II,研究了很多架构、指令集、cache、MPU之类的,那会儿对IP核的认识也刚建立,在OpenCores网站上下载了N多IP核的RTL代码。那是我做学习最开心的时候。
但是现在都没什么用到了
好在现在使用BLE、Zigbee,需要用到TI的CC系列MCU是基于8051架构的,因此又重新学习8051的指令集(虽然现在都是用C编程,基本不关心汇编指令的)
NAME main
PUBLIC main
ORG 0FFFEh
DC16 main
RSEG RCODE
main
;;===========Arithmetic Operations
ADD A, R0
ADD A, R7;
ADD A, 0x5A
ADD A, 0xFF
ADD A, @R0
ADD A, @R1
ADD A, #0x55
ADD A, #0xAA
ADDC A, R0
ADDC A, R7
ADDC A, 0x12
ADDC A, 0x34
ADDC A, @R0
ADDC A, @R1
ADDC A, #0x12
ADDC A, #0xAB
SUBB A, R0
SUBB A, R7
SUBB A, 0x12
SUBB A, 0xEF
SUBB A, @R0
SUBB A, @R1
SUBB A, #0x9A
SUBB A, #0xCD
INC A
INC R0
INC R7
INC 0x12
INC 0x34
INC @R0
INC @R1
INC DPTR
DEC A
DEC R0
DEC R7
DEC 0x12
DEC 0xAB
DEC @R0
DEC @R1
MUL AB
DIV AB
DA A
;;=========== Logical Operations
ANL A, R0
ANL A, R7
ANL A, 0x12
ANL A, 0xEF
ANL A, @R0
ANL A, @R1
ANL A, #0xF0
ANL A, #0x80
ANL 0x10, A
ANL 0xFF, A
ANL 0x12, #0xF0
ANL 0x12, #0x80
ORL A, R0
ORL A, R7
ORL A, 0x12
ORL A, 0xEF
ORL A, @R0
ORL A, @R1
ORL A, #0xF0
ORL A, #0x80
ORL 0x10, A
ORL 0xFF, A
ORL 0x12, #0xF0
ORL 0x12, #0x80
XRL A, R0
XRL A, R7
XRL A, 0x12
XRL A, 0xEF
XRL A, @R0
XRL A, @R1
XRL A, #0xF0
XRL A, #0x80
XRL 0x10, A
XRL 0xFF, A
XRL 0x12, #0xF0
XRL 0x12, #0x80
CLR A
CPL A
RL A
RLC A
RR A
RRC A
SWAP A
;;=========== Data Transfer
MOV A, R0
MOV A, R7
MOV A, 0x12
MOV A, 0x34
MOV A, @R0
MOV A, @R1
MOV A, #0x12
MOV A, #0x34
MOV R0, A
MOV R7, A
MOV R0, 0x12
MOV R7, 0xAB
MOV R0, #0x11
MOV R7, #0x23
MOV 0x12, A
MOV 0x34, A
MOV 0x12, R0
MOV 0x34, R7
MOV 0x12, 0x34
MOV 0x34, 0xAB
MOV 0x12, @R0
MOV 0x34, @R1
MOV 0x12, #0x12
MOV 0xAB, #0xCD
MOV @R0, A
MOV @R1, A
MOV @R0, 0x12
MOV @R1, 0x34
MOV @R0, #0x12
MOV @R1, #0x34
MOV DPTR, #0x1234
MOVC A, @A+DPTR
MOVX A, @R0
MOVX A, @R1
MOVX A, @DPTR
MOVX @R0, A
MOVX @R1, A
MOVX @DPTR, A
PUSH 0x12
POP 0x34
XCH A, R0
XCH A, R7
XCH A, 0x12
XCH A, 0x34
XCH A, @R0
XCH A, @R1
XCHD A, @R0
XCHD A, @R1
;;=========== Program branching
ACALL 0x12
ACALL 0x34
LCALL 0x1234
LCALL 0x5678
RET
RETI
AJMP 0x12
AJMP 0x34
LJMP 0x1234
LJMP 0x5678
SJMP -128
SJMP 127
JMP @A+DPTR
JZ -127
JNZ 128
JC -127
JNC 128
JB 0x12, -127
JNB 0x34, 128
CJNE A, 0x12, -127
CJNE A, #0x12, 0x80
CJNE R0, #0x34, 0x88
CJNE R7, #0x56, 0x99
CJNE @R0, #0x12, 10
CJNE @R1, #0x34, -10
DJNZ R0, 10
DJNZ R7, -10
DJNZ 0x12, 0x10
DJNZ 0x34, 0x20
NOP
NOP
;;=========== Boolean variable operations
CLR C
CLR 0x10
SETB C
SETB 0x12
CPL C
CPL 0x34
ANL C,0x56
ANL C, /0x78
ORL C, 0x9A
ORL C, /0xAB
MOV C, 0xCD
MOV 0xEF, C
END main
该程序重点是对每一条指令的byte、cycle、PSW影响、寻址方式、动作行为进行探究,为了方便研究8051架构的指令集和汇编器、反汇编器、指令集仿真器的编写。
调试必须使用单步调试,并且在每一个指令之前应该设置对应的寄存器或内存。可以使用simulator进行仿真或者直接下载到MCU内部进行单步运行(出现异常情况造成损坏,程序员自行担责)。
指令集参考可以看网上的, 或者IAR或者Keil的文档。其中