我现在正在使用堆栈协同程序进行网络编程。但是我被返回堆栈缓冲区的失效处罚了(参见 http://www.agner.org/optimize/microarchitecture.pdf p.36),在上下文切换期间(因为我们手动更改SP寄存器)
我发现汇编语言测试后TEncSearch.cpp
指令优于jmp
。但是,我有一些函数间接调用用C ++语言编写的上下文切换函数(由GCC编译)。我们如何在GCC汇编结果中使用ret
而不是jmp
来强制执行这些函数返回?
一些常见但不完美的方法:
ret
之前使用内联汇编并手动将SP寄存器设置为__builtin_frame_address+2*sizeof(void*)
和jmp
到返回地址?这是一种不安全的解决方案。在C ++中,在ret
指令之前破坏局部变量或正确的值。如果我们ret
,我们将省略这些指令。更糟糕的是,即使我们在C中,被调用者保存的寄存器也需要在jmp
指令之前恢复,我们也将省略这些指令。
那么我们可以做什么强制GCC使用jmp而不是ret来避免上面列出的问题?
答案 0 :(得分:3)
使用汇编程序宏:
.macro ret
pop %ecx
jmp *%ecx
.endm
将它放在文件顶部或其他位置的内联汇编程序中。