2009-10-24 11 views
6

Podczas wstawiania wbudowanego asemblera do funkcji w języku podobnym do języka C, jaka jest konwencja dotycząca rejestrów, których można używać na początku? Czy to kompilator jest odpowiedzialny za zapisanie wartości wszystkich rejestrów, które musi zapisać przed wejściem do bloku asm? Czy programista jest odpowiedzialny za przechowywanie wartości w tych rejestrach i ich przywracanie przed zamknięciem bloku asm? Czy istnieje typowa konwencja, czy też jest to ściśle związane z konkretną implementacją?Inline Asembler: Jakie rejestry zarysowania mogą być używane?

Odpowiedz

9

Zespół wbudowany jest, z definicji, specyficzny dla kompilatora.

Większość kompilatorów obsługujących wbudowany zestaw ma składnię, która pozwala wskazać, które rejestry są modyfikowane przez zespół. Kompilator może następnie zapisać i przywrócić te rejestry w razie potrzeby.

2

Możesz odczytać użycie rejestru w niektórych konwencjach dzwonienia here.

7

To jest bardzo specyficzny dla kompilatora. Jednakże, dla realistycznego przykładu, weźmy gcc na x86. Format jest:

asm (assembler template 
    : output operands    (optional) 
    : input operands    (optional) 
    : list of clobbered registers  (optional) 
    ); 

gdzie „lista niszczona rejestrów” jest mówisz kompilator, który rejestruje Twój kod jest używany.

Oto prosty kod kopia pamięć:

asm ("movl $count, %%ecx; 
     up: lodsl;  
     stosl; 
     loop up;" 
    :   /* no output */ 
    :"S"(src), "D"(dst) /* input */ 
    :"%ecx", "%eax"); /* clobbered list */  

Biorąc pod uwagę te wskazówki, gcc nie będzie używany EAX i ECX do innych rzeczy w bloku.

Więcej informacji here.

Powiązane problemy