我正在用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"
这样的通用寄存器约束?任何帮助将不胜感激。
答案 0 :(得分:6)
in
指令(返回一个字节)可以将立即的8位值作为端口号,或者在dx
寄存器中指定的端口。有关in
指令的更多信息,请参阅instruction reference(英特尔语法)。可以在GCC docs中找到正在使用的机器约束。如果向下滚动到x86 family
,您会看到:
d
<磷>氮The d register
Unsigned 8-bit integer constant (for in and out instructions).