C 内联汇编 Int 0x10
C Inline Asm Int 0x10
我正在尝试编写一个函数,用 C 语言在屏幕上打印字符串。它用于引导加载程序,因此没有外部库或任何链接。这是我的函数:
void printString(const char* pStr) {
while(*pStr) {
__asm__ __volatile__ (
"movb 0x0e, %%ah\n"
"movb %[c], %%al\n"
"int [=10=]x10\n"
:
: [c] "r" (*pStr)
: "ax"
);
++pStr;
}
}
当我 运行 执行此操作时,我的 VM 中没有出现任何错误。它只是坐在那里,光标位于屏幕的左上角。有什么想法吗?如果有人认为有帮助,我可以制作一个 objdump -d
。
好的,在一些有用的评论之后,我可能会进行完整的组装。像
Print:
push %ax
movb [=10=]x0E, %ah # Set interrupt code
movb [=10=]x00, %bh # Set page #
.loop:
lodsb # Load next char
test %al, %al # Check for [=10=]
je .done
int [=10=]x10 # Call interrupt
jmp .loop
.done:
pop %ax
ret
那应该是 16 位实模式兼容的,可以用 GAS 汇编,据我了解,GAS 在编译 16 位程序方面比 GCC 更好。
我认为你没有抓住重点。问题不在于您的汇编代码;问题是 "int 10" 是一个 BIOS
如果您已经启动到 OS(例如 Windows 或 Linux),那么您的 x86 CPU 在 "protected mode";并且您可能无法从用户 space 访问 int 10 ...除非像 Windows 命令提示符之类的东西为您模拟它。
就一般的Linux/assembly编程而言,我强烈推荐这个(免费,在线,非常好) 书:
Programming from the Ground Up, Jonathan Bartlett
感谢您澄清您正在撰写 "boot loader"。强烈建议 1:从 USB 记忆棒启动您的自定义代码,或创建虚拟 DOS 软盘来启动 DOS VM(例如 VMWare 或 VBox VM)。
这里有一些教程:
我正在尝试编写一个函数,用 C 语言在屏幕上打印字符串。它用于引导加载程序,因此没有外部库或任何链接。这是我的函数:
void printString(const char* pStr) {
while(*pStr) {
__asm__ __volatile__ (
"movb 0x0e, %%ah\n"
"movb %[c], %%al\n"
"int [=10=]x10\n"
:
: [c] "r" (*pStr)
: "ax"
);
++pStr;
}
}
当我 运行 执行此操作时,我的 VM 中没有出现任何错误。它只是坐在那里,光标位于屏幕的左上角。有什么想法吗?如果有人认为有帮助,我可以制作一个 objdump -d
。
好的,在一些有用的评论之后,我可能会进行完整的组装。像
Print:
push %ax
movb [=10=]x0E, %ah # Set interrupt code
movb [=10=]x00, %bh # Set page #
.loop:
lodsb # Load next char
test %al, %al # Check for [=10=]
je .done
int [=10=]x10 # Call interrupt
jmp .loop
.done:
pop %ax
ret
那应该是 16 位实模式兼容的,可以用 GAS 汇编,据我了解,GAS 在编译 16 位程序方面比 GCC 更好。
我认为你没有抓住重点。问题不在于您的汇编代码;问题是 "int 10" 是一个 BIOS
如果您已经启动到 OS(例如 Windows 或 Linux),那么您的 x86 CPU 在 "protected mode";并且您可能无法从用户 space 访问 int 10 ...除非像 Windows 命令提示符之类的东西为您模拟它。
就一般的Linux/assembly编程而言,我强烈推荐这个(免费,在线,非常好) 书:
Programming from the Ground Up, Jonathan Bartlett
感谢您澄清您正在撰写 "boot loader"。强烈建议 1:从 USB 记忆棒启动您的自定义代码,或创建虚拟 DOS 软盘来启动 DOS VM(例如 VMWare 或 VBox VM)。
这里有一些教程: