1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| .globl coctx_swap #if !defined( __APPLE__ ) .type coctx_swap, @function #endif coctx_swap:
#if defined(__i386__) # 4(%esp) 是调用 coctx_swap 函数的第一个参数 movl 4(%esp), %eax # sp 是 ip 值,ret 指令使用 movl %esp, 28(%eax) movl %ebp, 24(%eax) movl %esi, 20(%eax) movl %edi, 16(%eax) movl %edx, 12(%eax) movl %ecx, 8(%eax) movl %ebx, 4(%eax)
# 8(%esp) 是调用 coctx_swap 函数的第二个参数 movl 8(%esp), %eax movl 4(%eax), %ebx movl 8(%eax), %ecx movl 12(%eax), %edx movl 16(%eax), %edi movl 20(%eax), %esi movl 24(%eax), %ebp # 设置栈顶值,当 ret 指令调用时会触发 pop ip,恢复原先的执行 movl 28(%eax), %esp
ret
#elif defined(__x86_64__) # 函数调用传参,优先将参数传递给寄存器,当寄存器不够用时,会丛右到左压栈,然后再传参给寄存器。 # %rdi,%rsi,%rdx,%rcx,%r8,%r9, 这6个不够用的时候才会借用栈。 # 所以 %rdi 是第一个参数,是保存寄存器组内存的首地址。
leaq (%rsp), %rax movq %rax, 104(%rdi) movq %rbx, 96(%rdi) movq %rcx, 88(%rdi) movq %rdx, 80(%rdi) movq 0(%rax), %rax movq %rax, 72(%rdi) movq %rsi, 64(%rdi) movq %rdi, 56(%rdi) movq %rbp, 48(%rdi) movq %r8, 40(%rdi) movq %r9, 32(%rdi) movq %r12, 24(%rdi) movq %r13, 16(%rdi) movq %r14, 8(%rdi) movq %r15, (%rdi) xorq %rax, %rax
movq 48(%rsi), %rbp movq 104(%rsi), %rsp movq (%rsi), %r15 movq 8(%rsi), %r14 movq 16(%rsi), %r13 movq 24(%rsi), %r12 movq 32(%rsi), %r9 movq 40(%rsi), %r8 movq 56(%rsi), %rdi movq 80(%rsi), %rdx movq 88(%rsi), %rcx movq 96(%rsi), %rbx leaq 8(%rsp), %rsp pushq 72(%rsi) // ip 入栈
movq 64(%rsi), %rsi ret #endif
|