Wstawki asemblerowe
Wczesne nadpisywanie wyjścia

Jeżeli tak jak w kodzie poniżej używamy rejestrów wyjściowych do obliczeń mogą wystąpić problemy

int x=2, y=3, result;
asm( "movl %1, %0;"  
     "addl %2, %0;"
    : "=r"(result)     
    : "r"(x),           
      "r"(y)            
    : );  
Optymalizując wykorzystanie rejestrów kompilator może umieścić y w rejestrze wyjściowym i wtedy pierwsza linia kodu nadpisze tą wartość powodując otrzymanie błędnego wyniku.

Wyjściem jest poinformowanie kompilatora, że rejestr wyjściowy jest wcześnie nadpisywany i w takim razie nie powinien umieszczać w nim danych wejściowych. W tym celu używamy modyfikatora &

int x=2, y=3, result;
asm( "movl %1, %0;"  
     "addl %2, %0;"
    : "=&r"(result)     
    : "r"(x),           
      "r"(y)                       
);  

Należy nie nadużywać tego modyfikatora gdyż może to uniemożliwić optymalizację kodu.


Tomasz Kapela, Kraków 2011-2020