You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数调用中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:10:28