1

NASM マニュアルの例に基づいて、次のプログラム (.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:

次のコマンドでアセンブルします (標準出力には何も生成しませんが、生成します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` と呼ばれるセグメントを定義し、タイプも `STACK` です。後者はプログラムを正しく実行するために必要ではありませんが、プログラムに「STACK」タイプのセグメントがない場合、リンカは警告またはエラーを発行する可能性があります。

私は何が欠けていますか?

4

1 に答える 1

3

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:
于 2012-03-25T22:08:30.187 に答える