使用CodeViewer调试DOS代码时EAX寄存器被截断为16位的异常问题
32位寄存器调试异常:CodeViewer在DOS虚拟机下的EAX高16位丢失问题
环境与测试代码
- 运行环境:DOS 6.22 虚拟机(已在QEMU、Bochs、VirtualBox中测试)
- 编译工具:MASM、FASM
测试代码:
.model small, stdcall .386 .stack 1024 .code Main proc mov AX, @data mov DS, AX mov EBX, 00F00140h ; EBX 赋值为 00F00140h mov EAX, EBX ; 执行后EAX值为 00F00140h xor ECX, ECX ; 执行此指令后,EAX高16位被清零为00000140h,仅EAX出现异常 ... Main endp end main
异常现象
执行mov EAX, EBX后EAX寄存器值为00F00140h,但执行任意后续指令后,EAX的高16位会被清零,且只有EAX出现该异常,其他32位寄存器无此问题。
排查与结论
- 跨虚拟机验证:在QEMU、Bochs、VirtualBox中使用CodeViewer测试,现象完全一致
- 排除编译问题:MASM和FASM编译后的程序均出现相同异常
- 排除显示bug:添加
mov edx, eax指令后,EDX的值为00000140h,说明EAX实际值确实被修改 - 第三方工具验证:使用Ldebug调试时,EAX寄存器值符合预期(执行后续指令后仍保持
00F00140h)
最终确认:该异常是CodeViewer的bug,解决方案:调试包含32位寄存器的DOS汇编代码时,请勿使用CodeViewer。
相关工具推荐
支持查看32位寄存器的DOS调试器
- Ldebug:完整支持32位寄存器的查看与调试,结果准确可靠
- 早期版本OllyDbg:可在DOS环境下调试32位代码,支持完整寄存器查看
- 32位版本Turbo Debugger:适配DOS环境的32位汇编调试需求
支持单步执行的虚拟机
- QEMU:支持单步执行调试,可配合gdb等工具联动
- Bochs:自带调试器,支持图形化或命令行单步执行,对DOS环境兼容性极佳
- VirtualBox:可通过调试端口配合外部调试器实现单步执行功能
内容的提问来源于stack exchange,提问作者IgorByte
相关产品推荐
相关产品推荐

