2010-03-10 19 views
5

Al tratar de compilar mi proyecto, que utiliza algunas cabeceras de terceros, con MinGW 4.4, me encontré con el siguiente error:¿Qué significa '__asm ​​__ (". Previous");' ¿media?

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

me encontré con este código al final de uno de los encabezados incluidos:

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

Como no tengo ninguna experiencia en absoluto con las instrucciones del ensamblador en línea, busqué una explicación en el mismo, pero no pude encontrar la respuesta a mis dos preguntas básicas. ¿Qué hace __asm__(".previous"); de hecho y por qué alguien pondría esto al final de un archivo de cabecera.

Estas son las únicas instrucciones __asm__ en todo el proyecto. ¿Puedo borrarlos de forma segura? ¿O hay una forma de definir .previous para convertirlo en una pseudo-operación conocida?

¡Ilumíname, por favor!

Respuesta

4

es una directiva que le permite alternar entre dos secciones de duende. Es un acceso directo que permite archivos de ensamblaje más densos y le permite, por ejemplo, declarar datos inicializados dentro de una secuencia de código o viceversa.

Por ejemplo decir que tiene un archivo ensamblador con una sección de datos y un código.

Si quieres - en medio de una función - declarar una constante en el segmento de datos que puede utilizar la instrucción .previous así:

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 

Más información se puede encontrar en el manual de referencia:

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

+1

Dado que no hay instrucciones después de "__asm ​​__ (". Previous ");" en mi ejemplo de código, simplemente declara una nueva sección ".plc" y cambia un código vacío en ella. ¿Es esto correcto? Por lo tanto, eliminarlo no tendría ningún impacto en la aplicación compilada. – NullAndVoid