函数调用中ESP值未正确保存的报错原因及解决方法咨询
问题原因与解决办法
核心问题:未保存非易失性寄存器
你编写的汇编代码直接修改了EBX寄存器,但在x86架构的调用约定中,EBX属于非易失性寄存器——被调用函数(此处的swap)必须在使用前保存该寄存器的值,返回前恢复它,否则会破坏调用者(main)的寄存器状态,触发ESP相关的运行时检查错误。
修正后的代码
void swap(int* a, int* b) { __asm { push ebx // 将EBX寄存器的值压栈保存 mov eax, a mov ebx, b push[eax] push[ebx] pop[eax] pop[ebx] pop ebx // 从栈中恢复EBX寄存器的值 } } int main() { int a = 3, b = 6; printf("a: %d b: %d\n", a, b); swap(&a, &b); printf("a: %d b: %d\n", a, b); }
额外优化:更高效的交换逻辑
不需要借助栈完成交换,直接用寄存器中转效率更高,同时仍需遵守寄存器保存规则:
void swap(int* a, int* b) { __asm { push ebx mov eax, [a] mov ebx, [b] mov ecx, [eax] mov edx, [ebx] mov [eax], edx mov [ebx], ecx pop ebx } }
内容的提问来源于stack exchange,提问作者Ben Eslami
相关产品推荐
相关产品推荐

