Я пытаюсь подписать дополнительный номер до двух, который я получаю из аргументов программы в мипсах. Как бы я это сделал?
Как подписать расширение до двух, заданное в аргументах программы, в mips (сборка)
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
Как я могу напечатать это на консоли?
- person wolverinexci; 22.08.2018
@wolverinexci Это зависит от вашей среды выполнения. И MARS, и SPIM имеют системные вызовы для печати чисел. Если у вас возникли проблемы с этим, поищите на этом сайте возможные вопросы, и если ни один из них вас не удовлетворит, попробуйте задать новый. Поскольку это не форум, мы не занимаемся пинг-понгом вопросов и ответов, каждый вопрос должен быть автономным, как и ответ на него.
- person Margaret Bloom; 22.08.2018
После этого я сделал системный вызов. Я сделал li $v0, 4 la $a0, ($a0 (я думаю, это расположение адреса)) системный вызов, но у меня действительно была ошибка вне диапазона.
- person wolverinexci; 22.08.2018
MIPS32r2 добавил инструкцию
seb dst,src
(sign-extend-byte). См. godbolt.org/z/D7H2Q3. gcc использует его с -march=mips32r2
, но в остальном использует сдвиги влево/вправо, как вы показываете.
- person Peter Cordes; 22.08.2018
@PeterCordes Большое спасибо! Это очень приятное дополнение!
- person Margaret Bloom; 22.08.2018
Описание 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
@PeterCordes Да, я читал историю MIPS, когда обнаружил эту двусмысленность и вернулся, чтобы исправить ее. Спасибо за ваш комментарий в любом случае :)
- person Margaret Bloom; 22.08.2018