GCC Inline Assembly' Nd'约束

时间:2015-09-25 23:26:32

标签: c gcc assembly kernel inline

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

1 个答案:

答案 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).