我需要从存储值中读取两个整数。 因此,我将它们以十六进制形式存储在一个32位寄存器中。
例如:0x50002是int x = 5; int y = 2;
我有一个任务以mips编写一个函数,该函数的参数之一是“ int xy”,其中,int x存储在xy参数的高16位,y存储在xy参数的低16位。这个参数通过$ a1传递,然后我想使用这个x或y进行进一步的计算
我将这些地址加载到$ a0中,并且希望在$ a1中有一个值“ a”
li $ a1,0x50002
lhu $ a0,($ a1)
答案 0 :(得分:0)
如果int xy
是一个函数arg,则它的 value 在$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
,因此也不匹配。
答案 1 :(得分:0)
要在li $a1, 0x50002
之后将x放入$ a0,请执行以下操作:
sra $a0, $a1, 16 # $a0 = right shifted top 16 bits of $a1 i.e. x
要清除$ a0的高16位,保留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