编译与汇编

news2025/1/15 4:08:03

本文来自《程序员的自我修养》

编译过程是把预处理完的文件进行一系列词法分析,语法分析,语义分析以及优化后生成相应的汇编文件代码。

现在版本的GCC把预编译和编译两个步骤合并为一个步骤。

gcc -S HelloWorld.c HelloWorld.s
int main()
{
    //test
    /* test */
    return 0;
}
	.file	"HelloWorld.c"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:

------------

对于C语言的代码来说,这个预编译和编译的程序是cc1,

对于C++来说,对应的程序是cc1plus;

实际上gcc这个命令只是这些后台程序的封装,它会根据不同的参数要求去调用预编译编译程序cc1,汇编器as,链接器ld.

--------------

汇编器将汇编代码转变为机器可以执行的指令,每一个汇编代码几乎都对应一条机器指令,所以汇编器的汇编过程相对于编译器来说比较简单,没有复杂的语法,没有语义,不需要做指令优化;

只是根据汇编指令和机器指令的对照表一一翻译即可。

gcc -c HelloWorld.s -o HelloWorld.o

把汇编代码转为机器指令。

----------

机器指令是计算机能够直接理解和执行的最基本的命令。它们通常以二进制形式存在,是硬件与软件交互的桥梁。每一条机器指令都对应着处理器上的一个特定的操作,比如数据传输、算术计算、控制操作等。

以下是机器指令的一些基本特点:

  1. 二进制格式:机器指令通常由一系列的二进制数表示,这些二进制数可以被计算机的CPU直接解读。

  2. 操作码:每条机器指令都包含一个操作码(Opcode),它指定了CPU要执行的操作类型,如加法、减法、移动数据等。

  3. 操作数:大多数指令还包括一个或多个操作数,这些操作数指定了数据的位置,例如寄存器、内存地址或者指令中直接包含的常数。

  4. 指令长度:不同架构的CPU,其机器指令的长度可能不同。有的指令可能是固定长度的,而有的可能是变长的。

  5. 执行顺序:机器指令通常按照它们在存储器中的顺序执行,除非遇到跳转指令或者其他改变执行流程的指令。

以下是一些常见的机器指令类型:

  • 数据传输指令:如MOV(移动数据),用来在寄存器与内存之间或者寄存器之间传输数据。
  • 算术指令:如ADD(加法)、SUB(减法)、MUL(乘法)、DIV(除法)等,用于执行数学运算。
  • 逻辑指令:如AND、OR、NOT、XOR等,用于执行逻辑运算。
  • 控制流指令:如JMP(跳转)、JE(等于时跳转)、JNE(不等于时跳转)等,用于改变程序的执行顺序。

程序员通常使用高级编程语言来编写程序,然后通过编译器或解释器转换成机器指令,计算机才能执行这些程序。机器指令直接与硬件相关,因此它们在不同的计算机架构之间通常是不同的。

-------------

MOV 既可以作为机器指令,也可以作为汇编指令。

在汇编语言中,MOV 是一个汇编指令,它用于指示处理器将数据从一个位置移动到另一个位置。当程序员编写汇编语言程序时,他们使用 MOV 这样的助记符来表示他们想要执行的数据移动操作。

当汇编语言程序被汇编器(assembler)转换成机器代码时,MOV 汇编指令会被翻译成对应的机器指令。这个机器指令是处理器可以直接执行的二进制编码,它具体表示了移动数据的操作

所以,MOV 在汇编语言层面是一个汇编指令,而在机器代码层面则对应一个或多个具体的机器指令。不同的处理器架构可能会有不同的机器指令来执行 MOV 操作。例如,在 x86 架构中,MOV 汇编指令会对应于一个特定的机器指令操作码,而在 ARM 架构中,它可能对应于不同的机器指令操作码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wireshark抓包教程(2024最新版个人笔记)

改内容是个人的学习笔记 Wireshark抓包教程(2024最新版)_哔哩哔哩_bilibili 该课程笔记1-16 wireshark基础 什么是抓包工具:用来抓取数据包的一个软件 wireshark的功能:用来网络故障排查;用来学习网络技术 wireshark下…

Web开发(一)HTML5

Web开发(一)HTML5 写在前面 参考黑马程序员前端Web教程做的笔记,主要是想后面自己搭建网页玩。 这部分是前端HTML5CSS3移动web视频教程的HTML5部分。主要涉及到HTML的基础语法。 HTML基础 标签定义 HTML定义 HTML(HyperText Markup Lan…

RabbitMQ 的工作模式

目录 工作模式 Simple(简单模式) Work Queue(工作队列) Publish/Subscribe(发布/订阅) Exchange(交换机) Routing(路由模式) Topics(通配…

备战蓝桥杯:树的存储与遍历(dfs和bfs)

树的概念 树的逻辑结构是树形结构,和我们之前的线性结构又不太一样了,是一种一对多的关系 树的结点分为根节点,叶子结点(没有分支的结点) 以及分支结点 从上往下看,每个结点都有0个或多个后继 从下往上…

超大规模分类(三):KNN softmax

传统的分类损失计算输入数据和每个类别中心的距离,来优化模型的训练。KNN softmax通过选择和输入数据最相关的top-K个类别,仅计算输入数据和top-K个类别中心的距离,以减小计算量。 KNN softmax首次诞生于达摩院机器智能技术实验室发表的SIGKD…

ubuntu官方软件包网站 字体设置

在https://ubuntu.pkgs.org/22.04/ubuntu-universe-amd64/xl2tpd_1.3.16-1_amd64.deb.html搜索找到需要的软件后,点击,下滑, 即可在Links和Download找到相关链接,下载即可, 但是找不到ros的安装包, 字体设…

项目实战——使用python脚本完成指定OTA或者其他功能的自动化断电上电测试

前言 在嵌入式设备的OTA场景测试和其他断电上电测试过程中,有的场景发生在夜晚或者随时可能发生,这个时候不可能24h人工盯着,需要自动化抓取串口日志处罚断电上电操作。 下面的python脚本可以实现自动抓取串口指定关键词,然后触发…

电脑分辨率调到为多少最佳?电脑分辨率最佳设置

电脑分辨率是指电脑屏幕上显示的像素点的数量,通常用水平和垂直方向的像素点数来表示,例如19201080。像素点越多,显示的内容就越清晰,但也会占用更多的系统资源和电力。那么多电脑分辨率多少最佳?以及电脑分辨率如何调…

代码随想录算法【Day20】

Day20 二叉搜索树 235. 二叉搜索树的最近公共祖先 理解只要当前节点的值在p和q节点的值的中间,那这个值就是最近的公共祖先,绝对不是次近的,这个题就好做了。 递归法 二叉搜索树本身是有序的,所以不涉及到前中后序的遍历 cl…

【SpringBoot】@Value 没有注入预期的值

问题复现 在装配对象成员属性时,我们常常会使用 Autowired 来装配。但是,有时候我们也使用 Value 进行装配。不过这两种注解使用风格不同,使用 Autowired 一般都不会设置属性值,而 Value 必须指定一个字符串值,因为其…

车联网安全 -- 数字证书到底证明了什么?

在车联网安全--TLS握手过程详解里面,我们了解到握手时,Server会向Client发送Server Certificate,用于证明自己的身份合法,为什么会有这一步呢? 我们回顾一下数字签名的过程: Bob将使用自己的公钥对“Hello…

Elasticsarch:使用全文搜索在 ES|QL 中进行过滤 - 8.17

8.17 在 ES|QL 中引入了 match 和 qstr 函数,可用于执行全文过滤。本文介绍了它们的作用、使用方法、与现有文本过滤方法的区别、当前的限制以及未来的改进。 ES|QL 现在包含全文函数,可用于使用文本查询过滤数据。我们将回顾可用的文本过滤方法&#xf…

【HTML+CSS+JS+VUE】web前端教程-31-css3新特性

圆角 div{width: 100px;height: 100px;background-color: saddlebrown;border-radius: 5px;}阴影 div{width: 200px;height: 100px;background-color: saddlebrown;margin: 0 auto;box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);}

Spring Boot 项目自定义加解密实现配置文件的加密

在Spring Boot项目中, 可以结合Jasypt 快速实现对配置文件中的部分属性进行加密。 完整的介绍参照: Spring Boot Jasypt 实现application.yml 属性加密的快速示例 但是作为一个技术强迫症,总是想着从底层开始实现属性的加解密,…

若依前后端分离项目部署(使用docker)

文章目录 一、搭建后端1.1 搭建流程:1.2 后端零件:1.2.1 mysql容器创建:1.2.2 redis容器创建:1.2.3 Dockerfile内容:1.2.4 构建项目镜像:1.2.5 创建后端容器: 二、前端搭建:2.1 搭建流程&#x…

Vue2+OpenLayers使用Overlay实现点击获取当前经纬度信息(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 关键参数: 实现思路: 核心代码: 完整代码: 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 覆盖物(Overlay&#xf…

Oracle 终止正在执行的SQL

目录 一. 背景二. 操作简介三. 投入数据四. 效果展示 一. 背景 项目中要求进行性能测试,需要向指定的表中投入几百万条数据。 在数据投入的过程中发现投入的数据不对,需要紧急停止SQL的执行。 二. 操作简介 👉需要DBA权限👈 ⏹…

Oopsie【hack the box】

Oopsie 解题流程 文件上传 首先开启机器后,我们先使用 nmap -sC -SV来扫描一下IP地址: -sC:使用 Nmap 的默认脚本扫描(通常是 NSE 脚本,Nmap Scripting Engine)。这个选项会自动执行一系列常见的脚本&am…

V少JS基础班之第四弹

一、 前言 第四弹内容是操作符。 本章结束。第一个月的内容就完成了, 是一个节点。 下个月我们就要开始函数的学习了。 我们学习完函数之后。很多概念就可以跟大家补充说明了。 OK,那我们就开始本周的操作符学习 本系列为一周一更,计划历时6…

【STM32-学习笔记-7-】USART串口通信

文章目录 USART串口通信Ⅰ、硬件电路Ⅱ、常见的电平标准Ⅲ、串口参数及时序Ⅳ、STM32的USART简介数据帧起始位侦测数据采样波特率发生器 Ⅴ、USART函数介绍Ⅵ、USART_InitTypeDef结构体参数1、USART_BaudRate2、USART_WordLength3、USART_StopBits4、USART_Parity5、USART_Mode…