Я построил виртуальную машину в 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;
}
}
...
}
}
Какая ценность? я не понимаю – Tarasov
@Tarasov Извините, вас обманул ваш код. :) Теперь извлекает обе части из 'IR'. – unwind
спасибо, что это работает ... вы показываете мне лучший способ ... Я хочу сделать 2^24 и рассчитать их ... но ваш путь лучше: D, но вы знаете, что с отрицательными значениями, как -2 или -3? :/ – Tarasov