将半字加载到寄存器中

时间:2019-05-12 12:12:13

标签: assembly mips word

我需要从存储值中读取两个整数。 因此,我将它们以十六进制形式存储在一个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)

2 个答案:

答案 0 :(得分:0)

如果int xy是一个函数arg,则它的 value $a0中,您必须解压缩它。

简单的方法是使用xy >> 16xy & 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