2010-03-10 16 views
5

Podczas próby kompilacji mojego projektu, który używa niektórych nagłówków stron trzecich, z mingw 4.4, I napotkał następujący błąd:Co oznacza "__asm ​​__ (". Poprzedni ");" oznaczać?

Assembler messages:
Error: junk at end of line, first unrecognized character is '"'
Error: unknown pseudo-op: '.previous'

znalazłem ten kod na końcu jednej z zawartych nagłówkami:

__asm__(".section \".plc\""); 
__asm__(".previous"); 

Ponieważ nie mam żadnego doświadczenia z wbudowanymi instrukcjami asemblera, szukałem w nim wyjaśnienia, ale nie mogłem znaleźć odpowiedzi na moje dwa podstawowe pytania. Co właściwie robi __asm__(".previous"); i dlaczego ktokolwiek umieściłby to na końcu pliku nagłówkowego.

To są jedyne instrukcje __asm__ w całym projekcie. Czy mogę bezpiecznie je usunąć? Czy istnieje sposób zdefiniowania .previous, aby uczynić go znanym pseudo-op?

Oświeć mnie, proszę!

Odpowiedz

4

.previous to dyrektywa, która umożliwia zamianę między dwiema elfimi sekcjami. Jest to skrót umożliwiający gęstsze pliki zespołów i pozwala na przykład zadeklarować zainicjowane dane w strumieniu kodu lub odwrotnie.

Załóżmy na przykład, że masz plik asemblera z sekcją danych i kodu.

Jeśli chcesz - w środku funkcji - deklarują stałe w segmencie danych można użyć .previous oświadczenie takiego:

nop   // some code 

.previous  // swaps current section (code) with previous section (data) 

MyConstant: 
    .word 0x0001 // some data 

.previous  // swaps curent section (data) with previous section (code) 

    nop   // more code 

Więcej informacji można znaleźć w podręczniku:

http://sourceware.org/binutils/docs-2.19/as/Previous.html#Previous

+1

Ponieważ nie są jakieś instrukcje po "__ __asm ​​(" poprzedni ")."; w moim przykładzie kodu, po prostu deklaruje nową sekcję ".plc" i zamienia w nią pusty kod. Czy to jest poprawne? Usunięcie go nie miałoby więc żadnego wpływu na skompilowaną aplikację. – NullAndVoid

Powiązane problemy