J'ai fait un refactoring à c167 code spécifique à la plate-forme et je suis tombé sur un problème d'assemblage en ligne.GNU problème d'assemblage en ligne
Code précédent:
instructionasm 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"
);
[
Fondamentalement, ce code fait un décrément atomique "g_nRcvBufCount variable"
"de EXTP" prend la variable "page" de la "g_nRcvBufCount" et le nombre d'expressions atomiques qui suivent (3 dans ce cas)
]
actuelle - Code non compilation:
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"
);
où CFG est un pointeur sur une structure contenant la variable "g_nRcvBufCount".
struct {
...
unsigned short g_nRcvBufCount;
...
}cfg;
Les erreurs reçues dans la compilation sont:
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
Les conseils sur la façon de faire ce travail sont les bienvenus. Une version x86 (de l'assemblage inline) sur la façon d'accéder aux variables définies dans une structure C/C++ serait également utile. La documentation de l'assembleur en ligne GNU expliquant le mot clé "= m" est également utile.
Merci à l'avance,
Iulian
Merci pour les informations supplementaires. – INS