[英]C Inline Asm Int 0x10
我正在尝试编写一个函数,该函数在C语言中将字符串打印在屏幕上。它是用于引导加载程序的,因此没有外部库或任何链接的内容。这是我的函数:
void printString(const char* pStr) {
while(*pStr) {
__asm__ __volatile__ (
"movb 0x0e, %%ah\n"
"movb %[c], %%al\n"
"int $0x10\n"
:
: [c] "r" (*pStr)
: "ax"
);
++pStr;
}
}
运行此程序时,我的VM没有任何错误。 它只是坐在那里,光标在屏幕的左上角。 有什么想法吗? 如果有人认为这会有所帮助,则可以生成objdump -d
。
好的,在发表了一些有用的评论后,我可能会进行全面组装。 就像是
Print:
push %ax
movb $0x0E, %ah # Set interrupt code
movb $0x00, %bh # Set page #
.loop:
lodsb # Load next char
test %al, %al # Check for \0
je .done
int $0x10 # Call interrupt
jmp .loop
.done:
pop %ax
ret
那应该是16位实模式兼容的,并且可以与GAS组装在一起,据我了解,GAS在编译16位程序方面比GCC更好。
我认为您错过了重点。 问题不在于您的汇编代码。 问题是“ int 10”是BIOS
如果您已经引导至某个操作系统(例如Windows或Linux),则您的x86 CPU处于“保护模式”; 并且您可能无法从用户空间访问int 10…除非类似Windows命令提示符的东西为您模拟它。
就一般的Linux /汇编编程而言,我强烈推荐这本书(免费,在线, 非常好):
从头开始编程,乔纳森·巴特利特(Jonathan Bartlett)
感谢您澄清您正在编写“引导加载程序”。 强烈建议1:从USB记忆棒引导您的自定义代码,或创建一个虚拟DOS软盘以引导DOS VM(例如,VMWare或VBox VM)。
以下是一些教程:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.