c++ - significado - ejecutar codigo c online
Usando encabezados C en código C++ en GNU. Error al incluir el ensamblaje en línea: restricción imposible en ''asm'' (2)
Consulte el manual de GCC (ensamblador en línea) para conocer el significado exacto de las restricciones para su máquina. Las versiones anteriores de GCC han sido notoriamente descuidadas en la verificación de las restricciones, tal vez le están mordiendo. Es extraño que gcc
y g++
(¿la misma versión?) Manejen el código de manera diferente, podría ser un error del compilador, pero lo consideraría solo después de que se hayan agotado todas las demás explicaciones.
Tengo uno raro. Estoy trabajando en un sistema integrado, utilizando los archivos de encabezado de proveedores. Estoy compilando los archivos usando GCC 4.6.3. Quiero usar C ++ para mi código, tengo un error que no puedo entender. Estoy ejecutando un programa de ejemplo de proveedor, y todo lo que he hecho es cambiar el nombre del archivo main.c a main.cpp. Como resultado, supongo que los archivos de cabecera están siendo interpretados por el compilador de C ++. Uno de ellos contiene las siguientes líneas:
__attribute__((naked)) static return_type signature /
{ /
__asm( /
"svc %0/n" /
"bx r14" : : "I" (number) : "r0" /
); /
}
Los archivos se compilan correctamente si el nombre del archivo es main.c, supongo que esto se debe a que el archivo está siendo procesado por el compilador de C. El error que obtengo si utilizo C ++ es
error: impossible constraint in ''asm''
Pero, de nuevo, no tengo ningún problema con el compilador de C. Necesito llamar a funciones que usan esta definición en archivos C ++. He considerado escribir funciones de envoltura que permanezcan en el lado c y vinculen con ellas, pero sería un verdadero dolor y menos eficiente. ¿Alguna sugerencia?
svc
también conocido como swi
es la instrucción de interrupción del software ARM / Thumb . Solo toma constantes, pero son diferentes de otras constantes de registro. Es decir, mov r0, #4096
. Debe utilizar el preprocesador y el pegado de token si desea especificar un inmediato. number
no puede ser una variable o registro .
#define syscall(number) __attribute__((naked)) static return_type signature /
{ /
__asm( /
"svc " #number "/n" /
"bx r14" : : : "r0" /
); /
}
trabajará. Nota: El #
es el preprocesador ''C'' de la cadena. También tenga en cuenta que es eficiente mirar el número SVC
como está en el I-CACHE
e inspeccionar requiere D-CACHE
. En general, siempre es constant
y el número de función se pasa en un registro para syscall más rápido.
El manual de gcc dice:
''I'' - Entero que es válido como un operando inmediato en una instrucción de procesamiento de datos. Es decir, un entero en el rango de 0 a 255 rotado por un múltiplo de 2
Esto es típico de los operandos de procesamiento de datos: inmediato , sección A5.1.3 del ARM ARM. Los operandos SVC
son 8-bits fijos en modo pulgar o 24-bits fijos en modo ARM. Tal vez sea posible con alguna otra restricción que desconozco, pero al menos la cadena del preprocesador funcionará siempre que se pase una constante numérica a la macro.
Supongo que es una suerte que esto funcionó de gcc
y desafortunado que g++
no lo hizo. Puede obtener más información al usar -S
y mirar (y publicar) la salida usando ambas herramientas.
Editar: Tu código parece funcionar con gcc-4.7.2
, pero el number
es un const int
local en mi caso, el uso del number
tal vez sea el problema. Quizás tiene un cambio semántico sutil de ''C'' a ''C ++''.