2013-01-13 30 views
0

嘿,我想知道如果任何人都可以帮助我在C中的头等标签。我想将每个指令作为标签来看待(每个指令作为一个标签)我想要从内存(AVR设备的FLASH存储器)读取java字节码,并通过使用goto语句并跳转到适当的标签来分派指令。C中的第一类标签?

但问题是我用来从内存中读取指令的函数返回一个无符号字节。

u08_t nvmfile_read08(void *addr) { 
    u08_t val; 
    addr = NVMFILE_ADDR(addr); // remove marker (if present) 
    memcpy_P((u08_t*)&val, (PGM_P)addr, sizeof(val)); 
    return val; 
} 

instr = nvmfile_read08(pc); 

所以我的问题是INSTR如何转换成类似:

void *ptr; 
ptr = &&instr; 
goto *ptr; 

然后这个代码将非常跳转到该标签:(假设ILOAD是最后一个指令读取)

iload: 
    // Execute the iload jvm instruction. 

谢谢

+1

假设您愿意使用GCC扩展,您可以将标签int置于256值的数组中并执行计算出的goto。请参阅http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html –

回答

2

有两种方法:一个switch状态或者一个函数指针数组。

switch的情况下可以通过调查员被命名,是这样的:

enum jvm_opcodes { 
    push = 0, 
    pop = 1, 
    /* etc */ 
    blah = 254 
}; 

然后,开关看起来像这样:

switch (instr) { 
    case push: { 
    } break; 

    case pop: { 
    } break; 
} 

函数指针阵列将直接分派到其他功能无需写出switch。如果源代码分布在更多文件中,这可能会更方便。

/* dispatch.c */ 

typedef void (*jvm_dispatch)(); /* function pointer type */ 
jvm_dispatch insn_dispatch_table[] = { /* define array */ 
    handle_push, /* opcode 0 */ 
    handle_pop, /* opcode 1 */ 
    /* etc */ 
}; 

insn_dispatch_table[ insn ](); /* call an entry from the array */ 

/* push.c */ 
void handle_push() { 
} 

/* pop.c */ 
void handle_pop() { 
}