我正在用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).
以上就是c/c++开发分享GCC内联汇编’Nd’约束相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/541907.html