为何无法将栈中值移至另一栈值?x86_64汇编技术问询
解决x86_64汇编中
movl -4(%rsp), -16(%rsp)的报错问题 哦,这个坑我刚入门x86汇编的时候也踩过!GAS报错的核心原因其实很简单:x86指令集不支持直接的内存到内存(mem-to-mem)数据传输,哪怕两个操作数都是栈上的内存地址也不行。
你可能会觉得“把一个栈位置的值挪到另一个栈位置”逻辑上很直接,但CPU的指令设计里,mov这类通用数据传输指令要求至少有一个操作数是寄存器(或者立即数),没办法直接在两块内存之间搬数据。
正确的做法是用一个通用寄存器当“中转站”,先把源内存的值读到寄存器里,再把寄存器的值写入目标内存。比如改成这样:
; 先把栈上-4偏移的值读到eax寄存器 movl -4(%rsp), %eax ; 再把eax的值写到栈上-16偏移的位置 movl %eax, -16(%rsp)
如果是更大的数据(比如64位),你可以用rax或者其他通用寄存器,原理是一样的。另外,如果你要批量移动内存数据,也可以用串操作指令比如movsb/movsl,但对于单个双字的移动,用寄存器中转是最直接高效的方式。
内容的提问来源于stack exchange,提问作者flooblebit
相关产品推荐
相关产品推荐

