[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.