【问题标题】:Upper bits of EBX are zeroed out when single-stepping in CodeView在 CodeView 中单步执行时,EBX 的高位清零
【发布时间】:2019-08-04 11:48:09
【问题描述】:

我有以下用 MASM 为 i386 处理器编写的简单程序:

        TITLE   BLA
        .MODEL  SMALL
        .386
        .STACK
        .DATA
        .CODE
MAIN    PROC    FAR
        .STARTUP
        MOV     EBX,0FFFFFFFFH; (1)
        MOV     EAX,0EEEEEEEEH; (2)
       .EXIT
MAIN    ENDP
END

我对 EBX 寄存器的行为感到困惑。在 (1) 指令之后,EBX 被设置为 1-s:

执行(2)指令不仅将值加载到EAX中,而且将EBX的上半部分归零:

为什么会发生?

【问题讨论】:

  • 这绝对不正常。你在哪里执行这个?
  • 我使用安装了 Win98 和 MASM 6.11 的 VirtualBox 虚拟机。屏幕截图来自 MASM 分发中包含的 ProgrammersWorkBench (PWB) 以及 CodeView 调试器。这只发生在 EBX 上,所有其他 GP 寄存器都保存 32 位值。首先,我认为这可能是由于段字大小设置为 16 位,因为我在 .386 指令之前使用 .MODEL 。但现在我看不到任何依赖。

标签: assembly x86 masm x86-16 code-view


【解决方案1】:

根据微软的说法,这是 Codeview 中的一个已知错误。见知识库文章Q87548

症状

在 Microsoft CodeView 中单步执行或跟踪代码时 4.0版, 在 4.01 和 4.05 中,32 位寄存器(eax、ebx、edi 等)的下半部分始终被保留,但上半部分可能已损坏。其他 386 特定的寄存器,例如 gs 和 fs 寄存器,也可以是 损坏。制作动画时也会出现此问题。这个问题确实 如果没有一次执行一条指令,则不会发生。

状态

Microsoft 已确认这是 CodeView 4.0 版中的问题, 4.01,和 4.05。此问题已在 CodeView 4.1 版中得到纠正。

根据本文,修复方法是获取 Codeview 4.1 或更高版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多