我正试图编写一个函数,在C中打印屏幕上的字符串。这是一个引导加载程序,因此没有外部库或任何链接。下面是我的函数:
void printString(const char* pStr) {
while(*pStr) {
__asm__ __volatile__ (
"movb 0x0e, %%ahn"
"movb %[c], %%aln"
"int $0x10n"
:
: [c] "r" (*pStr)
: "ax"
);
++pStr;
}
}
当我运行这个程序时,我的虚拟机中不会出现任何错误。它只是放在那里,光标在屏幕的左上角。有什么想法吗?如果有人认为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
je .done
int $0x10 # Call interrupt
jmp .loop
.done:
pop %ax
ret
它应该是16位实模式兼容的,并且可以与GAS组装,据我所知,GAS在编译16位程序时比GCC工作得更好。
我认为您没有抓住要点。问题不在于你的汇编代码;问题是"int10"是一个BIOS
如果您已经启动到操作系统(例如Windows或Linux),那么您的x86 CPU正在"保护模式"下运行;并且您可能无法从用户空间访问int 10。。。除非像Windows命令提示符这样的东西为您模拟它。
就Linux/汇编编程而言,我强烈推荐这本书(免费、在线、非常好):
从头开始编程,Jonathan Bartlett
感谢您澄清您正在编写一个"引导加载程序"。强烈建议1:从U盘启动自定义代码,或者创建一个虚拟DOS软盘来启动DOS虚拟机(例如VMWare或VBox虚拟机)。
以下是一些教程:
-
http://www.codeproject.com/Articles/36907/How-to-develop-your-own-Boot-Loader
-
https://cs.au.dk/~架次/dopsys/osdev/
-
http://wiki.osdev.org/Rolling_Your_Own_Bootloader