questo è il mio modo per definire una funzione in assembly, questo non ha bisogno di avere un assemblatore-file separato e non è necessario fuggire ogni nuova riga. Puoi semplicemente copiare il contenuto dei file di assembly nella stringa letterale. Nota:raw multiline string literal è una funzionalità C++ 11 (anche codificata C++). Questo è utile se vuoi compilare tutto in un unico file .c
-/.cpp
.
extern"C" int rand_byte(void);
asm (R"(
.globl rand_byte
rand_byte:
call rand
and eax, 255
ret
)");
È possibile utilizzare solo una dichiarazione di assieme di base senza parametri aggiuntivi nell'ambito globale. Quando si utilizza GCC o Clang e un processore di braccio, è possibile utilizzare [[gnu::naked]]
/__attribute__((naked))
.
[[gnu::naked]]
int rand_byte(void) {
asm volatile (R"(
push {lr}
bl rand
and r0, #255
pop {pc}
)");
};
Il primo modo consente sempre di definire le funzioni nude. Questo aiuta anche a rendere più portatile il codice.
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
Provare e rendere questo più specifico - è piuttosto ampio e vago così com'è - altrimenti sarà probabilmente chiuso come "non è una vera domanda". Ricorda anche il precedente consiglio nelle tue precedenti domande sull'uso di 'gcc -S ...' per produrre modelli asm ecc. –
gcc nella stessa vena ha '__attribute __ ((nudo))' ma non per x86 :( –