参考
8位CPU设计
简介
8位指令宽度,地址宽度,数据宽度,ram,rom,外设统一寻址,目的是设计一个尽可能占用逻辑资源少的cpu
寄存器
| 寄存器 | 含义 | 说明 |
|---|---|---|
| R0~R3 | 通用寄存器 | 临时变量、算术运算 |
| R4 | 操作数1 (o1) | 运算操作数,高低字节可单独写 |
| R5 | 操作数2 (o2) | 运算操作数,高低字节可单独写 |
| R6 | 寄存器A | 运算结果输出寄存器 |
| R7 | SP | 堆栈指针 SP=0 栈顶为R11 |
| R8 | PC | 程序计数器(指向 ROM) |
| R9 | PSW | 标志位:零、正、负、溢出等 |
| R10 | 中断向量 | 定时器/IO中断共用 |
| R11~R15 | 堆栈寄存器 | 函数调用现场保存 |
指令集
| 操作码 | 指令 OPCODE o3 | 含义 / 子码说明 |
|---|---|---|
| 1 | OP1L #1 | 将立即数写入 操作数寄存器 1 的低字节 |
| 2 | OP1H #1 | 将立即数写入 操作数寄存器 1 的高字节 |
| 3 | OP2L #1 | 将立即数写入 操作数寄存器 2 的低字节 |
| 4 | OP2H #1 | 将立即数写入 操作数寄存器 2 的高字节 |
| 5 | MOV | 数据转移: |
0000:o1, #o2立即数 → 内存 | ||
0001:o1, Ro2寄存器 → 内存 | ||
0010:Ro1, Ro2寄存器 → 寄存器 | ||
0011:@Ro1, #o2立即数 → 指针 | ||
0011:@Ro1, R噢立即数 → 指针 | ||
0100:@Ro1, o2寄存器 → 指针 | ||
0101:@Ro1, @Ro2指针 → 指针 | ||
0110:Ro1, @Ro2指针 → 寄存器 | ||
| 6 | 运算(A <= A ? o2) | |
| ADD | 0000: ADD 加 | |
| SUB | 0001: SUB 减 | |
| MUL | 0010: MUL 乘 | |
| DIV | 0011: DIV 除 | |
| REM | 0100: REM 取余 | |
| AND | 0101: AND 与 | |
| OR | 0110: OR 或 | |
| NOT | 0111: NOT 非 | |
| XOR | 1000: XOR 异或 | |
| INC | 1001: INC 加1 | |
| DEC | 1010: DEC 减1 | |
| 7 | SET #imm | imm=0 为 o1,o2,否则为o1,#imm |
| 8 | CLR #imm | imm=0 为 o1,o2,否则为o1,#imm |
| 9 | CPL #imm | imm=0 为 o1,o2,否则为o1,#imm |
| 10 | LJMP | 条件跳转(根据寄存器A结果): |
| 0000: A = 任何 → 无条件跳转 | ||
| 0001: A > 0 | ||
| 0010: A = 0 | ||
| 0011: A < 0 | ||
| 0100: A ≥ 0 | ||
| 0101: A ≤ 0 | ||
| 0110: JP | ||
| 0111: JNP | ||
| 1000: JZ | ||
| 1011: JNZ | ||
| 1100: JC | ||
| 1101: JNC | ||
| 11 | CALL | 调用函数 o2 |
| 12 | RET | 返回函数 |
| 13 | NOP | 空指令 |
伪指令
| 操作码 | 真实指令展开 |
|---|---|
| op #1 | |
| OP2H #1>>4 | |
| OP2L #1&0xf | |
| op #1,#2 | |
| OP1H #1>>4 | |
| OP1L #1&0xf | |
| OP2H #2>>4 | |
| OP2L #2&0xf | |
| mov r1,#3 | |
| OP1H #1>>4 | |
| OP1L #1&0xf | |
| OP2H #3>>4 | |
| OP2L #3&0xf | |
| MOV Ro1,#o2 |