Вы можете посмотреть Wikipedia или краткое резюме для студентов. Все говорят, что есть две инструкции для одного и того же. Но никто не говорит, почему?
В чем разница между безусловной ветвью и безусловным прыжком (инструкции в MIPS)?
Ответ 1
Ветви позволяют условия. Но с учетом условий в команде требуется больше бит. Таким образом, адрес ветки составляет всего 2 ^ 16 бит и позволяет только отложить инструкции 2 ^ 15 - 1 назад или 2 ^ 15 инструкций вперед.
Скачок безусловный, и биты, сохраненные путем исключения условия, могут использоваться для адреса. Скачок допускает 26-битный адрес и поэтому может намного больше переходить в код, чем в ветвь. За счет не условного.
Ответ 2
Ветви (b
) используют относительное перемещение ПК, тогда как переходы (j
) используют абсолютные адреса. Различие важно для независимого от позиции кода. Кроме того, для передачи косвенного контроля могут использоваться только скачки (jr
, используя значение регистра).
Ответ 3
Как уже упоминалось, ветвь имеет меньше бит, более короткий диапазон и относительна. Jump имеет больше бит и является абсолютным.
Возьмем этот пример
b l0
nop
beq $0,$1,l1
nop
j l2
nop
l0: .word 0,0
l1: .word 0,0
l2: .word 0,0
и вы получите это
00000000 <l0-0x1c>:
0: 10000006 b 1c <l0>
4: 00000000 nop
8: 10010006 beq zero,at,24 <l1>
c: 00000000 nop
10: 0800000b j 2c <l2>
14: 00000000 nop
18: 00000000 nop
0000001c <l0>:
...
00000024 <l1>:
...
0000002c <l2>:
...
теперь то, что другие ответы, возможно, не упомянули, состоит в том, что безусловная ветвь кодируется, по крайней мере, ассемблером gnu, как ветвь, если она равна, с тем же регистром. В mips нет безусловной ветки, есть ветвь, если она равна и ветвь, если не равна тому, что я могу сказать.
Вы видите выше прыжок использует 0xB, который является адресом слова, 0xB * 4 = 0x2C адресом адресата, где условные выражения используют относительную адресацию pc + (signed_offset * 4), где pc = instruction_address + 4; Для получения адреса назначения возьмите инструкцию_имя + 4 + (signed_offset * 4).
Используя псевдоним b для ветвления вместо j для перехода, создайте независимый от позиции код. Jump не будет, придется переустанавливать, если вы перемещаетесь, для близких прыжков, вероятно, лучше использовать ветку вместо прыжка, хотя это псевдоним. Если вы пурист, вы можете использовать реальную инструкцию beq $0, $0, метку или выбрать любой регистр beq $4, $4, label. регистр 0 является особым и быстрым может быть лучшим выбором.