2015-10-28 17 views
1

Я построил виртуальную машину в C. И для этого у меня есть инструкцияКак получить значение из непосредственной части 32-битной последовательности в C?

pushc <const> 

Я спас команду и значение в 32 бит. Первый 8 бит - для команды, а остальное - для значения.

8 Bit -> Опкод 24 Bit -> Немедленное значение

Для этого я сделать макрос

#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 ау:

Update:

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

позже в моем коде я хочу, чтобы получить немедленное значение pushc команды и нажать это значение в стек ...

я получаю каждую Инструкцию (IR) из массива и построил мой стек.

ОБНОВЛЕНИЕ:

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

@Tarasov Извините, вас обманул ваш код. :) Теперь извлекает обе части из 'IR'. – unwind

+0

спасибо, что это работает ... вы показываете мне лучший способ ... Я хочу сделать 2^24 и рассчитать их ... но ваш путь лучше: D, но вы знаете, что с отрицательными значениями, как -2 или -3? :/ – Tarasov