到目前为止,我有一个汇编脚本,可以让你从它启动并将hello world写入屏幕。现在我希望能够编写一些c代码,并能够让我的汇编脚本以某种方式运行它。我使用mingw gcc作为我的编译器。这是我在程序集中的引导加载程序:
org 7C00h
jmp short Start
Msg: db "Hello, world" EndMsg: Start: mov bx, 000Fh
mov cx, 1
xor dx, dx
mov ds, dx
cld Print: mov si, Msg
Char: mov ah, 2
int 10h
lodsb
mov ah, 9
int 10h
inc dl
cmp dl, 80
jne Skip
xor dl, dl
inc dh
cmp dh, 25
jne Skip
xor dh, dh
Skip: cmp si, EndMsg
jne Char
jmp Print times 0200h - 2 - ($ - $$) db 0
dw 0AA55h
我的问题是如何编译c代码以便汇编脚本执行它?我将如何编辑我当前的引导加载程序,以便可能?
答案 0 :(得分:3)
首先,您应该选择要使用的编译器并研究其细节。可以为“托管”环境编译C程序,该环境假定标准初始化,main()作为入口点和标准库,以及“独立”环境,其中不提供这样的保证。要调用C代码,您应在引导加载程序中进行适当的环境设置(堆栈,数据段等)。此细节特定于编译器。将目标代码转换为适合您的引导加载程序的形式也可能是个问题。 对于16位代码,至少可以免费使用Turbo C和Watcom C. Watcom更先进,更现代,现在是开源的。 请注意,标准库在此类设置中不可用,因此C代码应专门为您的环境编写;这包括如下的水下宝石。尽管你没有编写库调用,但通常在库中实现32位长的乘法。
[一般来说,我对你使用C的要求感到困惑;一旦引导程序不太可能需要执行速度,使用更适用于此类上下文的内容就更为合适,如Forth。有准备使用的实现(参见FreeBSD bootloader)。]
答案 1 :(得分:1)
您需要编译16位的C代码。然后将其复制到引导设备中的给定位置。您需要修改引导加载程序以将代码加载到内存中并跳转到它。另请注意,gcc目前无法编译为16位。我听说Watcom编译器可以,所以它应该是有用的。
答案 2 :(得分:0)
一般来说,您需要做以下事情:
您需要谷歌多次获取所有细节...