我正在玩一些“只是为了好玩”的代码,实现自定义线程。
当然,它也必须实现上下文切换,这一点来自上下文切换功能:
movq %rsp, (%rdi)
movq (%rsi), %rsp
我对x86和程序集不太熟悉,很难弄清楚到底发生了什么。
在我看来,movq (%rsi), %rsp
取消了存储在%rsi
中的(虚拟)内存地址,并将8个字节(自q
以来)复制到%rsp
。
然而,我不知道movq %rsp, (%rdi)
行是做什么的?(%rdi)
似乎是一个目标寄存器,也就是将获得新值的寄存器。但是它和它周围的括号不匹配.据我所知,(...)
的意思是取消引用。
请解释一下。
发布于 2022-09-26 19:02:18
正确的,(%register)
意味着取消引用寄存器中的值,并将其用作内存位置。
所以(在AT&T语法中):
movq %rsp, (%rdi)
的意思是“将rsp
中的值复制到存储在rdi
中的内存地址的位置”。
和
movq (%rsi), %rsp
的意思是“将内存地址存储在rsi
中的位置的值复制到rsp
”。
其目的似乎是保存当前堆栈指针(rdi
指向的保存位置),并在线程切换期间加载新的堆栈指针(由rsi
指向的加载位置)。
https://stackoverflow.com/questions/73858497
复制相似问题