Псевдо-иструкции MIPS, замены


После проведения исследования, что это такое, я обнаружил, что это просто замена способа получения того же результата. Поправьте меня, пожалуйста, если я ошибаюсь.

Пример:

move $s0, $t1

Можно заменить на:

add $s0, $zero, $t1 

Вопросы:

Как можно заменить lw, la, sw, bne?

1 2

1 ответ:

Да, инструкция move может и заменяется инструкцией add.

Некоторые сведения о псевдо-инструкциях: MIPS-это архитектура RISC (Reduced Instruction Set Computer), то есть имеется относительно небольшое количество инструкций, которые вы можете использовать. Эта простота приводит к более быстрой производительности, но компромисс заключается в том, что более сложные операции требуют нескольких инструкций. Псевдо-инструкции - это "поддельные" инструкции, представляющие одну или несколько других более сложная операция.

На ваш вопрос:

lw, sw, и bne не являются псевдо-инструкциями. Все они выполняются по одной инструкции сборки MIPS.

la, или адрес загрузки, это псевдо-инструкция. la можно разбить на lui инструкцию и ori инструкцию. В 32-разрядной архитектуре MIPS каждая инструкция, а также размер каждого регистра составляют 32 бита. Таким образом, чтобы сохранить 32-битный адрес, вы должны сначала захватить наиболее значительный (высокий порядок) сначала 16 бит, а затем возьмите наименее значимые (младшего порядка) 16 бит после этого.

lui, или Load Upper Immediate, берет поле immediate, сдвигает его влево 16 раз и сохраняет во временном регистре ассемблера. Инструкция ori делает побитовое или на временном регистре и немедленное значение и сохраняет полный адрес в начальном регистре, указанном в инструкции la.

Edit: для получения адреса строки, например, вы можете использовать этот сегмент кода в своей функции:

    la  $a0, msg    # pseudo-instruction to load the address of the label str

Вы бы также msg определили в другом месте:

.data               
msg: .asciiz "This is a string"

После выполнения этого примера в SPIM инструкция la преобразуется в:

    lui $1, 4097 [msg]
    ori $4, $1, 0 [msg]

$1 является временным регистром ассемблера и $4 является регистром a0, который был аргументом, переданным в начальную инструкцию la.

Ссылки: MIPS набор инструкций и от просто делать много MIPS. Попробуйте выполнить каждую инструкцию в симуляторе типа QTSPIM и посмотрим, что получится.

Смотрите также: lui 4097 и адрес загрузки