我试图解决这个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的所作所为感到特别困惑。
答案 0 :(得分:4)
%hi
为您提供前16位,%lo
低16位 1 。这是必需的,因为您无法一次性加载32位立即数,因此您必须分两部分进行。此加载已与其他代码混合在一起,属于一起的部分是:
lui $2,%hi(A) # ??
addiu $2,$2,%lo(A) #??
这两个只是将A
的地址加载到$2
。 lui
加载前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 由于符号扩展,从技术上讲并非总是如此,但这些值会正确累加到所需的地址。