【发布时间】:2017-11-27 20:46:14
【问题描述】:
我在 c 中有一个基本的引导加载程序,但是当我尝试将参数传递给函数时,它不能正常工作。 以下代码不起作用:
__asm__(".code16\n");
__asm__("call main\n");
void main(){
putchar('X');
while(1){}
}
void putchar(char c){
__asm__("movb %0, %%al\n" : : "r"(c));
__asm__("movb $0x0e, %ah\n");
__asm__("int $0x10\n");
}
它应该打印出一个 X,但它只是像打印一个空格一样向前移动光标。
以下代码有效,因为它没有将字符作为参数传递:
__asm__(".code16\n");
__asm__("call main\n");
char c;
void main(){
c = 'X';
putchar();
while(1){}
}
void putchar(){
__asm__("movb %0, %%al\n" : : "r"(c));
__asm__("movb $0x0e, %ah\n");
__asm__("int $0x10\n");
}
有人可以解释为什么它不起作用吗?
【问题讨论】:
-
我不认为这是你的问题,但 putchar 是一个内置函数
-
@TheAschr :当您使用 -ffreestanding 构建代码时不是这样,因为这是一个引导加载程序。
-
使用
.code16会遇到严重问题。 .code16会出现严重的问题,尤其是在传递参数时。你会想要使用.code16gcc。最近的一个问题与这个问题有一些相似之处。我写了这个答案:stackoverflow.com/a/47276625/3857942。您可能希望阅读 GCC Inline Assembly is Hard to Get Right 和.code16几乎没用,不应该使用这些部分 -
您是否碰巧关注了 Codeproject 上的教程?更重要的是你能告诉我你用来编译
.c文件的gcc命令行吗? -
@MichaelPetch :是的,我确实使用了一些关于 codeproject 的教程。这是我的编译器命令: gcc -m32 -c -Os -march=i686 -ffreestanding -Wall -o kernel.o kernel.c -Iinclude
标签: c gcc parameters x86-16 bootloader