GCC内联汇编’Nd’约束

我正在用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指令的更多信息,请参见指令参考 (Intel语法)。 使用的机器约束可以在GCC文档中找到。 如果向下滚动到x86 family您将看到:

d

 The d register 

ñ

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