2015-10-28 28 views
1

我建立了一個虛擬機中C.而對於這一點,我有指令如何從C中的32位序列的立即部分獲取值?

​​

我保存的命令,並在32位的值。前8位用於命令,其餘爲值。

8位 - >操作碼 24位 - >立即值

對於這種使一個宏

#define PUSHC 1 //1 is for the command value in the Opcode 
#define IMMEDIATE(x) ((x) & 0x00FFFFFF) 

UPDATE:

**#define SIGN_EXTEND(i) ((i) & 0x00800000 ? (i) | 0xFF000000 : (i))** 

然後我加載在一個unsigned int arr中進行測試AY:

更新:

unsigned int code[] = { (PUSHC << 24 | IMMEDIATE(2)), 
         (PUSHC << 24 | SIGN_EXTEND(-2)), 
         ...}; 

在我的代碼後,我想要得到的pushc命令的即時價值,這價值推到堆棧...

我得到的每一個指令(IR),並構建我的堆棧。

UPDATE:

void exec(unsigned int IR){ 

     unsigned int opcode = (IR >> 24) & 0xff; 
     unsigned int imm = (IR & 0xffffff); 

    switch(opcode){ 
     case PUSHC: { 
     stack[sp] = imm; 
     sp = sp + 1; 
     break; 
} 
} 

    ... 

    } 
    } 

回答

3

只需使用一個逐位AND掩蓋了低24位,然後在case使用它:

const uint8_t opcode = (IR >> 24) & 0xff; 
const uint32_t imm = (IR & 0xffffff); 
switch(opcode) 
{ 
    case PUSHC: 
    stack[sp] = imm; 
    break; 
} 

我移位操作碼的提取周圍使case更易於閱讀。

+0

這是什麼值?我不明白 – Tarasov

+0

@塔拉索夫對不起,被你的代碼愚弄了。 :)現在從'IR'中提取兩個部分。 – unwind

+0

感謝它的工作......你告訴我一個更好的方法......我想讓2^24計算它們......但你的方式更好:D但你知道什麼是負值如何-2或-3? :/ – Tarasov

相關問題