ZBLOG

__asm__ ( " .text \n" " .p2align 4,,15 \n" ".globl _switch \n" ".globl __switch

这段代码是一段汇编代码,其作用是实现一个函数 _switch(或者 __switch),该函数可以在不同的线程之间切换。下面逐行解释具体细节:

  1. .text: 定义了一个新的文本段;

  2. .p2align 4,,15: 告诉编译器以4字节对齐,并且在可能的情况下使用 nop 指令来填充空隙,以提高缓存效率;

  3. .globl _switch.globl __switch: 表示将 _switch__switch 函数导出为全局符号,以供其他模块使用;

  4. _switch:__switch:: 分别定义了两个函数标签,表示函数开始的位置;

  5. movq %rsp, 0(%rsi): 将当前栈指针保存到 %rsi + 0 的内存地址中;

  6. movq %rbp, 8(%rsi): 将当前帧指针保存到 %rsi + 8 的内存地址中;

  7. movq (%rsp), %rax: 将栈顶元素(即当前指令指针)保存到 %rax 寄存器中;

  8. movq %rax, 16(%rsi): 将 %rax 中保存的当前指令指针保存到 %rsi + 16 的内存地址中;

  9. movq %rbx, 24(%rsi): 将 %rbx 中保存的状态保存到 %rsi + 24 的内存地址中;

  10. movq %r12, 32(%rsi): 将 %r12 中保存的状态保存到 %rsi + 32 的内存地址中;

  11. movq %r13, 40(%rsi): 将 %r13 中保存的状态保存到 %rsi + 40 的内存地址中;

  12. movq %r14, 48(%rsi): 将 %r14 中保存的状态保存到 %rsi + 48 的内存地址中;

  13. movq %r15, 56(%rsi): 将 %r15 中保存的状态保存到 %rsi + 56 的内存地址中;

  14. movq 56(%rdi), %r15: 将另一个线程在内存空间中保存的状态恢复回来,即将 %rdi + 56 处的值赋给 %r15;

  15. movq 48(%rdi), %r14: 同上,将 %rdi + 48 处的值赋给 %r14;

  16. movq 40(%rdi), %r13: 同上,将 %rdi +40 处的值赋给 %r13;

  17. movq 32(%rdi), %r12: 同上,将 %rdi +32 处的值赋给 %r12;

  18. movq 24(%rdi), %rbx: 同上,将 %rdi +24 处的值赋给 %rbx;

  19. movq 8(%rdi), %rbp: 将另一个线程在内存空间中保存的帧指针恢复回来,即将 %rdi + 8 处的值赋给 %rbp;

  20. movq 0(%rdi), %rsp: 将另一个线程在内存空间中保存的栈指针恢复回来,即将 %rdi + 0 处的值赋给 %rsp;

  21. movq 16(%rdi), %rax: 将另一个线程在内存空间中保存的当前指令指针恢复回来,即将 %rdi + 16 处的值赋给 %rax;

  22. movq %rax, (%rsp): 将 %rax 中保存的当前指令指针放到栈顶;

  23. ret: 返回函数。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=987

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?