GCC内联汇编'Nd'约束

Mic*_*row 4 x86 gcc kernel inline-assembly osdev

我正在用C开发一个小玩具内核.我需要从键盘获取用户输入.到目前为止,我已inb使用以下代码实现:

static inline uint8_t inb(uint16_t port) {
     uint8_t ret;
     asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port));
     return ret;
}
Run Code Online (Sandbox Code Playgroud)

我知道"=a"约束意味着al/ax/eax将被复制ret为输出,但我仍然对"Nd"约束感到困惑.谁能提供一些有关为什么需要这种约束的见解?或者为什么我不能只使用通用寄存器约束"r""b"?任何帮助,将不胜感激.

Mic*_*tch 6

in指令(返回一个字节)既可以采取一个8位立即值作为端口号,或在指定的端口dx寄存器.有关该in指令的更多信息,请参见指令参考 (英特尔语法).使用的机器约束可以在GCC文档中找到.如果向下滚动到x86 family您将看到:

d

The d register
Run Code Online (Sandbox Code Playgroud)

ñ

Unsigned 8-bit integer constant (for in and out instructions). 
Run Code Online (Sandbox Code Playgroud)