组装商店到数据段并没有全部出现

Assembly stores to DATA segment not all showing up

我在计算机科学中遇到了一个问题 Class 从单元格 0h 到 100h 写入数据段并且它正在工作一半,它覆盖除 EE 之外的每个单元格到 FF

Start:
    mov ax, @data
    mov ds, ax
    mov si, 100h ; starting DATASEG
    mov cx, 0h ; counting 
    mov al, 0FFh ; Number setting in each segment

loop1: 
    mov [si],al
    dec si ; decrease location
    inc cx ; increase counting
    CMP cx,101h
    jne loop1

结果:

我认为@Michael 已经找到了原因:SS = DS 和您的 SP=100h,因此中断处理程序将破坏 SP 下面的 space。这是要覆盖的 DS:00..DS:100h 范围的末尾。

甚至调试器本身也可能部分侵入并破坏被调试程序 SP 下的内存(例如,当 int3 指令推送异常 - return 信息时)。 (您是 DOSBOX 中的 运行 TurboDebugger,而不是使用 DOSBOX 或 BOCHS 内置的调试器;这样您就可以完全非侵入式地进行调试,但是当您没有时,定时器中断仍然会低于 SP中断禁用)。

所以你的代码可以工作,但它的结果被堆栈覆盖了。

答案是 Peter Cordes 发布的(你设法不显示相关代码,这是导致问题的原因,你问题中的代码是正确的,没有问题,但初始数据段和堆栈设置是错误)。

这就是为什么 Whosebug 上好的调试问题需要 Minimal, Complete, and Verifiable example


我只是想补充一点,如何使用更简单的 16b 代码,使用 rep stos 模式和 es:di 寻址来获得相同的结果:

    mov ax, @data
    mov es, ax
    xor di, di   ; es:di = start of DATASEG
    mov cx, 100h/2  ; number of "word" elements to write
    mov ax, 0FFFFh  ; number to set in each cell
    cld          ; just in case DF was not 0
    rep stosw    ; write 100h cells
    stosb        ; final 101h-st cell to cover whole 0000-0100 range

它仍然会显示相同的问题,因为您的堆栈将覆盖数据段的那部分,但它会更有效地设置数据段单元。