Как исправить: OP-код не читается правильно - PullRequest
0 голосов
/ 27 мая 2019

В настоящее время я пытаюсь написать виртуальную машину ниндзя, задание, которое было дано мне в качестве упражнения.Код операции и значение сохраняются в 32-битном целом без знака, причем первый 8-бит является кодом операции, а остальные - значением.Чтобы справиться с отрицательным значением, я использую макрос, данный мне в упражнении

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

Однако при попытке получить код операции

unsigned int i = (PUSHC << 24) | SIGN_EXTEND(-2); (где PUSHC равно 1)

с использованием побитового AND, как показано здесь ->

int opcode = (i>>24)&0xff

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

При исследовании этого я обнаружил, что " Как я получаю значение из Непосредственной части32-битной последовательности в C?", которая, по-видимому, имеет дело с тем, что я спрашиваю, однако ответ на этот вопрос - именно то, что я делаю, кто-нибудь знает больше?

1 Ответ

1 голос
/ 27 мая 2019

SIGN_EXTEND похоже, что он предназначен для использования при декодировании, чтобы взять 24 бита, которые были извлечены из инструкции, и преобразовать их в 32-разрядное целое число со знаком.Похоже, он не предназначен для кодирования.Для кодирования IMMEDIATE(x) представляется предназначенным для этого.Учитывая 32-разрядное целое число со знаком, оно выдает 24-разрядное целое число со знаком, обеспечивая соответствие значений.

Итак:

unsigned int i = (PUSHC << 24) | SIGN_EXTEND(-2);

должно быть:

unsigned int i = (PUSHC << 24) | IMMEDIATE(-2);
...