Невозможно преобразовать RISC-V в машинный код - трудности с обработкой немедленного значения - PullRequest
0 голосов
/ 05 октября 2019

Мне нужно преобразовать каждую из следующих инструкций RISC-V в машинный код.

Форматировать ответ как 32-разрядное шестнадцатеричное число, например, 0xABADCAFE или 0xabadcafe (кафе просто отстой). Оставьте все неиспользованные биты равными 0.

При необходимости обратитесь к этому листу .

Q1. jal ra, fib

Предположим, PC = 0x00400014, а fib находится по адресу 0x00400028.

Q2. beq t3, t5, NEXT

Предположим, что PC = 0x0040011C, а NEXT расположен в 0x0040010C.

1 Ответ

1 голос
/ 05 октября 2019

Непосредственная часть инструкции jal относится к счетчику программ (pc). Таким образом, непосредственное закодированное в инструкции: 0x00400028 - 0x00400014 = 0x14 = 0b10100. Глядя на шпаргалку, мы можем видеть, в каком порядке биты кодируются в инструкции: [20|10:1|11|19:12] (бит 0 не кодируется, поскольку все инструкции кодируются четным числом байтов). Подключив все, мы видим, что непосредственный кодируется как 0|0000001010|0|00000000. Добавление в регистр ra (x1) и кода операции (1101111) приводит к двоичному числу 0|0000001010|0|00000000|00001|1101111, равному 0x014000EF в шестнадцатеричном.

Подход такой же для инструкции beq. Разница здесь в том, что инструкция, к которой мы перешли, предшествует команде перехода (immediate = 0x0040010C - 0x0040011C = -0x10). Risc-V интерпретирует немедленное как число со знаком в дополнении до двух . Поскольку непосредственное значение имеет 12 битов, его кодировка будет: -0x10 = 0b1111'1111'0000. Добавление всего этого приводит к: 1|111111|11110|11100|000|1000|1|1100011 = 0xFFEE08E3.

...