Загрузить Halfword в регистр - PullRequest
0 голосов
/ 12 мая 2019

Мне нужно прочитать из сохраненного значения два целых числа.Поэтому я сохранил их в одном 32-битном регистре в виде шестнадцатеричного значения.

Например: 0x50002 - это int x = 5;int y = 2;

У меня есть задача написать функцию в mips, и один из аргументов этой функции - "int xy", где int x хранится в старших 16 битах, а y - в младших 16 битахXY аргумент.И этот аргумент передается через $ a1, и затем я хочу использовать эти x или y для дальнейших вычислений

Я загрузил эти адреса в $ a0, и я хочу иметь значение «a» в $ a1

li $ a1, 0x50002

lhu $ a0, ($ a1)

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Чтобы получить x в $ a0 после li $a1, 0x50002, выполните:

sra $a0, $a1, 16       # $a0 = right shifted top 16 bits of $a1 i.e. x

Чтобы очистить 16 верхних битов $ a0, оставив значение y, выполните:

andi $a0, $a0, 0xffff  # $ now $a0 only contains y

Наконец, чтобы подписать расширение значения y до 32 бит, выполните:

sll $a0, $a0, 16       # move y's sign bit to $a0's sign bit
sra $a0, $a0, 16       # arithmetic shift y to its original position
0 голосов
/ 12 мая 2019

Если int xy является функцией arg, то ее значение находится в $a0, и вы должны распаковать его.

Простой способ - с xy >> 16 и xy & 0xffff.

Сохранение в стек, а затем перезагрузка с двумя lhu инструкциями - еще один менее эффективный способ. Я не знаю, почему у вас есть статическое хранилище (метка типа xy: в .data), в этом нет необходимости.

0x50002 - это int a = 1; int b = 2;

Это значение для распаковки, не адрес . 0x50002 не кратен 4, поэтому он не может быть начальным адресом 32-разрядного int.

Кроме того, вы говорили об упаковке двух 16-битных целых чисел в слово; это было бы unsigned short a, b;.

(Если вы подписали short данные в памяти, вы бы использовали lh вместо lhu.)

Но старшие 16 бит 5, а не 1, поэтому они тоже не совпадают.

...