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 次 |
最近记录: |