程序最美(寻路)

你还在坚持练习你的技术吗?运动员天天训练,音乐家也会演练更难的曲章。你呢?

反汇编器源码剖析

反汇编器源码剖析

         之前我们有对一汇编器进行源码剖析,详见《汇编器源码剖析》,并且《实现一个汇编器》。本文,我们继续之前的工作,对反汇编器进行源码剖析,之后我们会根据反汇编器的实现原理,实现一个自己版本的反汇编器。本文剖析的反汇编器代码详见:source code

         源码中反汇编器对应的文件为sdasm.c。

         sdasm.c文件中包含汇编指令集的定义op_desc,其类型为字符串数组。

const char *op_desc[] = {

    "HALT", "IN", "OUT", "ADD", "SUB", "MUL", "DIV",

    "DUP",

    "LD", "ST", "LDC", "JLT", "JLE", "JGT", "JGE", "JEQ", "JNE", "JMP", 0

};

         最为主要的是dasm_output函数,其功能即是针对输入参数const Instruction* insts二进制指令,将其转换为对应的汇编指令。并将结果输出到const char* file文件中。其具体转换过程是一次扫描insts,将insts[].op二进制指令对应的汇编指令输出到文件中,进而检测insts[].op对应的操作数个数,如果操作数个数大于0,则将指令对应的操作数也输出到文件中。一条指令占一行。

void dasm_output( const char *file, const Instruction *insts, int size )

{

    FILE *fp;

    char f[256];

    int i;

    strcpy( f, file );

    strcat( f, ".dasm" );

    fp = fopen( f, "w" );

    for( i = 0; i < size && insts[i].op != opHalt; ++ i )

    {

       fprintf( fp, "%3d\t%s", i, op_desc[insts[i].op] );

       if( get_operand_count( insts[i].op ) > 0 )

       {

           fprintf( fp, "\t%d", insts[i].arg );

       }

       fputc( '\n', fp );

    }

    fclose( fp );

}

         Instruction的定义还是沿用sm.h中的定义:

typedef struct Instruction

{

    int op;

    int arg;

} Instruction;

         另外,程序extern了一个外部函数:

extern int get_operand_count( int op );

其用于根据二进制指令获取该指令对应的操作数个数。

 

         以上是整个反汇编器的框架,通过对反汇编器的剖析,我们可以知道反汇编器的精髓在于二进制指令集到汇编指令集的映射。

         接下来我们将根据反汇编器的实现原理,做一个自己版本的反汇编器。并总结汇编器和反汇编器之间的关系和联系。

 

         2013.10.5 23:07 国庆假期 于家中

posted on 2013-10-08 20:50  unixfy  阅读(1633)  评论(0编辑  收藏  举报

导航