编译与汇编

ops/2025/1/14 23:30: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_startprocendbr64pushq	%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq	%rsp, %rbp.cfi_def_cfa_register 6movl	$0, %eaxpopq	%rbp.cfi_def_cfa 7, 8ret.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.ppmy.cn/ops/150132.html

相关文章

前端开发:字体属性

1.设置字体家族 也就是使用宋体还是微软雅黑 2.设置字体大小 3.设置字体颜色 4.设置字体粗细 5.设置文字样式 <style> div{ font-family: 宋体; //设置字体家族 font-size:50px; //设置字体大小 color:red; //设置字体颜色&#xff1b…

如何理解机器学习中的向量 ?

在机器学习中&#xff0c;向量是一个核心概念&#xff0c;用于表示数据、特征或其他数学结构。向量是线性代数的基本对象&#xff0c;在机器学习中&#xff0c;它的意义超越了纯数学的定义&#xff0c;承载着信息的表示、计算和模型学习等重要功能。以下是对机器学习中向量的详…

合洁科技:晶圆洁净车间的净化空调系统和一般空调系统有何区别

电子洁净车间的净化空调系统和一般空调系统之间存在显著差异&#xff0c;这些差异主要体现在空气处理过程、空气过滤要求、室内压力控制、气流组织、换气次数以及能耗方面。以下是具体的对比&#xff0c;随合洁科技电子净化工程公司一起来了解下吧! 一、空气处理过程 净化空调系…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台&#xff0c;今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统&#xff0c;后端基于最新的.Net6和Asp.Net Core框架&#xff0c;遵循RESTFul接口规范&…

字符串算法篇——字里乾坤,算法织梦,解构字符串的艺术(上)

文章目录 引言&#xff1a;一场字符与算法的交响曲第一章&#xff1a;从匹配到理解——字符串的基础算法1.1 暴力搜索&#xff1a;逐字逐句的匠人精神1.2 KMP算法&#xff1a;文字间的优雅跳跃 第二章&#xff1a;字符串的变形之术——编辑与构造第三章&#xff1a;应用与未来—…

【解决方案】Golang结构体传0被忽略

【解决方案】Golang结构体传0被忽略 在 Go 语言中&#xff0c;当结构体字段标记为 omitempty 时&#xff0c;在将结构体序列化为 JSON 或其他格式时&#xff0c;如果字段的零值&#xff08;比如数字类型的0、字符串类型的空字符串等&#xff09;会被忽略&#xff0c;不会被序列…

【Uniapp-Vue3】插槽Slots及具名插槽实现组件高度定制化

插槽就像挖了一个坑&#xff0c;在使用插槽的时候可以根据自己的需要放白萝卜还是胡萝卜。 一、放置插槽 该组件为user-layout一般我们的页面布局的头部和底部都不会变&#xff0c;只会改变中间部分&#xff0c;所以我们给中间部分留一个slot插槽&#xff1a; 二、使用插槽 …

SQL Server查询计划操作符——查询计划相关操作符(3)

7.3. 查询计划相关操作符 19)Collapse:该操作符对更改处理进行优化。当执行一个更改时,其能被劈成(用Split操作符)一个删除和一个插入。其参数列包含一个确定一系列键值字段的GROUP BY:()子句。如果查询处理器遇到删除和插入相同键值的毗邻行,其将用一个更高效的更改操作…