Я разрабатываю маленькое игрушечное ядро на 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"
? Любая помощь будет оценена.