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
Danke für die zusätzlichen Informationen. – INS