- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2014-12-17 15:17 编辑
codechurch 发表于 2014-12-17 12:01 ![]()
本人用C语言在x86上实现了类似于C#的async await异步操作。
(windows使用setthreadcontext\getthreadco ...
这两天正在弄这个,希望看看你的做法。
http://bbs.chinaunix.net/thread-4159120-6-1.html
- /*************************************************
- * char * set_sp(char *last_fiber_stack)
- * last_fiber_stack -> %rdi
- ************************************************/
- .globl set_sp
- .type set_sp, @function
- set_sp:
- .LFB0:
- .cfi_startproc
- //保存返址
- movq 8(%rsp),%rax
- movq %rax,(%rdi)
- //计算rbp与rsp的距离
- movq %rbp,%rax
- subq %rsp,%rax
- //设定sp到fiber栈
- movq %rdi,%rbp
- subq $8,%rbp
- movq %rbp,%rsp
- //新的rbp,距离rsp与原来相同
- addq %rax,%rbp
- movq %rdi, %rax
- ret
- .cfi_endproc
- .LFE0:
- .size set_sp, .-set_sp
- .p2align 4,,15
- .globl restore_sp
- /***********************************************************************
- * char *restore_sp(char *to,char *from,unsigned long BP,unsigned ling size)
- * to -> %rdi,from -> %rsi(没有使用), BP->%rdi,size->%rcx
- * to,就是在同一个线程,调度器底部,就是应用的栈顶。
- * 不拷贝数据,将来考虑从%rsi反向拷贝size字节到%sdi
- * std
- * rep movsb -- 字节拷贝,效率?能保证两边都是8字节对齐?
- * cld
- ************************************************************************
- .type restore_sp, @function
- restore_sp:
- .LFB1:
- .cfi_startproc
- //从栈顶拉出一个空间
- movq %rdi,%rax
- subq %rcx,%rax
- //返址设定
- movq 8(%rsp),%rbx
- movq %rbx,(%rax)
- subq $8,%rax
- //rsp设定到新位置
- movq %rax,%rsp
- //设定rbp
- movq %rdx,%rbp
- //返回栈底
- addq $8,%rax
- ret
- .cfi_endproc
- .LFE1:
- .size restore_sp, .-restore_sp
- .ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3)"
- .section .note.GNU-stack,"",@progbits
复制代码 两个asm函数。 |
|