汇编代码无法运行——数字反转异常及特权指令报错求助
数字反转汇编代码的问题排查与修复
问题原因分析
- 特权指令异常:在Windows用户态环境下,EBX属于被调用者保存的非易失性寄存器,编译器默认该寄存器的值在函数调用过程中保持不变。直接修改EBX却不先保存原始值,会破坏程序调用栈的上下文,触发特权指令异常。
- 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
相关产品推荐
相关产品推荐

