25Fermer27
Kevin KoflerLe 14/06/2004 à 20:00
Pollux
:
Flanker :
oui, avec de l'assembleur inline tongue
size_of_app(void * certificate) {
asm("
move.l 4(a7),a0 ; pour mettre l'argument *certificate dans a0
<ici tu remets tout le code> ")}

couic
asm("size_of_app:
  move.l 4(a7),a0
  ...
  rts");

int __attribute__((stkparm)) size_of_app(void *certificate);


(pour te donner une liste de ce qui peut foirer :
* le code C peut très bien être compilé en regparm, et à ce moment-là ça va foirer
* le compilateur peut très bien avoir envie de mettre des choses sur la pile avant d'exécuter ton asm()
* le compilateur peut très bien sauvegarder des choses temporairement dans a0, tu n'as pas signalé que tu le détruisais
* tu n'as aucune garantie que ce que tu renvoies dans d0 ne sera pas détruit par le code rajouté par le compilo * le compilateur C peut avoir envie d'inliner ta fonction, et ça va foirer méchamment)

Je rajoute:
* Il manque les % devant les registres.
* Le code de Flanker et le tien ne sont pas optimisés, autant passer le paramètre directement dans %a0:
asm("size_of_app:
  ...
  rts");

int __attribute__((stkparm)) size_of_app(void *certificate asm("a0"));