0

ねえ、誰かがCのファーストクラスのラベルを手伝ってくれるかどうか疑問に思っています.

私は現在、メモリ (AVR デバイスの FLASH メモリ) から Java バイトコードを読み取ろうとしています。各命令をラベルとして扱い、goto ステートメントを使用して適切なラベルにジャンプして命令をディスパッチしたいと考えています。

しかし問題は、メモリから命令を読み取るために使用する関数が符号なしバイトを返すことです。

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.

ありがとう

4

1 に答える 1

2

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() {
}
于 2013-01-13T13:17:12.123 に答える