Gd Inline Assembly ‘Nd’ contrainte

Je développe un petit kernel de jouet en C. Je suis sur le point d’avoir besoin de la saisie de l’utilisateur par le clavier. Jusqu’ici, j’ai implémenté inb utilisant le code suivant:

 static inline uint8_t inb(uint16_t port) { uint8_t ret; asm volatile("inb %1, %0" : "=a"(ret) : "Nd"(port)); return ret; } 

Je sais que la contrainte "=a" signifie al/ax/eax sera copié pour ret en sortie, mais je ne comprends toujours pas la contrainte "Nd" . Quelqu’un peut-il expliquer pourquoi cette contrainte est nécessaire? Ou pourquoi je ne peux pas simplement utiliser une contrainte de registre à usage général telle que "r" ou "b" ? Toute aide serait appréciée.

L’instruction in (renvoyer un octet) peut soit prendre une valeur immédiate de 8 bits en tant que numéro de port, soit un port spécifié dans le registre dx . Vous trouverez plus d’informations sur les instructions in dans la référence des instructions (syntaxe Intel). Les contraintes de la machine utilisée peuvent être trouvées dans les documents GCC . Si vous faites défiler jusqu’à la x86 family vous verrez:

 The d register 

N

 Unsigned 8-bit integer constant (for in and out instructions).