Получите вывод asm, который генерирует компилятор для не встроенного определения функции-члена C ++, и используйте его в качестве отправной точки для исходного файла asm. Это работает для любого ISA с любым компилятором, который может выдавать действительный asm (который является большинством из них, хотя очевидно, что MSV C испускает кучу лишних ненужных файлов, которые вам нужно удалить.)
Пример с G CC (для x86-64 GNU / Linux, но работает где угодно)
Также работает с лязгом.
например, g++ -O3 -fverbose-asm -masm=intel -S -o foo_func.S foo.cpp
( Как убрать "шум" из вывода сборки GCC / clang? )
Этот .S
файл теперь является вашим исходным файлом asm. Удалите сгенерированные компилятором строки инструкций и вставьте свои собственные.
Очевидно, вам нужно знать соглашение о вызовах и тому подобное (например, для x86 см. https://www.agner.org/optimize/#manuals для руководства по соглашению о вызовах). ), но это заставит компилятор выполнить искажение имени для вас, для этого указанного c ABI целевой платформы.
struct ex { // lower case struct not Struct
int field1;
void *asm_method(char*); // methods need a return type
}; // struct declarations end with a ;
void *ex::asm_method(char*) {
return this; // easy way to find out what register `this` is passed in.
}
компилируется следующим образом для x86-64 System V, с g++ -O3
( Godbolt с Linux g cc и Windows MSV C)
# x86-64 System V: GNU/Linux g++ -O3
# This is GAS syntax
.intel_syntax noprefix
.text # .text section is already the default at top of file
.align 2
.p2align 4 # aligning functions by 16 bytes is typical
.globl _ZN2ex10asm_methodEPc # the symbol is global, not private to this file
.type _ZN2ex10asm_methodEPc, @function # (optional) and it's a function.
_ZN2ex10asm_methodEPc: # a label defines the symbol
.cfi_startproc
## YOUR CODE GOES HERE ##
## RSP-8 is aligned by 16 in x86-64 SysV and Windows ##
mov rax, rdi # copy first arg (this) to return-value register.
ret # pop into program counter
.cfi_endproc
.size _ZN2ex10asm_methodEPc, .-_ZN2ex10asm_methodEPc # maybe non-optional for dynamic linking
Вероятно, можно опустить стек .cfi
размотайте директивы из рукописного asm для листовых функций, так как вы не собираетесь выбрасывать исключения C ++ из рукописного asm (я надеюсь).