2013-01-13 68 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() { 
}