通常,您应该编写对启动寄存器值不做任何假设的程序,除非有文档说它们用于传递代码的某些输入(无论是函数还是在程序启动时。)
_start
一些寄存器的实际初始值取决于DOS版本。
Https://fd.lod.bz/rbil/interrup/dos_kernel/214b.htmlSaid(对于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没有任何记录的状态,因此其价值是实施细节。
如果您一直在运行“新格式”
通常,如果您希望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
.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代码可移植,那么绝对不是您应该依靠的。