Files
Interpreter/isa/include/isa/Op.h
T
Admin eba48f852e 实现指令编解码与反汇编,冻结 disasm 格式。
- Encode.h/Encode.cpp:encode/decode 往返 + disasm 一行文本
- 指令与映像.md 新增反汇编格式表(9 种形态 + 未知操作码)
- Op.h STORE_* 注释对齐 disasm(rs, slot 寄存器在前)
2026-08-19 14:06:20 +08:00

66 lines
2.4 KiB
C++

/**
* @file Op.h
* @brief 操作码枚举 + 助记符
* @author
* @date 2026-08-19
*/
#pragma once
#include <cstdint>
namespace isa {
// 操作码一次列全。数值即编码:冻结后不得改顺序、不得插值,
// 增加指令只能追加到末尾,并同步 Doc/isa/指令与映像.md 与测试。
enum class Op : uint8_t {
MOVE = 0, // MOVE rd, rs
LOADK = 1, // LOADK rd, const_id
NOT = 2, // NOT rd, rs
AND = 3, // AND rd, ra, rb
OR = 4, // OR rd, ra, rb
ADD = 5, // ADD rd, ra, rb
SUB = 6, // SUB rd, ra, rb
MUL = 7, // MUL rd, ra, rb
DIV = 8, // DIV rd, ra, rb
CMP_EQ = 9, // CMP_EQ rd, ra, rb
CMP_NE = 10, // CMP_NE rd, ra, rb
CMP_LT = 11, // CMP_LT rd, ra, rb
CMP_LE = 12, // CMP_LE rd, ra, rb
CMP_GT = 13, // CMP_GT rd, ra, rb
CMP_GE = 14, // CMP_GE rd, ra, rb
JMP = 15, // JMP offset
JT = 16, // JT r, offset
JF = 17, // JF r, offset
LOAD_I = 18, // LOAD_I rd, slot
STORE_Q = 19, // STORE_Q rs, slot
LOAD_M = 20, // LOAD_M rd, slot
STORE_M = 21, // STORE_M rs, slot
LOAD_GLOBAL = 22, // LOAD_GLOBAL rd, slot
STORE_GLOBAL = 23, // STORE_GLOBAL rs, slot
CAL_TON = 24, // CAL_TON instance_slot
CAL_TOF = 25, // CAL_TOF instance_slot
CAL_CTU = 26, // CAL_CTU instance_slot
CALL = 27, // CALL fn_id
RET = 28, // RET
};
// 操作码总数
static const int kOpCount = 29;
// 助记符:下标与 Op 数值一一对应
inline const char* mnemonic(Op op) {
static const char* const kMnemonic[kOpCount] = {
"MOVE", "LOADK", "NOT", "AND", "OR",
"ADD", "SUB", "MUL", "DIV",
"CMP_EQ", "CMP_NE", "CMP_LT", "CMP_LE", "CMP_GT", "CMP_GE",
"JMP", "JT", "JF",
"LOAD_I", "STORE_Q", "LOAD_M", "STORE_M",
"LOAD_GLOBAL", "STORE_GLOBAL",
"CAL_TON", "CAL_TOF", "CAL_CTU",
"CALL", "RET",
};
const int idx = static_cast<int>(op);
return (idx >= 0 && idx < kOpCount) ? kMnemonic[idx] : "???";
}
}