To jest mój sposób zdefiniować funkcję w montażu, nie trzeba mieć oddzielny plik asemblera nie trzeba uciekać każdą linią. Możesz po prostu skopiować zawartość plików zespołu do łańcucha literałowego. Uwaga: The raw multiline string literal jest funkcją C++ 11 (również oznaczono C++). Jest to przydatne, jeśli chcesz skompilować wszystko w jednym pliku-.c
-/.cpp
.
extern"C" int rand_byte(void);
asm (R"(
.globl rand_byte
rand_byte:
call rand
and eax, 255
ret
)");
Można użyć tylko podstawowej instrukcji złożenia bez dodatkowych parametrów w zasięgu globalnym. Korzystając z GCC lub Clang i procesora ręcznego, można używać [[gnu::naked]]
/__attribute__((naked))
.
[[gnu::naked]]
int rand_byte(void) {
asm volatile (R"(
push {lr}
bl rand
and r0, #255
pop {pc}
)");
};
Pierwszy sposób zawsze pozwala na zdefiniowanie nagich funkcji. Pomaga to również w tworzeniu bardziej przenośnego kodu.
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
Spróbuj i ułóż to bardziej szczegółowo - jest raczej szeroki i niejasny w swojej formie - w przeciwnym razie prawdopodobnie zostanie zamknięty jako "nie jest to prawdziwe pytanie". Przypomnij sobie także wcześniejszą radę we wcześniejszych pytaniach o używanie 'gcc -S ...' do tworzenia szablonów asm itd. –
gcc w tym samym stylu ma '__attribute __ ((naga))' ale nie dla x86 :( –