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

汇编代码无法运行——数字反转异常及特权指令报错求助

数字反转汇编代码的问题排查与修复

问题原因分析

  1. 特权指令异常:在Windows用户态环境下,EBX属于被调用者保存的非易失性寄存器,编译器默认该寄存器的值在函数调用过程中保持不变。直接修改EBX却不先保存原始值,会破坏程序调用栈的上下文,触发特权指令异常。
  2. EBX始终为0:由于异常导致程序提前终止,汇编逻辑未能完整执行,EBX无法得到正确的反转结果,最终显示初始赋值的0。

修复后的代码

#include<iostream>
#include<stdlib.h>
#include<stdio.h>

using namespace std;

int main() {
    int nb;
    cout << "nb=";
    cin >> nb;

    _asm {
        push ebx          // 保存EBX原始值,遵循调用约定
        mov eax, nb;
        mov ebx, 0;
        mov ecx, 10;
_check_while:
        cmp eax, 0;
        je _outside_while;

        mov edx, 0;
        div ecx;          // eax = 输入数/10,edx = 输入数%10
        xchg eax, ebx;    // 交换eax(商)和ebx(当前反转结果)
        mul ecx;          // eax = 反转结果 * 10
        add eax, edx;     // eax = 反转结果*10 + 余数
        xchg eax, ebx;    // 交换回,ebx保存新反转结果,eax继续处理商

        jmp _check_while;

_outside_while:
        mov nb, ebx;
        pop ebx           // 恢复EBX原始值,避免破坏上下文
    }

    cout << "Result is" << " " << nb;
    return 0;
}

关键修复点

  • 在汇编代码开头添加push ebx、结尾添加pop ebx,确保EBX寄存器的原始值被保存和恢复,符合编译器调用约定,彻底解决特权指令异常问题。
  • 原数字反转逻辑本身正确:通过循环取余、拼接反转结果,执行完成后EBX会存储正确的反转值,最终写入变量nb输出。

内容的提问来源于stack exchange,提问作者Alex544

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:25:04