2010-11-29 4 views
3

Ich habe einige Refactoring bei c167 plattformspezifischen Code und ich stolperte über eine Inline-Montage Problem.GNU Inline Assembly Problem

zurück Code:

asm volatile (" 
      extp #pag:%0, #3 
      mov r4, pof:%0 @ R4 = g_nRcvBufCount 
      sub r4, #1  @ R4 = R4 - 1 
      mov pof:%0, r4 @ g_nRcvBufCount = R4" 
     : "=m" (g_nRcvBufCount) 
     : 
     : "r4" 
); 

[

Grundsätzlich ist dieser Code macht eine atomare Abnahme der "g_nRcvBufCount" variable

"extp" Anweisung, die "Seite" der "g_nRcvBufCount" Variable nimmt und die Anzahl der folgenden atomaren Ausdrücke (3 in diesem Fall)

]

Strom - nicht Kompilieren von Code:

asm volatile (" 
      extp #pag:%0, #3 
      mov r4, pof:%0 @ R4 = cfg->g_nRcvBufCount 
      sub r4, #1  @ R4 = R4 - 1 
      mov pof:%0, r4 @ cfg->g_nRcvBufCount = R4" 
     : "=m" (cfg->g_nRcvBufCount) 
     : 
     : "r4" 
); 

wo cfg ein Zeiger auf eine Struktur ist, die "g_nRcvBufCount" Variable enthält.

struct { 
    ... 
    unsigned short g_nRcvBufCount; 
    ... 
}cfg; 

Die Fehler in der Zusammenstellung erhalten sind:

test.c:1124:Warning:Missing operand value assumed absolute 0. 
test.c:1124:extp #pag:[r2+#66],#3: trailing chars after expression  
test.c:1125:Warning:Missing operand value assumed absolute 0. 
test.c:1125:mov r4,pof:[r2+#66]: trailing chars after expression 
test.c:1127:Warning:Missing operand value assumed absolute 0. 
test.c:1127:mov pof:[r2+#66],r4: trailing chars after expression 

Irgendwelche Hinweise darüber, wie diese Arbeit sind willkommen zu machen. Auch eine x86-Version (der Inline-Assembly) zum Zugriff auf Variablen, die in einer C/C++ - Struktur definiert sind, wäre hilfreich. Die Dokumentation des GNU Inline Assemblers, die das "= m" Schlüsselwort erklärt, ist ebenfalls nützlich.

Dank im Voraus,

Iulian

Antwort

2

Blick haben:

extp #pag:[r2+#66],#3 

Anscheinend ist der #pag: Sache ist mit einem Register oder absolute Adresse, nachdem sie gültig ist, aber nicht mit einem komplexeren Ausdruck, der bereits einen Offset wie [r2+#66] enthält. Sie müssen möglicherweise auf ein "r"-Argument umschalten, das die -Adressecfg->g_nRcvBufCount anstelle eines "m"-Arguments enthält, das darauf verweist.

Wenn dies der Fall ist, beachten Sie, dass der ursprüngliche Code war bogus zu beginnen, und nur passiert, weil gcc beschlossen, eine einfache Adresse Ausdruck ersetzen, die in der ASM arbeitete.

+0

Danke für die zusätzlichen Informationen. – INS

1

von ibiblio

"m": Ein Speicheroperand wird erlaubt, mit jeder Art von Adresse, die die Maschine im Allgemeinen unterstützt.

über "Fehler" - das sind "nur" Warnungen - versuchen Sie, eine kleine .c-Datei mit dieser Assembly zu erstellen und zu zerlegen und sehen Sie, wie objdump sie ausgibt. es könnte Ihnen Ahnung, wie Sie den Code bearbeiten nicht diese Warnungen

in der Warnmeldung auf der asm
+0

Vielen Dank für Ihre Informationen und Vorschläge. – INS