Почему написание самоизменяющегося кода плохо?Mips ассемблер.Как это сделать? - PullRequest
0 голосов
/ 14 октября 2018

Эта проблема перефразирована из более ранней редакции P & H.

Рассмотрим следующий код, использованный для реализации инструкции:

      foo $s0, $s1, $s2


mask:   .word 0xfffff83f
start:  lw    $t0,mask($zero)
        lw    $s0,shifter($zero)
        and   $s0,$s0,$t0
        andi  $s2,$s2,0x1f
        sll   $s2,$s2,6
        or    $s0,$s0,$s2
        sw    $s0, shifter($zero)
shifter:sll   $s0,$s1,0

Добавьте содержательные комментарии к коду и напишите параграф, описывающийкак это устроено.Почему вы полагаете, что написание «самоизменяющегося кода», подобного этому, является плохой идеей (и часто это фактически не допускается)?

Пояснительные примечания:

  1. Ярлыкиэквивалентны непосредственным адресам, соответствующим адресу, который ОС выберет для них.Например, если ОС решает запустить программу с 100010, маска является непосредственной 100010.

  2. Вы можете предположить, что программа загружается по адресу, старшие 16 бит которого равны 0.Это предположение необходимо, поскольку непосредственные значения MIPS являются 16-битными, а ссылки на шифтер / маску интерпретируются как младшие 16-битовые биты / маска.Вы также можете предположить, что как shift, так и mask имеют msb (бит 15), равный 0 - это предположение необходимо, поскольку смещения расширяются по знаку.

  3. Мы еще не рассмотрели директиву .word.Это директива на ассемблере, которая по сути является инструкцией для ассемблера (НЕ инструкция на языке ассемблера).В этом случае он говорит ассемблеру зарезервировать слово памяти, инициализированное в 0xfffff83f.Mask - это адрес этого слова (так же, как start - это адрес слова в памяти, содержащего машинный код для этой инструкции lw).

...