相关疑难解决方法(0)

如何从GCC /铿锵声组件输出中消除"噪音"?

我想检查boost::variant在我的代码中应用的程序集输出,以便查看哪些中间调用被优化掉了.

当我编译以下示例(使用GCC 5.3 g++ -O3 -std=c++14 -S)时,似乎编译器优化了所有内容并直接返回100:

(...)
main:
.LFB9320:
    .cfi_startproc
    movl    $100, %eax
    ret
    .cfi_endproc
(...)
Run Code Online (Sandbox Code Playgroud)
#include <boost/variant.hpp>

struct Foo
{
    int get() { return 100; }
};

struct Bar
{
    int get() { return 999; }
};

using Variant = boost::variant<Foo, Bar>;


int run(Variant v)
{
    return boost::apply_visitor([](auto& x){return x.get();}, v);
}
int main()
{
    Foo f;
    return run(f);
}
Run Code Online (Sandbox Code Playgroud)

但是,完整的程序集输出包含的内容远远超过上面的摘录,对我而言,它看起来永远不会被调用.有没有办法告诉GCC/clang删除所有"噪音"并输出程序运行时实际调用的内容?


完整装配输出:

    .file   "main1.cpp"
    .section    .rodata.str1.8,"aMS",@progbits,1
    .align 8
.LC0:
    .string "/opt/boost/include/boost/variant/detail/forced_return.hpp"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC1: …
Run Code Online (Sandbox Code Playgroud)

c++ assembly gcc clang

56
推荐指数
3
解决办法
1万
查看次数

x86-64中movq和movabsq之间的区别

我是这里的新手,刚刚开始学习汇编语言.所以,如果我错了,请纠正我,或者如果这篇文章没有任何意义我会删除.

我在讨论x86-64英特尔架构中的数据移动指令.我已经读过,常规movq指令只能有直接的源操作数,可以表示为32位二进制补码数,而movabsq指令可以有任意64位立即数作为其源操作数,并且只能有一个寄存器作为目标.

你能详细说明一下吗?这是否意味着我只能使用movabsq指令移动64位立即值?只有立即价值到登记册?我不知道如何将64位立即值移动到内存中.或者也许我错了一些重要的事情.

x86 assembly x86-64 instruction-set att

19
推荐指数
1
解决办法
8093
查看次数

如何运行汇编代码。我有它在一个文本文件中,但我不知道如何运行它

我在文本文件中有汇编代码,但我不知道如何运行它。我希望你能帮我详细解释一下。谢谢

assembly

6
推荐指数
1
解决办法
7万
查看次数

如何消除汇编程序可执行文件的膨胀?

我已经在GasNASMYASM中工作了多平台 Hello World 代码,我想将它们相应的可执行文件从 76KB 缩小到对于 Hello World 汇编程序更合理的大小,因为基本的 Hello World C 程序会导致80KB 的可执行文件和程序集应该小得多。我相信大部分可执行文件都充满了链接器选项中的垃圾。

痕迹:

LIBS=c:/strawberry/c/i686-w64-mingw32/lib/crt2.o -Lc:/strawberry/c/i686-w64-mingw32/lib -lmingw32 -lmingwex -lmsvcrt

ld ld -o $(EXECUTABLE) hello.o $(LIBS)

hello.exe
Hello World!
Run Code Online (Sandbox Code Playgroud)

代码:

.data

msg: .ascii "Hello World!\0"

.text

.global _main

_main:

pushl $msg
call _puts

leave
movl $0, %eax
ret
Run Code Online (Sandbox Code Playgroud)

如果我删除 LIBS 中的任何选项,则链接过程会失败,或者生成的可执行文件在运行时会引发 Windows 错误。因此,合乎逻辑的做法是将调用替换puts为更简单的内容,例如 sys_write,但我不知道如何执行此 multiplatform。网上的小文档说使用它int 0x80来执行对内核的调用,但这仅适用于 Linux,不适用于 Windows,而且我希望我的汇编代码是多平台的。

optimization assembly filesize

5
推荐指数
1
解决办法
479
查看次数

标签 统计

assembly ×4

att ×1

c++ ×1

clang ×1

filesize ×1

gcc ×1

instruction-set ×1

optimization ×1

x86 ×1

x86-64 ×1