Я немного смущен тем, как инструкция ветвления переводится в машинный код. Я прочитал в своей книге, что ветвь, если инструкция равна, является инструкцией типа B, которая отформатирована следующим образом:
код операции reg1 reg2 адрес + смещение 6 5 5 16
В моем учебнике есть проблема, когда мне показывают программу, которая, как мне сказали, загружается по адресу 0x4321ABC8 и выглядит так:
L1: sw $t0,3000($t1)
addi $s1,$t1,-6
beq $t0,$t1,L1
Как видите, третья строка кода является ветвью, если она равна.
Я пытаюсь преобразовать эту программу в двоичный (или шестнадцатеричный). В инструкции ветвления if equal я не совсем понимаю, что именно я должен ввести в поле адреса + смещения.
Сначала я думал, что ответ будет...
базовый адрес (0x4321ABC8), плюс 4-кратное количество инструкций из базы, где должен быть счетчик команд (4 * 2 = 8),
Затем минус четыре для смещения, которое будет исходным базовым адресом, 0x4321ABC8 .
Проблема в том, что 0x4321ABC8 — слишком большое число, чтобы поместиться в 16-битное смещение инструкции.
Итак, я подумал, что ответ будет ТОЛЬКО включать смещение (которое будет -8), однако, если бы это было так, я не знаю, почему проблема в книге удосужилась сообщить мне, что программа загружена по адресу 0x4321ABC8.
Любая помощь будет принята с благодарностью!