我正在玩一些实现自定义线程的“好玩”代码。
当然,它还必须实现上下文切换,该位来自上下文切换函数:
movq %rsp, (%rdi)
movq (%rsi), %rsp
我不是那么熟悉x86和汇编一般和有困难的时间来弄清楚发生了什么。
在我看来,movq (%rsi), %rsp
取消引用了存储在%rsi
中的(虚拟)内存地址,并将8个字节(从q
开始)复制到%rsp
。
但是,我不知道movq %rsp, (%rdi)
行的作用是什么?(%rdi)
似乎是一个目标寄存器,即将接受新值的寄存器..但是,它与周围的括号不匹配...据我所知,(...)
意味着解引用..
请解释一下。
1条答案
按热度按时间jgwigjjp1#
正确,
(%register)
表示取消引用寄存器中的值,并将其用作内存位置。因此(在AT&T语法中):
movq %rsp, (%rdi)
表示“将rsp
中的值复制到其存储器地址存储在rdi
中的位置“。和
movq (%rsi), %rsp
表示“将存储器地址存储在rsi
中的位置的值复制到rsp
“。其目的似乎是在线程切换期间保存当前堆栈指针(保存
rdi
指向的位置)并加载新的堆栈指针(加载rsi
指向的位置)。