编译与汇编

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

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

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

cpp 复制代码
gcc -S HelloWorld.c HelloWorld.s
cpp 复制代码
int main()
{
    //test
    /* test */
    return 0;
}
cpp 复制代码
	.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.


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

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

bash 复制代码
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 架构中,它可能对应于不同的机器指令操作码。

相关推荐
浩浩测试一下1 小时前
汇编 内联汇编与混合编程 (逆向分析)
汇编·混合编程·windows编程·内联汇编·二进制逆向·c语言混合汇编
浩浩测试一下4 小时前
汇编 结构体与宏
汇编··免杀·结构体·windows编程·逆向二进制
浩浩测试一下18 小时前
汇编中的JCC指令 (逆向分析)
汇编·逆向·标志位·jcc指令·跳转指令·标志位寄存器
浩浩测试一下19 小时前
汇编中的段与段寄存器(大小)段序 (逆向分析)
汇编·逆向·二进制·字节序·windows编程·内存地址排序
浩浩测试一下2 天前
汇编 call与ret 函数与堆栈 (逆向分析)
汇编·push·函数·pop·call·ret·堆栈逆向
山屿落星辰2 天前
昇腾NPU算子开发:从“手写汇编“到“搭积木“
汇编
浩浩测试一下2 天前
汇编 汇编寻址 (逆向分析)
汇编·寻址·windows编程·二进制逆向·机器码
浩浩测试一下3 天前
汇编 位运算 (逆向分析)
汇编·逆向·位运算·asm·windows编程·二进制逆向
浩浩测试一下3 天前
汇编 高低八位寄存器数据存储方式(逆向分析)
汇编·网络安全·逆向·二进制·免杀·寄存器·windows编程
a83331963 天前
C语言嵌入汇编详解
汇编·单片机·语言