[Kos-dev] mettez "Nd" au lieu de "d" pour out et in dans les asm !
Christophe Avoinne
kos-dev@enix.org
Thu, 14 Sep 2000 23:58:37 +0200
Salut,
Je ne veux plus voir ça, par exemple, dans des codes compilés :
mov $0x20,%edx
mov $0x20,%al
out %al,%dx
alors qu'un :
mov $0x20,%al
out %al,$0x20
est large suffisant, et libère le registre %edx.
Et comment faire pour obtenir ça ?
C'est très simple :
extern inline void outb (char value,int index) { asm volatile ("out
%0,%1" : : "a"(value),"Nd"(index)); }
extern inline void outw (short value,int index) { asm volatile ("out
%0,%1" : : "a"(value),"Nd"(index)); }
extern inline void outl (int value,int index) { asm volatile ("out
%0,%1" : : "a"(value),"Nd"(index)); }
extern inline char inb (int index) { char result; asm volatile ("in
%1,%0" : : "a"(value),"Nd"(index)); }
extern inline short inw (int index) { short result; asm volatile ("in
%1,%0" : : "a"(value),"Nd"(index)); }
extern inline int inl (int index) { int result; asm volatile ("in %1,%0"
: : "a"(value),"Nd"(index)); }
J'ai choisi "in" et non "inb","inw" ou "inl" pour montrer que ce n'est
pas necessaire. C'est comme pour "mov %eax,%edx" au lieu de "movl
%eax,%edx", le "l" final est superflu.
La contrainte "N" est d'abord essayé pour %1 avec la valeur retournée
par 'index', si cette dernière est immédiate et comprise entre 0 et
255, on la substitue à %1, sinon c'est la contrainte "d" qui est choisi
en placeant la valeur retournée par 'index' dans le registre %edx, puis
on substitue %edx à %1.
C'est simple, ce n'est pas cher, c'est élégant et ça optimise en
fonction de la valeur retourné par 'index'.
Amicalement,
Hlide.