Esta es mi manera de definir una función en el montaje, esto no necesita tener un ensamblador-archivo separado, ni se necesita para escapar de cada nueva línea. Puede copiar el contenido de los archivos de ensamblaje en el literal de cadena. Nota: El raw multiline string literal es una característica de C++ 11 (también etiquetó C++). Esto es útil, si desea compilar todo en un solo .c
-/.cpp
-file.
extern"C" int rand_byte(void);
asm (R"(
.globl rand_byte
rand_byte:
call rand
and eax, 255
ret
)");
Solo se puede usar una instrucción básica de ensamblaje sin parámetros adicionales en el alcance global. Al usar GCC o Clang y un procesador de brazo, puede usar [[gnu::naked]]
/__attribute__((naked))
.
[[gnu::naked]]
int rand_byte(void) {
asm volatile (R"(
push {lr}
bl rand
and r0, #255
pop {pc}
)");
};
La primera manera siempre permite definir las funciones desnudas. Esto también ayuda a crear un código más portátil.
extern"C" int _cdecl rand_byte(void);
#if defined __x86__
// NOTE: the names are decorated with a '_' on windows 32-bit
// You can use extern"C" int _cdecl rand_byte() asm("rand_byte");
// to make the asm symbol name always be rand_byte, without an _
asm volatile (R"(
.globl _rand_byte
_rand_byte:
call rand
and eax, 255
ret
)");
#elif defined __x86_64__
asm volatile (R"(
.globl rand_byte
rand_byte:
call rand
and rax, 255 # eax works here, too. x86-32 and -64 could share the same source.
ret
)");
#elif defined __arm__
asm (R"(
.global rand_byte
rand_byte:
push {lr}
bl rand
and r0, #255
pop {pc}
)");
#else
#error There is no code for your platform yet...
#endif
Probar y hacer esto más específico - es bastante amplio y vago tal como está: de lo contrario, probablemente se cerrará como "no es una pregunta real". También recuerde el consejo anterior en sus preguntas anteriores sobre el uso de 'gcc -S ...' para producir plantillas asm, etc. –
gcc en la misma línea tiene '__tributo__ ((desnudo))' pero no para x86 :( –