嗯,这显然是一个初学者的问题,但这是我第一次尝试制作操作系统在C
(其实,我几乎是全新的C
..我习惯了asm
)所以,为什么这是无效的?据我所知,在C
pointer
只是一个uint16_t
用于指向内存中的某个区域,权利(或uint32_t
,这就是为什么它不工作)? 我做了以下内核(“我已经做了一个引导程序和所有组件加载生成KERNEL.BIN文件):GCC裸机内联汇编SI寄存器不能很好地与指针
kernel.c
void printf(char *str)
{
__asm__(
"mov si, %0\n"
"pusha\n"
"mov ah, 0x0E\n"
".repeat:\n"
"lodsb\n"
"cmp al, 0\n"
"je .done\n"
"int 0x10\n"
"jmp .repeat\n"
".done:\n"
"popa\n"
:
: "r" (str)
);
return;
}
int main()
{
char *msg = "Hello, world!";
printf(msg);
__asm__("jmp $");
return 0;
}
我用下面的命令编译它kernel.c
:
gcc kernel.c -ffreestanding -m32 -std=c99 -g -O0 -masm=intel -o kernel.bin
返回以下错误:
kernel.c:3: Error: operand type mismatch for 'mov'
为什么可能是这个错误的原因?
会给你一个建议。如果你愿意的话,你可以大便便利,但如果你对这类事情不熟悉,最糟糕的事情就是做内联汇编程序。很容易弄错,你需要适当的输入,输出和clobbers来覆盖所有变化的东西。如果你想用汇编写入,我建议把这些函数写在一个单独的汇编文件中,而不要使用_C_代码。 –
如果您使用内联汇编程序,请谨慎使用它。只有在必要时才使用它,并让_C_代码为您完成工作(包括循环等)。 –
即使是经验丰富的尝试GCC扩展内联汇编程序的_C_开发人员,也可以创建似乎能够工作的代码,然后在_C_优化程序缩减所有内容时,在未来的某个时间点不会采取应有的方式。如果你不知道自己在做什么,那么等待发生的负担就会很大。 –