GCC 内联汇编 'Nd' 约束

GCC Inline Assembly 'Nd' constraint

我正在用 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" 这样的通用寄存器约束?任何帮助将不胜感激。

in指令(返回一个字节)既可以取立即数8位值作为端口号,也可以取dx寄存器中指定的端口。有关 in 指令的更多信息,请参阅 instruction reference (Intel syntax) . The machine constraints being used can be found in the GCC docs 。如果向下滚动到 x86 family,您会看到:

d

The d register

N

Unsigned 8-bit integer constant (for in and out instructions).