assembly x86 'movq %rsp,(%rdi)'和'movq(%rsi),%rsp'有什么作用?它们有什么不同?

ar7v8xwq  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(205)

我正在玩一些实现自定义线程的“好玩”代码。
当然,它还必须实现上下文切换,该位来自上下文切换函数:

movq %rsp, (%rdi)
        
        movq (%rsi), %rsp

我不是那么熟悉x86和汇编一般和有困难的时间来弄清楚发生了什么。
在我看来,movq (%rsi), %rsp取消引用了存储在%rsi中的(虚拟)内存地址,并将8个字节(从q开始)复制到%rsp
但是,我不知道movq %rsp, (%rdi)行的作用是什么?(%rdi)似乎是一个目标寄存器,即将接受新值的寄存器..但是,它与周围的括号不匹配...据我所知,(...)意味着解引用..
请解释一下。

jgwigjjp

jgwigjjp1#

正确,(%register)表示取消引用寄存器中的值,并将其用作内存位置。
因此(在AT&T语法中):
movq %rsp, (%rdi)表示“将rsp中的值复制到其存储器地址存储在rdi中的位置“。

movq (%rsi), %rsp表示“将存储器地址存储在rsi中的位置的值复制到rsp“。
其目的似乎是在线程切换期间保存当前堆栈指针(保存rdi指向的位置)并加载新的堆栈指针(加载rsi指向的位置)。

相关问题