gpt4 book ai didi

C 编译器未生成有效的汇编输出

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

我正在用 C 和 ASM 编写一个简单的内核(以调用 C 编译生成的汇编指令)。我正在关注来自 osdev.org 的这篇优秀文章。在阅读了一个用汇编编写的内核并编译和执行后,它运行良好,我看到 kernel.bin 在 qemu 上运行,太棒了。但我真的想用 C 写它。我找到了 an example在同一网页中。

我编译了它并尝试在 qemu 上运行 kernel.bin,但我从所有设备上都收到“启动失败”消息:硬盘、floopd 和 CD-rom。然后我反汇编了ks.o生成的kernel.bin(使用nasm组装的kernel.asm)和kernel.o(使用gcc组装的kernel.c)使用ld组装成bin文件。内核.bin:

http://pastebin.com/Y0pLFvij我看不到我的字符串或任何关于在视频上编写我的字符串的汇编指令。

生成它的 C 代码:

#define WHITE_TXT 0x07 // white on black text
unsigned int k_printf(char *message, unsigned int line);
void k_clear_screen();

k_main()
{
k_clear_screen();
k_printf("Hi!\nHow's this for a starter OS?", 0);
};

unsigned int k_printf(char *message, unsigned int line) // the message and then the line #
{
char *vidmem = (char *) 0xb8000;
unsigned int i=0;

i=(line*80*2);

while(*message!=0)
{
if(*message=='\n') // check for a new line
{
line++;
i=(line*80*2);
*message++;
} else {
vidmem[i]=*message;
*message++;
i++;
vidmem[i]=WHITE_TXT;
i++;
};
};

return(1);
};

void k_clear_screen() // clear the entire text screen
{
char *vidmem = (char *) 0xb8000;
unsigned int i=0;
while(i < (80*25*2))
{
vidmem[i]=' ';
i++;
vidmem[i]=WHITE_TXT;
i++;
};

和调用它的程序集:

[bits 32]

[global start]
[extern k_main] ; this is in the c file

start:
call k_main

cli ; stop interrupts
hlt ; halt the CPU

链接.ld

OUTPUT_FORMAT("binary")

ENTRY(start)

SECTIONS

{

.text 0x100000 : {

code = .; _code = .; __code = .;

*(.text)

. = ALIGN(4096);

}

.data : {

data = .; _data = .; __data = .;

*(.data)

. = ALIGN(4096);

}

.bss :

{

bss = .; _bss = .; __bss = .;

*(.bss)

. = ALIGN(4096);

}

end = .; _end = .; __end = .;

}

和生成文件:

bin:
nasm -f aout -o ks.o kernelbase.asm
gcc -Wall -c -o kernel.o kernel.c
ld -T link.ld -o kernel.bin ks.o kernel.o
run1:
qemu kernel.bin

clear:
rm -f *.o

cbin:
rm -f *.bin

以及纯汇编中的内核,反汇编:http://pastebin.com/Bkvkq3YQ这对我来说效果很好,我可以看到在视频上书写的说明。

我的操作系统:Ubuntu 10.4
编译器:gcc
汇编程序:NASM

我哪里错了?

最佳答案

我尝试完成该教程,但代码也失败了。最后我这样做了:

为 32 位编译这两个文件:

nasm -f elf32 ks.asm -o kernelbase.o
gcc -m32 -c kernel.c -o kernel.o

和链接:

gcc -m32 kernelbase.o kernel.o -o Kernel.bin

一段时间后,我发现使用 gcc 进行链接没有出现任何错误。

希望我有所帮助:-)

关于C 编译器未生成有效的汇编输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9556208/

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