MIPS прыжок и вычисление адреса BNE - PullRequest
0 голосов
/ 21 ноября 2018

Предположим, что программный счетчик (ПК) установлен на 0x20000000. Можно ли использовать инструкцию сборки jump (j) MIPS, чтобы установить для ПК адрес 0x40000000?Можно ли использовать инструкцию сборки MIPS с ответвлением на равных (beq), чтобы установить для ПК этот же адрес?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Документация гласит следующее в программных примечаниях инструкции BEQ:

Описание : если rs = rt, тогда ветвь18-битное смещение со знаком (16-битное поле смещения, сдвинутое влево на 2 бита) добавляется к адресу инструкции, следующей за ветвью (а не самой ветвью), в слоте задержки ветвления, чтобы сформировать эффективную цель относительно ПК.адрес.

Замечания по программированию: При 18-битном смещении команды со знаком диапазон условных переходов составляет ± 128 Кбайт.Используйте команды перехода (J) или регистра перехода (JR) для перехода к адресам за пределами этого диапазона.

Таким образом, вы не можете использовать инструкцию BEQ для перехода к 0x40000000 (начиная с 0x20000000это должно было бы перепрыгнуть через 0x20000000 = 536870912 b = 536871 kb).Таким образом, вы должны использовать инструкции регистра перехода, чтобы перейти к 0x40000000.

0 голосов
/ 21 ноября 2018

Я полагаю, что вы можете использовать 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-битные адреса, поскольку он использует регистр для адреса назначения и не являетсясвязаны вышеуказанными ограничениями инструкций.

...