Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么STMDB/LDMIA etc增加/减少四而不是八?_Assembly_Arm - Fatal编程技术网

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
用于填充堆栈,在检查堆栈时,知道谁编写了值稍微有用一些。就是。这就是为什么我认为你会问这个问题?