我正在開發一個C語言的小玩具內核。我現在需要從鍵盤獲得用戶輸入。到目前爲止,我一直在使用下面的代碼來實現inb
:GCC內嵌組件'Nd'約束
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"
?任何幫助,將不勝感激。
你瞄準16位代碼? –
我的目標是32位代碼,因爲我使用GRUB將我的內核加載到保護模式。 –