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

使用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位寄存器无此问题。

排查与结论

  1. 跨虚拟机验证:在QEMU、Bochs、VirtualBox中使用CodeViewer测试,现象完全一致
  2. 排除编译问题:MASM和FASM编译后的程序均出现相同异常
  3. 排除显示bug:添加mov edx, eax指令后,EDX的值为00000140h,说明EAX实际值确实被修改
  4. 第三方工具验证:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 09:50:54