我正在尝试解密这段 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 所做的事情特别困惑。
最佳答案
%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 由于符号扩展,从技术上讲,这并不总是正确的,但这些值将正确地添加到所需的地址。
关于assembly - Mips 组装有帮助吗?特别是高/低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39965125/