Welcome to My blog

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

蠕动是探索未知领域最好的方式

简单的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即可进行模拟执行

先写到这里
慢慢蠕动才能成长

posted on 2004-03-14 23:14  Agent  阅读(972)  评论(0编辑  收藏  举报