【发布时间】:2015-12-23 20:46:33
【问题描述】:
我正在用 C 语言开发一个小型玩具内核。我需要从键盘获取用户输入。到目前为止,我已经使用以下代码实现了inb:
static inline uint8_t inb(uint16_t port) {
uint8_t ret;
asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port));
return ret;
}
我知道"=a" 约束意味着al/ax/eax 将被复制到ret 作为输出,但我仍然对"Nd" 约束感到困惑。谁能提供一些关于为什么这个约束是必要的见解?或者为什么我不能只使用像"r" 或"b" 这样的通用寄存器约束?任何帮助将不胜感激。
【问题讨论】:
-
您的目标是 16 位代码吗?
-
我的目标是 32 位代码,因为我使用 GRUB 将我的内核加载到保护模式。
标签: gcc x86 kernel inline-assembly osdev