Я полагаю, что вы можете использовать jr
для перехода на 32-битный адрес
li $t0, 0x40000000
jr $t0
Аналогично, вы можете использовать ветку и объединить ее с вышеупомянутым для выполнения этого перехода.
Причина, по которой BNE
не подходит для этого, заключается в том, что он работает только с 16-битными смещениями из-за того, как кодируются инструкции.
0001 01ss ssst tttt iiii iiii iiii iiii
представляет инструкцию BNE
, где sssss
и ttttt
сравниваемые регистры и iiii iiii iiii iiii
16-битное смещение (дополняют также два смещения в обратном направлении).Это означает, что смещение 0x20000000
не может быть выражено в 16 битах, предоставляемых этой кодировкой.
Команда перехода ведет себя немного по-другому, так как она использует текущий ПК для вычисления адреса назначения.Это делается путем объединения первых 6 бит текущего ПК (в данном случае это будет 0010 00
) вместе с адресатом, сохраненным в непосредственной части кодирования (который будет 26 битами, заполненными 0
).Таким образом, результирующий адрес может быть только 0x20000000
.
Jump-Register (JR
), с другой стороны, позволяет переходить на полные 32-битные адреса, поскольку он использует регистр для адреса назначения и не являетсясвязаны вышеуказанными ограничениями инструкций.