Связывая простую программу DOS (ASM), WLINK предупреждает об отсутствии сегмента стека - PullRequest
1 голос
/ 25 марта 2012

Я пытаюсь собрать и связать следующую программу (.EXE, а не .COM), основываясь на примере, приведенном в руководстве NASM :

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:

Iсобрать с помощью следующей команды (которая ничего не производит на стандартный вывод, но создает 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`.

Чего мне не хватает?

1 Ответ

2 голосов
/ 26 марта 2012

В коде 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:
...