汇编语言自学习02_编辑、编译、连接、加载各个阶段的程序的表现形式
2015-04-28 15:32
316 查看
1.要思考的问题
1)源程序的编辑、汇编、链接的过程是什么?
2)编辑、汇编、连接、加载的作用原理与过程?
3)程序在内存中的物理存储是怎样的?
2.解决:
0)重要关键词:源程序、目标文件、可执行文件;汇编程序、链接程序、加载程序
1)编辑编译过程:
如图1所示,编辑源程序,用masm编译源程序生成目标文件,再用link将目标文件连接成可执行文件,加载程序再将可执行文件加载到内存,详细的 过程请参考我的博客:汇编语言学习01
![](http://img.blog.csdn.net/20150428153729933)
图1 编辑编译过程
2)编辑源程序:
如图2所示,我们用汇编语言编写源代码,分析一下该程序的内容:主要由数据段、堆栈段、代码段组成。数据段主要是定义变量,堆栈段主要是定义16个4字节的整数变量来预置内存空间,代码段主要是机器可以执行的指令,类似于c语言,都要定义变量、写主函数等等。(此时我们所编写的源程序是面向汇编程序的,是给汇编程序看的
![](http://img.blog.csdn.net/20150428153921848)
图2 源程序
3)编译源程序,生成目标文件
如图3所示,我们分析一下文件的内容:红色为数据段、蓝色为堆栈段、绿色为代码段,其他。可以对比代码段看出来,“其他”不是我们所希望计算机执行的代码和数据,“”那么“其他”有没有用呢?有的,是给连接程序用的,连接程序就是根据这些内容对各个目标文件进行连接的。那么,连接的过程是什么呢?其实我也不是十分清楚,暂时可以忽略,个人推测它们就是一种协议规则。
![](http://img.blog.csdn.net/20150428154138034)
图3 目标文件内容
4)连接目标文件,生成可执行文件(本程序的目标文件个数为1)
连接程序,根据各个目标文件内的规则协议进行链接,然后生后可执行文件,如图4所示。我们来分析一下文件的内容:红色为数据段、蓝色为堆栈段、绿色为代码段、其他。那么“其他”什么用呢?其实是给加载程序用的,加载可以根据这部分的内容将可执行问价加载至内存,并且修改代码段中的data、stack的值,使DS指向该可执行文件的数据段、使SS指向该可执行文件的堆栈段。
![](http://img.blog.csdn.net/20150428154223539)
图4 可执行文件内容
5)程序在计算机内的物理存储形式
如图5所示,就是加载程序将可执行文件加载到内存中,可执行文件的物理存储形式。对比目标文件、可执行文件你可能会发现,少了好多。是的,剩下的真正被加载到内存的程序就是我们所希望的代码段所定义的变量、堆栈段所定义的变量、代码段的指令。其实在我们所编写的源程序中,真正能够被加载到内存中执行的只是这些,其他的都是为它服务的。
![](http://img.blog.csdn.net/20150428154334098)
图5 在RAM中的物理存储
![](http://img.blog.csdn.net/20150428194639219)
图6 汇编指令所对应的机器码
3.总结
其实在我们编写源程序时,很多语句字符都是给汇编程序、连接程序看的,告诉他们如何编译链接,而真正能够加载到内存的只有变量和指令。如果你是单片机学习者,并不了解汇编的话,你可以思考一下 单片机程序的编辑、编译、连接、下载到单片机内等等,其实原理是相通的。
1)源程序的编辑、汇编、链接的过程是什么?
2)编辑、汇编、连接、加载的作用原理与过程?
3)程序在内存中的物理存储是怎样的?
2.解决:
0)重要关键词:源程序、目标文件、可执行文件;汇编程序、链接程序、加载程序
1)编辑编译过程:
如图1所示,编辑源程序,用masm编译源程序生成目标文件,再用link将目标文件连接成可执行文件,加载程序再将可执行文件加载到内存,详细的 过程请参考我的博客:汇编语言学习01
图1 编辑编译过程
2)编辑源程序:
如图2所示,我们用汇编语言编写源代码,分析一下该程序的内容:主要由数据段、堆栈段、代码段组成。数据段主要是定义变量,堆栈段主要是定义16个4字节的整数变量来预置内存空间,代码段主要是机器可以执行的指令,类似于c语言,都要定义变量、写主函数等等。(此时我们所编写的源程序是面向汇编程序的,是给汇编程序看的
图2 源程序
3)编译源程序,生成目标文件
如图3所示,我们分析一下文件的内容:红色为数据段、蓝色为堆栈段、绿色为代码段,其他。可以对比代码段看出来,“其他”不是我们所希望计算机执行的代码和数据,“”那么“其他”有没有用呢?有的,是给连接程序用的,连接程序就是根据这些内容对各个目标文件进行连接的。那么,连接的过程是什么呢?其实我也不是十分清楚,暂时可以忽略,个人推测它们就是一种协议规则。
图3 目标文件内容
4)连接目标文件,生成可执行文件(本程序的目标文件个数为1)
连接程序,根据各个目标文件内的规则协议进行链接,然后生后可执行文件,如图4所示。我们来分析一下文件的内容:红色为数据段、蓝色为堆栈段、绿色为代码段、其他。那么“其他”什么用呢?其实是给加载程序用的,加载可以根据这部分的内容将可执行问价加载至内存,并且修改代码段中的data、stack的值,使DS指向该可执行文件的数据段、使SS指向该可执行文件的堆栈段。
图4 可执行文件内容
5)程序在计算机内的物理存储形式
如图5所示,就是加载程序将可执行文件加载到内存中,可执行文件的物理存储形式。对比目标文件、可执行文件你可能会发现,少了好多。是的,剩下的真正被加载到内存的程序就是我们所希望的代码段所定义的变量、堆栈段所定义的变量、代码段的指令。其实在我们所编写的源程序中,真正能够被加载到内存中执行的只是这些,其他的都是为它服务的。
图5 在RAM中的物理存储
图6 汇编指令所对应的机器码
3.总结
其实在我们编写源程序时,很多语句字符都是给汇编程序、连接程序看的,告诉他们如何编译链接,而真正能够加载到内存的只有变量和指令。如果你是单片机学习者,并不了解汇编的话,你可以思考一下 单片机程序的编辑、编译、连接、下载到单片机内等等,其实原理是相通的。
相关文章推荐
- LISP 学习笔记 (三) -编辑,加载和编译LISP程序
- 一步步学习汇编系列(6)-从一个简单的程序谈编译,连接,执行,跟踪的原理
- 汇编语言自学习01_汇编程序实验工具及编译链接全过程
- 汇编语言入门——编辑、编译、链接、运行、调试程序【影子笨蛋苦比的摸索日记】
- 第一个程序02 - 零基础入门学习汇编语言21
- 第一个程序02 - 零基础入门学习汇编语言21
- 包含多个段的程序02 - 零基础入门学习汇编语言30
- 包含多个段的程序02 - 零基础入门学习汇编语言30
- 寄存器(CPU工作原理)02 - 零基础入门学习汇编语言07
- 寄存器(CPU工作原理)02 - 零基础入门学习汇编语言07
- 寄存器(内存访问)02 - 零基础入门学习汇编语言14
- 寄存器(内存访问)02 - 零基础入门学习汇编语言14
- 第一个程序01 - 零基础入门学习汇编语言20
- 第一个程序01 - 零基础入门学习汇编语言20
- 第一个程序03 - 零基础入门学习汇编语言22
- 第一个程序03 - 零基础入门学习汇编语言22
- [BX]和loop指令02 - 零基础入门学习汇编语言24
- [BX]和loop指令02 - 零基础入门学习汇编语言24
- 包含多个段的程序01 - 零基础入门学习汇编语言29
- 包含多个段的程序01 - 零基础入门学习汇编语言29