В случае lb
и lbu
, в чем разница?
Инструкции «загрузки байтов» lb
и lbu
загружают один байт в самый правый байт 32-битного регистра. Как вы устанавливаете верхние 24 бита? Операция unsigned установит их в ноль; подписанная операция будет подписывать-расширять загруженный байт.
Например, предположим, что вы прочитали байт 0xFF
из памяти. lbu
будет 0 расширять это значение до 0x000000FF
и интерпретировать его как 255, в то время как lb
будет расширять его до 0xFFFFFFFF
, что интерпретируется как -1.
Почему lw
не имеет неподписанной версии? Даже в магазине нет инструкции ...
С другой стороны, инструкция «загрузить слово» (lw
) загружает 32-разрядную величину в 32-разрядный регистр, поэтому нет никакой двусмысленности и нет необходимости иметь специальную подписанную версию.
Если вы храните меньше 32-битного слова, вы ничего не можете сделать с дополнительными битами в регистре, кроме как выбросить их (игнорировать).
Следует ли также арифметическому определению MIPS, что «unsigned» означает, что оно не сообщит о переполнении?
Я думаю, что это соглашение только для инструкций сложения и вычитания. Для других инструкций подписанный / неподписанный указывает, будет ли выполняться расширение знака.
Подписываете ли вы расширение смещения перед добавлением его к значению адреса? Или добавить перед расширением?
Если смещение расширено знаком, имеет смысл сделать это только перед добавлением его к базовому адресу. Я думаю, что обзор дополнения к двум арифметике прояснит это.