蠕动是探索未知领域最好的方式
简单的Assembler并不算很不好弄。首先舍弃了各种复杂结构的metadata generating, 只对简单指令进行模拟。
比如
OPDEF(ADD, "add", 0XFF, 0X0C )
OPDEF(SUB, "sub", 0XFF, 0X0D )
OPDEF(MULT, "mult", 0XFF, 0X0E )
OPDEF(DIV, "div", 0XFF, 0X10 )
OPDEF(LDC, "ldc", 0XFF, 0X23 )
设计最为简单的Token class
struct Token
{
Token();
void Process();
U16 op; //opcode;
U32 addr; //offset of bytecode;
U32 line; //line num;
U64 arg; //Token arg;
};
//定义bytecode generating buffer;
std::vector<Token> token; //token buffer;
代码文件: Iceman.elf
ldc 3344
ldc 1144
ldc 315
add
div
生成几个Token obj;
其中第一行ldc的生成为:
tk.op = LDC;
tk.addr = cbyte; //environment current byte;
tk.line = 1;
tk.arg = 3344;
然后把这个token压入vector;
而add指令的Token则为
tk.op = ADD;
tk.addr = cbyte; //environment current byte;
tk.line = 4;
tk.arg = 0; //indicate no arg;
然后把这个token压入vector;
生成的Token vector通过iteration on Process call就能得到相应的bytecode, 然后可以通过虚拟机进行执行;
easm Iceman.elf => Iceman.exf
用elf Iceman.exf即可进行模拟执行
先写到这里
慢慢蠕动才能成长