Подтвердить что ты не робот

В чем разница между безусловной ветвью и безусловным прыжком (инструкции в MIPS)?

Вы можете посмотреть Wikipedia или краткое резюме для студентов. Все говорят, что есть две инструкции для одного и того же. Но никто не говорит, почему?

4b9b3361

Ответ 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 является особым и быстрым может быть лучшим выбором.