我正在尝试编写一个在C中打印字符串的函数。它用于启动加载程序,因此没有外部库或任何链接的内容。这是我的功能:< / p>
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
。
答案 0 :(得分:1)
好的,在一些有用的评论之后,我可能只是进行全面组装。像
这样的东西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组装,据我所知,它比GCC更适合编译16位程序。
答案 1 :(得分:0)
我认为你错过了这一点。问题不在于汇编代码;问题是“int 10”是一个BIOS
如果您已经启动到操作系统(例如Windows或Linux),那么您的x86 CPU将以“保护模式”运行;并且你可能无法从用户空间访问int 10 ...除非像Windows命令提示符那样为你模拟它。
就Linux /程序集编程而言,我强烈推荐这本书(免费,在线,非常好)的书:
Programming from the Ground Up, Jonathan Bartlett
感谢您澄清您正在编写“引导加载程序”。强烈建议1:从USB记忆棒启动自定义代码,或创建虚拟DOS软盘以启动DOS VM(例如VMWare或VBox VM)。
以下是一些教程: