Как сгенерировать 16-битный исполняемый формат BINARY RAW из C компилятором Watcom?
Я хочу сгенерировать 16-битный исполняемый формат BINARY RAW Watcom C compiler
, Что-то вроде EXE-файла без заголовка, который работает в реальном режиме.
я использую Large
Модель памяти. Таким образом, сегмент кода и сегмент данных могут отличаться и могут увеличиваться более чем на 64 КБ.
Я делаю так:
// 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;
}
Для компиляции кода выше я запускаю ниже пакетный файл:
@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
После запуска build.bat
следующее сообщение, сгенерированное компилятором и компоновщиком 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
Выходные файлы успешно созданы.
Но мой вопрос:
Как я могу решить W1014
предупреждение?
И есть ли способ указать начальное значение CS?
1 ответ
Информация сегмента стека обычно инициализируется в модуле cstartup, который в конечном итоге вызывает main. Компоновщик суммирует требования стека для модулей, включенных в ссылку, и это будет отражено в значении cstartup позиции в sp. Сегмент стека будет частью группировки ds и es, если у вас нет флага многопоточности (когда ss будет разделен). Вы также можете поэкспериментировать с установкой размера стека в командном файле компоновщика.
Я предлагаю вам написать модуль.asm, который определяет сегменты и группы, необходимые для большой модели памяти, прежде чем она вызовет ядро. Много проб и ошибок, но то, что вы узнаете, будет применимо к коду запуска для большинства сред.
Посмотрите файл (дизассемблирование) .lst, который может сгенерировать Watcom, и вы должны получить достаточное руководство по написанию модуля.asm.