#include <tigcclib.h> void _main(void) { ulint buffer=0; asm volatile(" .set ngetchx,0x51 |une constante : le n° de la RomCall move.l #0xC8,%%a0 |la jumpTable move.l ngetchx*4(%%a0),%%a0 |j'obtiens le même résultat en faisant : move.l 324(%%a0),%%a0 move.l %%a0,%[buffer] |on copie a0 dans la variable C buffer " :[buffer] "=g" (buffer)::"a0"); |on déclare [buffer] et le registre a0 comme étant détruit clrscr(); printf("0x%lX",buffer); // un printf pour voir le contenu de buffer ngetchx(); }
Bon le problème c'est que buffer reste à 0, j'en déduis donc que a0 reste à 0 mais pourquoi?
sachant que ce code fonctionne
move.l #0x123456,%%a0 move.l %%a0,%[buffer]
Comment ce fait-il que ce truc ne marche pas?
Le code assembleur généré par TIGCC (qui me semble correct) donne (en coupant le début):
.LC0: .ascii "0x%lX\0" #NO_APP .section .text.__main,"x" .even .globl __main __main: move.l %d3,-(%sp) #APP .set ngetchx,0x51 move.l #0xC8,%a0 move.l ngetchx*4(%a0),%a0 move.l %a0,%d3 #NO_APP jbsr clrscr move.l %d3,-(%sp) pea .LC0 jbsr printf #APP .xdef __ref_all___set_file_in_use_bit #NO_APP move.l 324(%a5),%a0 jbsr (%a0) addq.l #8,%sp move.l (%sp)+,%d3 rts