GNU Inline shromáždění problém

hlasů
3

Trochu jsem refaktorováním na C167 specifický kód platformě a narazil jsem na montážní problém inline.

Předchozí kód:

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

[

V podstatě tento kód dělá atomové úbytku „g_nRcvBufCount“ proměnné

„Extp“ Instrukce vezme „strana“ v „g_nRcvBufCount“ proměnné a počet atomových výrazů, které následují (3 v tomto případě)

]

Proud - není kompilaci kód:

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

kde CFG je ukazatel na strukturu obsahující „g_nRcvBufCount“ proměnné.

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

Chyby přijaté v kompilaci jsou:

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

Jakékoli narážky o tom, jak, aby to fungovalo, jsou vítány. Také verze x86 (inline sestavy) o tom, jak přistupovat k proměnné definované v C / C ++ konstrukce by mohla být užitečná. Dokumentace GNU inline assembler vysvětlovat, co znamená „= m“ klíčové slovo dělá, je také užitečné.

Díky předem,

Iulian

Položena 29/11/2010 v 13:50
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Podívejte se na ASM v varovná zpráva:

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

Zřejmě #pag:to je platný do rejstříku nebo absolutní adresy po něm, ale ne s složitějšího projevu, která již obsahuje posun podobně [r2+#66]. Možná budete muset přepnout na použití "r"argumentu, který obsahuje adresy cfg->g_nRcvBufCount namísto "m"tvrzení odkazující ji.

Je-li to váš případ, na vědomí, že původní kód byl falešný začít, a to pouze se stalo v práci, protože gcc rozhodla nahradit jednoduchou adresou výraz, který pracoval v ASM.

Odpovězeno 29/11/2010 v 14:58
zdroj uživatelem

hlasů
1

od Ibiblio

„M“: Paměťová operand je povoleno, s jakoukoliv adresu, že stroj podporuje obecně.

o „chyby“ - jsou to „jen“ varování - snaží udělat malou .c soubor s touto sestavou a rozebrat a podívat se, jak objdump odešle ji. to by vám ponětí o tom, jak upravit svůj kód nebude mít tato varování

Odpovězeno 29/11/2010 v 14:12
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more