Mips装配有帮助吗?特别是Hi / Lo

时间:2016-10-10 19:07:49

标签: assembly mips

我试图解决这个MIPS汇编代码。但是,我仍然不确定%hi(A)/%lo(A)的添加/加载操作是做什么的。 我评论了我的理解......

                # 28($fp) is zero
lw  $2,28($fp)  # $2 = 0
sll $3,$2,1     # $3 = 0*2^1 = 0 (multipying with 2^1)
lui $2,%hi(A)   # ??
lw  $4,28($fp)  # $4 = 0
sll $4,$4,2     # $4 - 0*2^1 (not sure of the purpose yet)
addiu   $2,$2,%lo(A) #?? 
addu    $2,$4,$2     # $2 += $4
sw  $3,0($2)         # save $3 in memory location 0
lw  $2,28($fp)       # $2 = 0
addiu   $2,$2,1      # $2 = 1
sw  $2,28($fp)       # MEM 28($fp) = 3

如果有人可以查看评论并帮助我解决这个问题,我将不胜感激。我环顾四周,但还没有找到我理解的答案。我对Hi / Lo的所作所为感到特别困惑。

1 个答案:

答案 0 :(得分:4)

%hi为您提供前16位,%lo低16位 1 。这是必需的,因为您无法一次性加载32位立即数,因此您必须分两部分进行。此加载已与其他代码混合在一起,属于一起的部分是:

lui $2,%hi(A)   # ??
addiu   $2,$2,%lo(A) #?? 

这两个只是将A的地址加载到$2lui加载前16位,然后加上低16位。在源代码中,您通常使用la伪指令,例如la $2, A

sll $4,$4,2     # $4 - 0*2^1 (not sure of the purpose yet)

这是基于索引计算数组中的偏移量。据推测它是一个32位整数的数组,因此偏移2,实际上是2^2=4而不是2^1的乘法,正如你的评论所说。

1 由于符号扩展,从技术上讲并非总是如此,但这些值会正确累加到所需的地址。