在我们的项目中,我们使用全局寄存器变量。特别是,对于64位和%esi ,我们使用%r12 ,%r13 ,%r14 ,< 32位代码的强>%edi 。
例如:
register void * my_var asm ("r12");
可以从不同的模块(.c文件)访问这些全局变量。 根据ABI(http://www.x86-64.org/documentation/abi.pdf),这些regs“属于”调用函数,并且被调用的函数需要保留它们的值。
对于mingw64,我们可以看到这些注册表在进行任何调用之前都保存在堆栈中,即使该调用没有在内部使用这些注册表。但是,当我们在linux上使用gcc编译时,这不会发生。有没有人遇到这个或理解为什么会这样?
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $40, %rsp
movq %rcx, %rbx
xorl %ecx, %ecx
call my_func
testl %eax, %eax
je .L40
movq 168(%rbx), %rax
addq $40, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
ret