Непосредственная часть инструкции 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
.