为什么CX寄存器在DOS程序的启动中已经具有非零值,与AX和BX不同?

问题描述 投票:0回答:1
我注意到,每当我启动AFD(预先全屏调试器)时,即使在执行第一个命令之前,CX Registor都已经具有一定的价值。这是什么原因?

您可以看到一个左上角,CX已经有1F值...

我也尝试编写其他代码,结果相同。我也尝试使用谷歌搜索,但我找不到确切的原因。 我的预期结果是,CX重新登录必须为0000作为AX,而BX为a。

通常,您应该编写对启动寄存器值不做任何假设的程序,除非有文档说它们用于传递代码的某些输入(无论是函数还是在程序启动时。)

assembly x86-16 dos cpu-registers
1个回答
0
投票
DOS是一个没有内核与用户隔离的单用户操作系统,因此它无需零寄存器即可避免像现代OS一样泄漏内核数据到用户空间。 (但是至少在Linux中,动态链接器代码在您的

_start

之前运行,除非您制作静态链接的可执行文件,并且ABI不能保证零寄存器值。只有有效的堆栈指针。) nyway,没有一个充分的理由假设启动时寄存器应为零。 内核代码在将控件转移到您的程序之前正在运行,因此除非将额外的说明运行到零寄存器,否则它们不会被归零。

一些寄存器的实际初始值取决于DOS版本。

Https://fd.lod.bz/rbil/interrup/dos_kernel/214b.html

Said

(对于DOS 2+的INT 21“ exec”系统调用:加载和/或执行程序):


注:DOS 2.x摧毁了所有寄存器,包括ss:sp

this this说,从新过程中运行的程序中的寄存器值不在任何地方。 .com-format的可执行文件开始运行以下寄存器值:

AL= 00H如果第一次FCB有有效的驱动器字母,则FFH如果不是

AH= 00H如果第二FCB有有效的驱动器字母,则FFH如果不是

CS,DS,ES,SS = PSP段

Sp=前64K段中可用的最后一个字的偏移

(注意:AX始终是desqview下的0000H)

CX和BX没有任何记录的状态,因此其价值是实施细节。
    如果您一直在运行“新格式”
  • int 21h
  • ,那么
  • cx=自动数据段的大小(0000H = 64K)
  • DOS如何将程序加载到内存中? 显然是.exe的“初始寄存器值”和“ exe标头”。 tong在x86/x64中进行打高尔夫球的tips links links links链接到
  • Https://www.fysnet.net/yourhelp.htm
  • ,它具有DOS版本的初始寄存器值表,以防万一您要代码code-golf Tiny-Golf Tiny tiny tiny tiny
  • .exe
  • 利用起始寄存器值而不是假设它们容纳随机垃圾的程序。
通常,如果您希望BX为零,则在程序开始时运行
.com

。 例如,MS-DOS 1.25(OEM)以BX = CS启动

xor bx, bx

程序。 许多其他版本始于它,但不是全部。 Freedos Beta 7和8的确从CX = 0开始,但是Freedos 1.00和1.10 ms-Dos和PC-DOS 2.0及以后的行为and的行为,大概是与依赖于此的程序相机。 但是Dr-Dos 7及以后以CX =CS.

开始
因此,如果您希望DOS代码可移植,那么绝对不是您应该依靠的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.