我正在为x86-64系统开发setjmp
/ longjmp
自定义实现,它保存了CPU的整个上下文(即所有xmm,fpu堆栈等;不仅是callee-save寄存器).这是直接在汇编中编写的.
代码在最小的示例中工作正常(直接从汇编源调用它时).由于参数传递给自制程序setjmp
/ longjmp
函数的方式,在使用C代码时会出现问题.实际上,x64_64系统的SysV ABI规定参数应该通过寄存器传递(如果它们最多为6).我的职能签名是:
long long set_jmp(exec_context_t *env);
__attribute__ ((__noreturn__)) void long_jmp(exec_context_t *env, long long val);
当然,这不能正常工作.事实上,当我进入set_jmp
,rdi
并rsi
已经被破坏,以保持指针env
和val
.这同样适用long_jmp
于rdi
.
有没有办法强制GCC,例如依靠某些属性,强制通过堆栈传递参数?这将比包装set_jmp
和long_jmp
使用某些定义更加优雅,这些定义手动将堆栈寄存器压入堆栈,以便稍后检索它们.