【问题标题】:Linking a simple DOS program (ASM), WLINK warns about no stack segment链接一个简单的 DOS 程序 (ASM),WLINK 警告没有堆栈段
【发布时间】:2012-04-09 05:24:52
【问题描述】:

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

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 stack
        resb 64
stacktop:

我使用以下命令进行组装(在 stdout 上不产生任何结果,但会生成 test.obj):

nasm -Wall -f obj test.asm

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

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

手册指出:

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

我错过了什么?

【问题讨论】:

    标签: assembly dos nasm watcom


    【解决方案1】:

    在 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:我很高兴还有人记得这些东西。你帮了大忙。
    猜你喜欢
    • 2016-02-07
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多