本文来自《程序员的自我修养》
编译过程是把预处置处罚完的文件进行一系列词法分析,语法分析,语义分析以及优化后天生相应的汇编文件代码。
现在版本的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
复制代码 把汇编代码转为呆板指令。
----------
呆板指令是计算机能够直接理解和执行的最基本的命令。它们通常以二进制形式存在,是硬件与软件交互的桥梁。每一条呆板指令都对应着处置处罚器上的一个特定的利用,好比数据传输、算术计算、控制利用等。
以下是呆板指令的一些基本特点:
- 二进制格式:呆板指令通常由一系列的二进制数表示,这些二进制数可以被计算机的CPU直接解读。
- 利用码:每条呆板指令都包含一个利用码(Opcode),它指定了CPU要执行的利用类型,如加法、减法、移动数据等。
- 利用数:大多数指令还包括一个或多个利用数,这些利用数指定了数据的位置,例如寄存器、内存地址或者指令中直接包含的常数。
- 指令长度:差别架构的CPU,其呆板指令的长度可能差别。有的指令可能是固定长度的,而有的可能是变长的。
- 执行次序:呆板指令通常按照它们在存储器中的次序执行,除非碰到跳转指令或者其他改变执行流程的指令。
以下是一些常见的呆板指令类型:
- 数据传输指令:如MOV(移动数据),用来在寄存器与内存之间或者寄存器之间传输数据。
- 算术指令:如ADD(加法)、SUB(减法)、MUL(乘法)、DIV(除法)等,用于执行数学运算。
- 逻辑指令:如AND、OR、NOT、XOR等,用于执行逻辑运算。
- 控制流指令:如JMP(跳转)、JE(等于时跳转)、JNE(不等于时跳转)等,用于改变程序的执行次序。
程序员通常利用高级编程语言来编写程序,然后通过编译器或表明器转换成呆板指令,计算机才能执行这些程序。呆板指令直接与硬件干系,因此它们在差别的计算机架构之间通常是差别的。
-------------
MOV 既可以作为呆板指令,也可以作为汇编指令。
在汇编语言中,MOV 是一个汇编指令,它用于指示处置处罚器将数据从一个位置移动到另一个位置。当程序员编写汇编语言程序时,他们利用 MOV 这样的助记符来表示他们想要执行的数据移动利用。
当汇编语言程序被汇编器(assembler)转换成呆板代码时,MOV 汇编指令会被翻译成对应的呆板指令。这个呆板指令是处置处罚器可以直接执行的二进制编码,它具体表示了移动数据的利用。
所以,MOV 在汇编语言层面是一个汇编指令,而在呆板代码层面则对应一个或多个具体的呆板指令。差别的处置处罚器架构可能会有差别的呆板指令来执行 MOV 利用。例如,在 x86 架构中,MOV 汇编指令会对应于一个特定的呆板指令利用码,而在 ARM 架构中,它可能对应于差别的呆板指令利用码。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |