草庐IT

IDA反汇编

全部标签

c++ - 学习阅读 GCC 汇编器输出

我正在考虑对assembly有一些非常基本的了解。我目前的目标很简单:非常基本在使用x86/x86-64的-S开关编译C/C++时了解GCC汇编器输出。只够做一些简单的事情,例如查看单个函数并验证GCC是否优化了我希望消失的东西。是否有人拥有/知道关于汇编的真正简明的介绍,与GCC相关并且专门用于阅读目的,以及任何随便阅读汇编的人都应该知道的最重要说明的列表? 最佳答案 您应该使用GCC的-fverbose-asm选项。它使编译器输出附加信息(以注释的形式),从而更容易理解汇编代码与原始C/C++代码的关系。

c++ - 如何查看由 gcc(任何风格)编译器为 C/C++ 程序生成的汇编代码?

我正在尝试优化很多乘法和指针算术,并且想看看当我放入优化标志时编译器在下面做了什么。--编辑--如何将其限制为特定的功能或代码块?--Edit_2--如何让gcc生成不那么冗长的汇编代码? 最佳答案 将-S开关添加到您的命令行。编辑:不要忘记它会将程序集放置到您在-o开关下指定的文件中。 关于c++-如何查看由gcc(任何风格)编译器为C/C++程序生成的汇编代码?,我们在StackOverflow上找到一个类似的问题: https://stackoverfl

c++ - C 和汇编程序实际上编译成什么?

关闭。这个问题需要更多focused.它目前不接受答案。想要改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭3年前。Improvethisquestion所以我发现C(++)程序实际上并不能编译为普通的“二进制”(我可能在这里弄错了一些东西,在那种情况下我很抱歉:D)而是一系列的东西(符号表,操作系统相关的东西,...)但是...汇编器是否“编译”为纯二进制?这意味着除了预定义字符串等资源之外没有额外的东西。如果C编译为普通二进制以外的其他内容,那么小型汇编程序引导加载程序如何将指令从HDD复制到内存并执行它们?我的意思是,如果操作系统内核(可能是用C编

c++ - 如何在 Intel 语法中使用 clang 生成汇编代码?

作为thisquestion显示,使用g++,我可以执行g++-S-masm=inteltest.cpp。此外,使用clang,我可以执行clang++-Stest.cpp,但clang不支持-masm=intel(编译期间未使用的警告参数:-masm=intel)。如何使用clang获取intel语法? 最佳答案 作为notedbelowby@thakis,较新版本的Clang(3.5+)接受-masm=intel论据。对于旧版本,这应该会发出带有Intel语法的汇编代码:clang++-S-mllvm--x86-asm-synt

go - 易于阅读的 Golang 汇编输出?

我有兴趣检查标准Go编译器的x86汇编输出,看看我的代码是否真的被转换成相当有效的汇编代码;希望通过分析和检查程序集输出,我可以获得关于我应该在哪里/如何重写我的Go代码以获得最佳性能的线索。但是当我使用-S标志检查代码时,Go吐出一团糟!我想要两件事:有没有办法让Go编译器将程序集输出转储到文件中,而不仅仅是在终端上打印出来?另外,有没有办法让Go编译器将汇编代码分离成带有标签的单独函数?我知道某些函数可能是内联的,因此不会出现在汇编代码中。我所看到的只是一个同质的组装block,几乎无法理解。 最佳答案 您可以将输出重定向到这样

go - 是否可以在 Go 代码中包含内联汇编?

是否可以在Go代码中包含内联汇编?Thisblogpost显示了将Go编译到单独的.s文件并对其进行编辑,而不是像许多C编译器支持的那样将inlineasm作为Go函数的一部分。 最佳答案 不支持内联汇编,但您可以通过C与用汇编编写的代码链接,使用cgo编译并使用import"C",如gmp.go.您也可以使用与Go直接兼容的汇编风格编写,例如asm_linux_amd64.s,这要求函数名称以“·”开头。或者,您可以使用nasm和gccgo,这是我目前最喜欢的方式。(请注意,Nasm似乎不支持以“·”开头的函数)。这是一个有效的“

linux - 永久更改 GDB 中的反汇编风格

如何永久更改GDB中的反汇编风格。我试过:setdisassembly-flavorintel在GDB中,但是当我稍后启动GDB时,它仍然有att的味道。 最佳答案 gdb在启动时执行~/.gdbinit文件(如果存在);您应该可以添加该行setdisassembly-flavorintel给它。 关于linux-永久更改GDB中的反汇编风格,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/quest

linux - 在 Linux 中编译/运行汇编程序?

我对Linux(Ubuntu10.04)还很陌生,对汇编程序还是个新手。我正在关注一些教程,但找不到任何特定于Linux的内容。所以,我的问题是,什么是编译/运行汇编程序的好包以及为该包编译/运行的命令行命令是什么? 最佳答案 GNU汇编器可能已经安装在您的系统上。尝试manas查看完整的使用信息。你可以使用as来编译单个文件,如果你真的想要的话,可以使用ld来链接。但是,GCC是一个很棒的前端。它可以为您组装.s文件。例如:$cat>hello.s上面的代码是x86-64。如果你想创建一个与位置无关的可执行文件(PIE),你需要l

linux - 与 AT&T 相比,英特尔汇编语法的局限性

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter寻求指导。关闭10年前。对我来说,英特尔语法更容易阅读。如果我只专注于英特尔语法的汇编森林,我会错过任何东西吗?我有什么理由想切换到AT&T(除了能够阅读其他人的AT&T程序集之外)?我的第一个线索是gdb默认使用AT&T。如果这很重要,我只关注任何关系汇编和语法可能对Linux/BSD和C语言有影响。 最佳答案 确实没

linux - 使用 gdb 对指定可执行文件之外的单步汇编代码导致错误 "cannot find bounds of current function"

我在gdb的目标可执行文件之外,我什至没有对应于该目标的堆栈。无论如何我都想单步执行,这样我就可以验证我的汇编代码中发生了什么,因为我不是x86汇编方面的专家。不幸的是,gdb拒绝进行这种简单的汇编级调试。它允许我在适当的断点处设置和停止,但是一旦我尝试单步前进,gdb就会报告错误“找不到当前函数的边界”并且EIP不会改变。其他细节:机器代码是由gccasm语句生成的,我将它从objdump-d的输出复制到它正在执行的内核内存位置。我不介意使用加载器将我的目标代码加载到重定位地址的简单方法,但请记住加载必须在内核模块中完成。我想另一种选择是生成一个伪造的内核模块或调试信息文件以提供给g