gcc 在我的系统上生成什么汇编语言?

如何解决gcc 在我的系统上生成什么汇编语言?

我正在尝试学习一些关于汇编的知识。我决定从简单的源代码中查看生成的程序集文件开始。当然,我被指令轰炸,我不知道它们的意思,我开始在互联网上搜索它们的含义。在搜索时,我意识到我不知道我在寻找什么汇编语言..

有没有办法知道 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"

解决方法

GCC 总是产生 GNU assembler 可以在任何平台上组装的 asm 输出。 (GAS / GNU as 是 GNU Binutils 的一部分,还有 ld 这样的工具,一个链接器。)

就您而言,目标是 x86-64 Windows(可能来自 x86_64-w64-mingw32-gcc),
并且指令语法为AT&T syntax(x86 包括x86-64 的GCC 和GAS 默认值)。

在 GAS for x86(包括 x86-64)中,注释字符为 #
任何以 . 开头的都是指令;一些,比如 .globl main 导出符号 main 作为链接在 .o 中可见,通常对 GAS 是通用的;检查 GAS manual

.seh_setframe %rbp,0 这样的 SEH 指令是 Structured Exception Handling 的特定于 Windows 的堆栈展开元数据,特定于 Windows 对象文件格式。 (您可以 100% 忽略,直到/除非您想了解回溯和异常处理如何在幕后工作,而不依赖于传统的帧指针链。AFAIK,它基本上等同于 ELF/Linux .eh_frame 元数据来自 .cfi 指令。)

事实上,您几乎可以忽略所有指令,唯一真正重要的是像 .text.data 这样的部分,以及.globl 使链接工作有些重要。这就是默认情况下 https://godbolt.org/ 过滤指令的原因。


如果您需要 Intel 语法/助记符,您可以使用 gcc -masm=intel,您可以在 Intel 手册中查找这些内容。 (https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html / https://www.felixcloutier.com/x86/)。另见How to remove "noise" from GCC/clang assembly output?。 (gcc -O1 -fverbose-asm 可能很有趣。)

如果您想学习 AT&T 语法,请参阅 https://stackoverflow.com/tags/att/info。 GAS 手册还有一个关于 AT&T 与 Intel 语法的页面,但它不是作为教程编写的,即它假设您知道 x86 指令的工作原理,并且正在寻找 GAS 用来描述它们的语法的详细信息:{{3} }

(请记住,CPU 实际上运行机器代码,字节如何进入内存并不重要,只要它们这样做。所以不同的汇编程序(如 NASM 与 GAS)和不同的语法(如 {{ 1}}) 最终对机器在一条指令中可以做什么或不做什么都有相同的限制。所有主流汇编程序都可以让您表达每条指令可以做的几乎所有事情,只需了解立即数的语法,寻址模式,等等。Intel 和 AMD 的手册准确地记录了 CPU 可以做什么,使用 Intel 语法,但没有确定语法或指令的细节。)


资源(包括上面链接的一些):

,

有没有办法知道 gcc 生成哪种汇编语言?

是的,您的目标端口。这似乎是x86。反过来,这种汇编语言有各种风格和方言,有着大量的历史:https://en.wikipedia.org/wiki/X86_assembly_language

当然,我会被指令轰炸,我不知道它们是什么意思

阅读 C 编译器生成的汇编程序比阅读手工编码的汇编程序要困难得多。我建议从一些汇编教程开始,而不是由人类编写的代码示例。

x86 也可能是其中最难的一个,因为它有所有的风格,而且核心的复杂性。一般建议先学习一些简单的汇编程序来掌握它。

8 位微控制器是一个不错的起点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res