функция asm с c ++ - PullRequest
       2

функция asm с c ++

1 голос
/ 24 апреля 2020

Я хотел бы добавить метод в мой класс, используя язык ассемблера. Как мне это сделать? Пример:

main. cpp

Struct ex {
    int field1;
    asm_method(char*);
}

add.asm

asm_method: 
    //some asm code

Ответы [ 2 ]

3 голосов
/ 24 апреля 2020

Получите вывод 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 (я надеюсь).

2 голосов
/ 24 апреля 2020

Это зависит от вашей целевой платформы и компилятора / цепочки инструментов и, как правило, является слишком широким вопросом для StackOverflow.

Например, компилятор C ++ в цепочке инструментов G CC фактически генерирует сборку из C ++, а затем создает объектные файлы из этой сборки. Затем компоновщик связывает вместе несколько объектных файлов для создания модуля ELF.

Вы можете пропустить этап компиляции C ++ для одного объектного файла и напрямую записать файлы .asm.

Вы можете скомпилировать его так же, как вы компилируете. c: gcc myfile.S -o myfile.o.

Хотя вы должны учитывать платформу ABI, чтобы вы могли принимать аргументы функции и возвращать значения через правильные регистры. Платформа ABI также определяет соглашение о вызовах и какие регистры должны сохраняться при вызовах функций. Наконец, вам нужно создать правильные имена функций в соответствии с правилами искажения имен C ++ или использовать C правила именования (которые проще) и объявить вашу функцию extern "C".

Подробнее см. C ++ для связи ASM и для Linux ABI см. System V ABI .

Для Windows начните здесь: соглашения о вызовах и компиляция сборка в Visual Studio .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...