Assembly 为什么STMDB/LDMIA etc增加/减少四而不是八?
因此,我在上这门课时发现了以下代码:Assembly 为什么STMDB/LDMIA etc增加/减少四而不是八?,assembly,arm,Assembly,Arm,因此,我在上这门课时发现了以下代码: STMIA SP, { R0 } 是否有下列情况: SP = SP + 4 [SP] = R0 我可能错了,我不确定。然而,我在互联网上搜索的大多数资源都显示了这个结果。所以我要问的是,为什么它不是SP=SP+8?寄存器应该有8位,对吗?或者它意味着什么 谢谢 否,ARM寄存器实际上包含32位(a),即4个字节 这是用来修改堆栈指针的四个字节 堆栈很少是位可寻址的,所以只有当寄存器的大小为64位时,才需要修改8位 (a) 新的64位AArch6
STMIA SP, { R0 }
是否有下列情况:
SP = SP + 4
[SP] = R0
我可能错了,我不确定。然而,我在互联网上搜索的大多数资源都显示了这个结果。所以我要问的是,为什么它不是SP=SP+8
?寄存器应该有8位,对吗?或者它意味着什么
谢谢 否,ARM寄存器实际上包含32位(a),即4个字节 这是用来修改堆栈指针的四个字节 堆栈很少是位可寻址的,所以只有当寄存器的大小为64位时,才需要修改8位
(a) 新的64位AArch64可能不是这种情况,我相信它可能有更宽的寄存器,但是,如果这些是您所说的,代码几乎肯定会调整8而不是4。不,ARM寄存器实际上包含32位(a),即4个字节 这是用来修改堆栈指针的四个字节 堆栈很少是位可寻址的,所以只有当寄存器的大小为64位时,才需要修改8位
(a) 新的64位AArch64可能不是这种情况,我相信它可能有更宽的寄存器,但是,如果这些是您所说的,代码几乎肯定会调整8而不是4。是的,AArch64有64位寄存器x0..x31。他们的下半身是w0..w31。但是AArch64删除了微代码的ldmia/
stmdb
,而只提供了更加精简的ldp/stp
加载/存储对指令。(仍然可以选择写回指针寄存器的寻址模式,使其可用作push或pop。)我认为,与x86-64不同,AArch64因此可以“push”/“pop”32位w
寄存器以及完整的64位寄存器(如果出于某种原因)。是的,AArch64具有64位寄存器x0..x31。他们的下半身是w0..w31。但是AArch64删除了微代码的ldmia/stmdb
,而只提供了更加精简的ldp/stp
加载/存储对指令。(仍然可以选择写回指针寄存器的寻址模式,使其可用作push或pop。)我认为与x86-64不同,AArch64因此可以“push”/“pop”32位w
寄存器以及完整的64位寄存器(如果出于某种原因)。如果希望堆栈对齐8字节,传统的方法是使用stmia SP,{r0,pc}
。pc
用于填充堆栈,在检查堆栈时,知道谁编写了值稍微有用一些。就是。是的,这就是为什么我认为您会问这个问题?如果您希望堆栈是8字节对齐的,传统的方法是使用stmia SP,{r0,pc}
。pc
用于填充堆栈,在检查堆栈时,知道谁编写了值稍微有用一些。就是。这就是为什么我认为你会问这个问题?