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).
我正在用 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).