2014-02-08 3 views
5

Kann mir jemand sagen, was diese beiden Variablen funktionieren int rsrc, rdst;? ODER erkläre ich den folgenden Code für mich Statement für Statement?Ein strccy gcc Inline Assembly Code

static inline char * asm_strcpy(char *dst, char *src) { 
    int rsrc, rdst; 
    __asm__ __volatile__(
     "1: \tlodsb\n\t;" 
     "stosb\n\t;" 
     "testb %%al,%%al\n\t;" 
     "jne 1b;" 
     : "=&S" (rsrc), "=&D" (rdst) 
     : "0" (src),"1" (dst) 
     ); 
    return dst; 
} 
+0

'strcpy' Kopiert Zeichen von einer Zeichenfolge in eine andere. src = Quelle, dst = Ziel, r = register (?) – Palec

+0

'=' und '&' sind [Constraint Modifier] (http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers). 'S' ist' si' Register und 'D' ist' di' Register auf Intel 386. Diese beiden sind [maschinenabhängige Einschränkungen] (http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html) # Maschinen-Constraints). – Palec

+0

BTW - die "&" Einschränkungen für 'early-clobber outputs' machen hier nichts, da Sie diese mit den Eingängen "0", "1" aliasiert haben. Sie könnten die Eingaben weglassen und die Ausgaben mit "+ S" (src), "+ D" (dst) ersetzen. "% eax" muss der Clobber-Liste hinzugefügt werden, und es wäre technisch korrekter, der Clobber-Liste auch "Speicher" hinzuzufügen. –

Antwort

3

rsrc und rdst werden als Platzhalter Variablen verwendet und später wird der Compiler angewiesen, sie in den Registern zu optimieren, indem genau SI und DI. Das gleiche passiert mit src und dst, aber sie werden als Eingabe für den Assembly-Code verwendet, während rsrc und rdst seine verworfene Ausgabe sind.

der Assembler-Code ist ziemlich trivial:

1: 
    lodsb ; loads byte at *SI to register AL, increments SI 
    stosb ; stores byte at *DI from register AL, increments DI 
    testb AL,AL ; sets flags based on value in AL 
    jne 1: ; repeat if AL is non zero 

hierfür alle korrekt der Richtungs-Flag zu betreiben klar sein sollte; gibt es keine Faustregel gilt: weil es während des gesamten Programms auf Aufrufkonvention oder kann frei sein abhängen sollte gemacht DF Agnostiker werden

wenn der obige Code geändert, sollte Folgendes es wickeln:

PUSHF 
CLD 
... 
POPF 
+0

+1 für genau gute Erklärung. –

+0

Vielen Dank! Ich verstehe jetzt und wünschte, andere könnten von diesem typischen Beispiel lernen. – Jianchen

+0

können Sie mir helfen, dieses Problem zu sehen? http://stackoverflow.com/questions/21642383/substring-c-inline-assembly-code – Jianchen