Если 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
, поэтому они тоже не совпадают.