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"?任何帮助,将不胜感激.
的in指令(返回一个字节)既可以采取一个8位立即值作为端口号,或在指定的端口dx寄存器.有关该in指令的更多信息,请参见指令参考 (英特尔语法).使用的机器约束可以在GCC文档中找到.如果向下滚动到x86 family您将看到:
d
Run Code Online (Sandbox Code Playgroud)The d registerñ
Run Code Online (Sandbox Code Playgroud)Unsigned 8-bit integer constant (for in and out instructions).
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |