【发布时间】:2021-07-20 15:51:39
【问题描述】:
我正在尝试学习一些关于装配的知识。我决定首先查看从简单源代码生成的汇编文件。当然,我被指示轰炸,我不知道它们的含义,我开始在互联网上搜索它们的含义。在搜索时,我意识到我不知道我在寻找什么汇编语言..
有没有办法知道 gcc 生成哪种汇编语言?这个问题还有意义吗? 我主要对我的系统接受的程序集感兴趣(或者我应该这样说......)。使用 gcc 生成的代码见下文。
如果你意识到我有哪些知识空白,请链接相关文档阅读/学习。
系统:
操作系统:Windows 10 专业版
处理器:Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz 2.20 GHz
类型:64 位操作系统,基于 x64 的处理器
//test.c
int main(){
int x = 2;
return 0;
}
//test.s
.file "test.c"
.text
.def __main; .scl 2; .type 32; .endef
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
.seh_setframe %rbp, 0
subq $48, %rsp
.seh_stackalloc 48
.seh_endprologue
call __main
movl $2, -4(%rbp)
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (Rev10, Built by MSYS2 project) 10.2.0"
【问题讨论】:
-
pushq、movl、ret,这些是指令,其余的是与语言相关的其他内容。该语言特定于工具(gnu 汇编器或 gcc)而不是目标(x86),因此完全涵盖这些指令如何工作的英特尔文档可能不会使用相同的语法(我不是在远程谈论 AT&T 与英特尔)。因此您可能需要查看 gnu 汇编器文档(binutils 的一部分)或从反汇编和机器代码与 intel 文档中推断。
-
选择一个更好的指令集开始。
标签: c assembly x86-64 att instruction-set