Turbo Assembler 2.0 下实模式 MZ.exe 中堆栈和数据的分配

Allocation of Stack and Data in a Real Mode MZ .exe under Turbo Assembler 2.0

我已经成功地使用 SEGMENT 指令在 TASM 下创建了单独的堆栈、数据和代码段,但仍有一些问题困扰着我。当使用 Turbo Assembler 2.0 汇编以下代码时,TLINK 生成一个大小在 90KB 左右的二进制文件。

.286

myStack segment para stack 'stack'
db 0FFFFh dup (?)
ends myStack

myData segment para 'data'
msg db 'Memes!$'
db 7FFFh dup (?)
ends myData

myCode segment para 'code'
assume cs:myCode
assume ss:myStack

start:
mov  ax,myData
mov  ds,ax

push offset msg
call write
add  sp,2

mov  ah,4ch
int  21h

write:
push bp
mov  bp,sp
mov  dx,[bp+4]
mov  ah,9h
int  21h
pop  bp
ret

ends myCode
end start

现在在我看来,MZ 文件格式应该允许 .exe 指定它需要超出二进制映像中实际包含的内存分配(通过另外分配的 min/max 段内存到我猜的代码大小条目)。

所以我的问题是:如何诱使 assembler/linker 生成具有适当 header 的 .exe 来分配内存而不直接在二进制图像中包含占位符值?

已经有一段时间了,但我认为您可以通过将代码段放在首位来实现您想要做的事情。然后将所有初始化数据放在 data 段的开头,然后是 data 段中的所有未初始化数据,然后是所有未初始化的堆栈段。由于所有未初始化的数据都被强制到最后,因此文件中的任何space都不需要分配。

如果代码看起来像这样,您的代码可能会为您提供所需的结果:

.286

myCode segment para 'code'
assume cs:myCode
assume ss:myStack

start:
mov  ax,myData
mov  ds,ax

push offset msg
call write
add  sp,2

mov  ah,4ch
int  21h

write:
push bp
mov  bp,sp
mov  dx,[bp+4]
mov  ah,9h
int  21h
pop  bp
ret

ends myCode

myData segment para 'data'
msg db 'Memes!$'             ; Initialized data first
db 7FFFh dup (?)             ; Uninitialized data after all initialized data
ends myData

myStack segment para stack 'stack'
                             ; Leave blank, this will allow the stack to
                             ; to use the full 64k segment
ends myStack

end start