gpt4 book ai didi

c - 如何通过 Watcom 编译器从 C 生成 16 位可执行 BINARY RAW 格式?

转载 作者:太空宇宙 更新时间:2023-11-04 04:02:00 26 4
gpt4 key购买 nike

我想通过 Watcom C 编译器 生成一个 16 位可执行 BINARY RAW 格式。类似于在实模式下运行的没有任何 header 的 EXE 文件。

我使用Large内存模型,因此代码段和数据段可能不同,可以增加超过64K字节。

我喜欢这样:

// 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 值吗?

最佳答案

堆栈段信息通常在最终调用main的cstartup模块中初始化。链接器将对链接中包含的模块的堆栈要求求和,这将反射(reflect)在 sp 中 cstartup 的值中。堆栈段将成为 ds 和 es 分组的一部分,除非您具有多线程标志(当 ss 将分开时)。您还可以尝试在链接器命令文件中设置堆栈大小。

我建议你写一个 .asm 模块,在调用内核之前定义大内存模型所需的段和组。大量的试验和错误,但您学到的东西将适用于大多数环境的启动代码。

查看 Watcom 可以生成的(反汇编).lst 文件,您应该获得有关如何编写 .asm 模块的足够指导。

关于c - 如何通过 Watcom 编译器从 C 生成 16 位可执行 BINARY RAW 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10656717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com