asm函数与c++

我想使用assebler语言在我的类中添加方法. 我怎样才能做到这一点?

main.cpp

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

添加.asm

asm_method: 
    //some asm code

解决方案:

获取编译器为C++成员函数的非内联定义生成的asm输出,并将其作为asm源文件的起点。 这适用于任何ISA和任何能发出有效的asm的编译器(大多数编译器都是这样的,不过MSVC显然会发出一堆额外的垃圾,你必须将其删除)。


使用 GCC 的例子 (适用于 x86-64 GNULinux,但在任何地方都可以使用)

也可与clang配合使用。

例如 g++ -O3 -fverbose-asm -masm=intel -S -o foo_func.S foo.cpp (如何去除GCCclang汇编输出中的 “噪音”?)

.S 文件现在是你的asm源文件。 删除编译器生成的指令行,插入你自己的指令。

很明显,你需要知道调用约定和其他类似的东西(例如,对于x86,请参见 https:/www.agner.orgoptimize#manuals 以获得调用惯例指南),但这将使编译器为你做名称的调整,为特定的目标平台的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系统V,编译如下,并使用 g++ -O3 (Godbolt 使用Linux gcc和Windows MSVC)

# 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 Stack-unwind指令从手写的asm中解开叶子函数,因为你不会从手写的asm中抛出C++异常(我希望)。

给TA打赏
共{{data.count}}人
人已打赏
未分类

检查某点是否在半径内的函数。

2022-9-9 0:44:37

未分类

如何将http模块从angular 4改成angular 7?

2022-9-9 0:44:39

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索