assembly - Mips 组装有帮助吗?特别是高/低

标签 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 所做的事情特别困惑。

最佳答案

%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/

相关文章:

assembly - 在 MIPS 汇编中将 int 转换为 float

assembly - 递归过程

gcc - 如何在 gcc 中指定汇编程序风格

windows - x86 程序中的控制台

assembly - 为什么我不能在 MARS 中使用 li.s?

linux - 以 OpenWrt 作为操作系统为 MIPS 交叉编译 Snap7

c - 如何使用 XADD 来增加内存中的值?

GCC ARM 汇编预处理器宏

assembly - 为什么 MIPS 堆栈指针需要保持双字对齐?