2010-11-29 3 views
3

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:

instruction
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" 
); 

[

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

Répondre

2

Regardez l'asm dans le message d'avertissement:

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

Apparemment, la chose #pag: est valide avec un registre ou l'adresse absolue après, mais pas avec une expression plus complexe contenant déjà un décalage comme [r2+#66]. Vous devrez peut-être passer à l'aide d'un argument "r" contenant l'adresse decfg->g_nRcvBufCount au lieu d'un argument "m" le référençant. Si tel est le cas, notez que le code original était bogus pour commencer, et ne fonctionnait que parce que gcc a décidé de substituer une expression d'adresse simple qui a fonctionné dans l'asm.

+0

Merci pour les informations supplementaires. – INS

1

de ibiblio

"m": un opérande de mémoire est autorisée, à tout type d'adresse que la machine supporte en général. À propos des "erreurs" - ce sont des avertissements "seulement" - essayez de faire un petit fichier .c avec cet assemblage et désassemblez-le et regardez comment objdump le sort. il pourrait vous donner la moindre idée sur la façon de modifier votre code pour ne pas avoir ces avertissements

+0

Nous vous remercions de vos informations et suggestions. – INS