组装商店到数据段并没有全部出现
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
它仍然会显示相同的问题,因为您的堆栈将覆盖数据段的那部分,但它会更有效地设置数据段单元。
我在计算机科学中遇到了一个问题 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
它仍然会显示相同的问题,因为您的堆栈将覆盖数据段的那部分,但它会更有效地设置数据段单元。