Comment générer un format BINARY RAW exécutable 16 bits à partir du compilateur C by Watcom ?

StackOverflow https://stackoverflow.com//questions/10656717

Question

Je souhaite générer un format BINARY RAW exécutable 16 bits en Watcom C compiler.Quelque chose comme un fichier EXE sans aucun en-tête qui s'exécute en mode réel.

j'utilise Large modèle de mémoire, ainsi le segment de code et le segment de données peuvent être différents et peuvent augmenter de plus de 64 Ko.

J'aime ça :

// kernel.c
void kernel(void)
{
    /* Print Hello! */
    __asm
    {
        mov ah, 0x0E;
        mov bl, 7

        mov al, 'H'
        int 0x10

        mov al, 'e'
        int 0x10

        mov al, 'l'
        int 0x10

        mov al, 'l'
        int 0x10

        mov al, 'o'
        int 0x10

        mov al, '!'
        int 0x10
    }
    return;
}

Pour compiler le code ci-dessus, j'exécute le fichier batch ci-dessous :

@rem build.bat

@rem Cleaning.
del *.obj
del *.bin

cls

@rem Compiling.
@rem 0:     8088 and 8086 instructions.
@rem d0:    No debugging information.
@rem ml:    The "large" memory model (big code, big data) is selected.
@rem s:     Remove stack overflow checks.
@rem wx:    Set the warning level to its maximum setting.
@rem zl:    Suppress generation of library file names and references in object file.
wcc -0 -d0 -ml -s -wx -zl kernel.c

@rem Linking.
@rem FILE:      Specify the object files.
@rem FORMAT:    Specify the format of the executable file.
@rem NAME:      Name for the executable file.
@rem OPTION:    Specify options.
@rem Note startup function (kernel_) implemented in kernel.c.
wlink FILE kernel.obj FORMAT RAW BIN NAME kernel.bin OPTION NODEFAULTLIBS, START=kernel_

del *.obj

Après avoir couru build.bat le message suivant généré par le compilateur et l'éditeur de liens Watcom :

D:\Amir-OS\ckernel>wcc -0 -d0 -ml -s -wx -zl kernel.c
Open Watcom C16 Optimizing Compiler Version 1.9
Portions Copyright (c) 1984-2002 Sybase, Inc. All Rights Reserved.
Source code is available under the Sybase Open Watcom Public License.
See http://www.openwatcom.org/ for details.
kernel.c: 28 lines, included 35, 0 warnings, 0 errors
Code size: 39

D:\Amir-OS\ckernel>wlink FILE kernel.obj FORMAT RAW BIN NAME kernel.bin OPTION N
ODEFAULTLIBS, START=kernel_
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 RAW Binary Image executable

Fichiers de sortie générés avec succès.

Mais ma question est :

Comment puis-je résoudre W1014 avertissement?

Et existe-t-il un moyen de spécifier la valeur CS initiale ?

Était-ce utile?

La solution

Les informations sur le segment de pile sont généralement initialisées dans le module cstartup qui appelle finalement main.L'éditeur de liens additionnera les exigences de pile pour les modules inclus dans le lien et cela sera reflété dans la valeur cstartup places dans sp.Le segment de pile fera partie du regroupement ds et es sauf si vous disposez de l'indicateur multi-thread (lorsque ss sera séparé).Vous pouvez également essayer de définir la taille de la pile dans le fichier de commandes de l'éditeur de liens.

Je vous suggère d'écrire un module .asm qui définit les segments et groupes requis par le modèle de grande mémoire avant d'appeler le noyau.Beaucoup d'essais et d'erreurs, mais ce que vous apprendrez sera applicable au code de démarrage de la plupart des environnements.

Consultez le fichier (démontage) .lst que Watcom peut générer et vous devriez obtenir suffisamment de conseils sur la façon dont le module .asm doit être écrit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top