Assembly 链接简单DOS程序(ASM),WLINK警告没有堆栈段

Assembly 链接简单DOS程序(ASM),WLINK警告没有堆栈段,assembly,dos,nasm,watcom,Assembly,Dos,Nasm,Watcom,我正在尝试根据中的示例汇编和链接以下程序(.EXE,而不是.COM): 我使用以下命令进行汇编(该命令在stdout上不生成任何内容,但生成test.obj): 并使用以下命令链接(这是OpenWatcom 1.9 WLINK): 这将提供以下输出(包括警告): 手册规定: 上面的代码声明了一个包含64字节未初始化堆栈空间的堆栈段,并在其顶部指向“stacktop”。指令段堆栈定义了一个名为“stack”的段,也是“stack”类型的段。后者对于程序的正确运行不是必需的,但是如果程序没有“STA

我正在尝试根据中的示例汇编和链接以下程序(
.EXE
,而不是
.COM
):

我使用以下命令进行汇编(该命令在stdout上不生成任何内容,但生成
test.obj
):

并使用以下命令链接(这是OpenWatcom 1.9 WLINK):

这将提供以下输出(包括警告):

手册规定:

上面的代码声明了一个包含64字节未初始化堆栈空间的堆栈段,并在其顶部指向“stacktop”。指令段堆栈定义了一个名为“stack”的段,也是“stack”类型的段。后者对于程序的正确运行不是必需的,但是如果程序没有“STACK”类型的段,链接器可能会发出警告或错误。
我缺少什么?

在NASM代码中,需要将堆栈段标记为具有堆栈类

此外,DOS将在程序启动前为您加载SS和SP

最后,64字节的堆栈有点太少了。中断服务例程使用当前堆栈,如果堆栈太小,它们将覆盖附近的一些代码或数据

这是您修复它的方式:

segment data

hello:  db "hello",13,10,"$"

segment code
..start:
        mov ax,data
        mov ds,ax

;        mov ax,stack
;        mov ss,ax
;        mov sp,stacktop

        mov dx,hello
        mov ah,9
        int 0x21
        mov ax,0x4c00
        int 0x21

segment stack class=stack
        resb 512 ; 64 is too little for interrupts
;stacktop:

考虑到在DOS的最后几天里大量出现的垃圾驱动程序,以及某些DOS模拟器带来的复杂性,我甚至可以说4K对于DOS堆栈来说还不够大。@JimR:我很高兴还有人记得这些东西。你帮了大忙。
nasm -Wall -f obj test.asm
wlink name test.exe format dos file test.obj
Open Watcom Linker Version 1.9
Portions Copyright (c) 1985-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.
loading object files
Warning! W1014: stack segment not found
creating a DOS executable
segment data

hello:  db "hello",13,10,"$"

segment code
..start:
        mov ax,data
        mov ds,ax

;        mov ax,stack
;        mov ss,ax
;        mov sp,stacktop

        mov dx,hello
        mov ah,9
        int 0x21
        mov ax,0x4c00
        int 0x21

segment stack class=stack
        resb 512 ; 64 is too little for interrupts
;stacktop: