Как подписать расширение до двух, заданное в аргументах программы, в mips (сборка)

Я пытаюсь подписать дополнительный номер до двух, который я получаю из аргументов программы в мипсах. Как бы я это сделал?


person wolverinexci    schedule 22.08.2018    source источник
comment
Каков размер аргумента и размер вывода?   -  person Margaret Bloom    schedule 22.08.2018
comment
Аргумент представляет собой 8-битное двоичное число в дополнительном коде до двух. Расширенный знак составляет 32 бита, так как в конечном итоге я приведу его к шестнадцатеричной форме.   -  person wolverinexci    schedule 22.08.2018


Ответы (1)


Один из способов — воспользоваться инструкцией MIPS sra. Эта инструкция выполняет арифметику. правый сдвиг — сдвигает регистр вправо при сдвиге знакового бита.
Поместив 8-битное значение в крайнее левое положение (читается в старшей позиции) с sll, мы совместим его знаковый бит с битом знака регистра, то мы используем sra:

#Assume $a0 is a) 0x40 b) 0x80
sll $a0, $a0, 24      #a) $a0 = 0x40000000 b) $a0 = 0x80000000
sra $a0, $a0, 24      #a) $a0 = 0x00000040 b) $a0 = 0xffffff80

Для значений в памяти lb загрузит знак байта, расширяющий его (в отличие от lbu).


Начиная с выпуска 2 MIPS32 ISA, инструкция seb rt, rs, которая расширяет знак младший значащий байт регистра GP.

person Margaret Bloom    schedule 22.08.2018
comment
Как я могу напечатать это на консоли? - person wolverinexci; 22.08.2018
comment
@wolverinexci Это зависит от вашей среды выполнения. И MARS, и SPIM имеют системные вызовы для печати чисел. Если у вас возникли проблемы с этим, поищите на этом сайте возможные вопросы, и если ни один из них вас не удовлетворит, попробуйте задать новый. Поскольку это не форум, мы не занимаемся пинг-понгом вопросов и ответов, каждый вопрос должен быть автономным, как и ответ на него. - person Margaret Bloom; 22.08.2018
comment
После этого я сделал системный вызов. Я сделал li $v0, 4 la $a0, ($a0 (я думаю, это расположение адреса)) системный вызов, но у меня действительно была ошибка вне диапазона. - person wolverinexci; 22.08.2018
comment
MIPS32r2 добавил инструкцию seb dst,src (sign-extend-byte). См. godbolt.org/z/D7H2Q3. gcc использует его с -march=mips32r2, но в остальном использует сдвиги влево/вправо, как вы показываете. - person Peter Cordes; 22.08.2018
comment
@PeterCordes Большое спасибо! Это очень приятное дополнение! - person Margaret Bloom; 22.08.2018
comment
Описание MIPS32r2 как версии 2 ISA неоднозначно с MIPS II. Вся эта история с MIPS32/MIPS64 не происходила до 1998 года, когда Silicon Graphics продала MIPS, а ISA сосредоточилась на встраиваемых системах. en.wikipedia.org/wiki/MIPS_architecture#MIPS32/MIPS64. - person Peter Cordes; 22.08.2018
comment
@PeterCordes Да, я читал историю MIPS, когда обнаружил эту двусмысленность и вернулся, чтобы исправить ее. Спасибо за ваш комментарий в любом случае :) - person Margaret Bloom; 22.08.2018