[Hb-III] 汇编程序的编译 连接 加载 执行
2014-11-21 22:54
218 查看
《汇编语言·第三版》--王爽
安装DOSBOX后打开DOSBOX,将debug.exe拷贝到F盘(某盘根目录),在DOSBOX中输入“mountc f:\”命令(此命令输入后有“Drive C is mounted aslocal directory f:\”,再输入“c:”回车。
Figure1. 第一个汇编程序
汇编源程序中包含两种指令,一种是汇编指令,一种是伪指令。汇编指令是有对应的机器码的指令,可以被编译器机器指令,最终为CPU所执行。伪指令没有相应的机器指令,又编译器来执行。
进入masm5目录,运行masm,为masm输入汇编文件的路径及汇编文件名,指定汇编文件经编译后所生成的目标文件名,忽略列表文件和交叉引用文件的生成(直接回车):
Figure2. 编译汇编源文件
经过这些步骤后,在src\first目录下会自动生成first.obj目标文件。
进入masm5目录,运行link,根据提示输入目标文件及可执行文件的名称:
Figure3. 连接
经过此过程后,src\first\目录下会自动生成first.exe可执行文件。
Figure4. 执行可执行程序
这个汇编程序经执行后似乎没有任何的反应(如在黑屏幕上输出一个字符串什么的),是因为程序还没有被赋予这样的功能。
CS:IP等寄存器的值备份,command设置CPU的CS:IP指向程序的第一条指令(程序入口),使程序得以运行;
程序运行完毕后,CS:IP等寄存器的值复原,返回到command中。
Debug可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug不放弃对CPU的控制,这样,就可以使用Debug的相关命令来单步执行程序,查看每一条指令的执行过程。
Figure5. 程序被加载到内存的地址
此时CS:IP指向程序的第一条指令,(DS + 10H):0(076A:0)也是程序的物理地址。CX存放的是程序的长度。076A:0000 ~ 076A:000A存放了程序的机器码。
Figure6. 单步执行汇编程序
程序执行完毕时返回到Debug中。再输入Q则返回到command中。在DOS中用debug masm5\src\first\first.exe时,程序加载的顺序是:command加载Debug,debug加载first.exe。返回的顺序是:从first.exe返回到Debug,从debug返回到command。
Figure7. PSP内容
ds:0 ~ ds:FFH存放的是PSP的内容。
[2014.11.21 - 22:54]
R《Hb》Note Over.
1 准备工作
(1) 调试工具Debug
Win 7 64位系统需要额外准备debug。下载DOSBOX和debug.exe。安装DOSBOX后打开DOSBOX,将debug.exe拷贝到F盘(某盘根目录),在DOSBOX中输入“mountc f:\”命令(此命令输入后有“Drive C is mounted aslocal directory f:\”,再输入“c:”回车。
(2) 汇编编译器
使用微软的masm5.0来编译编写的汇编程序。下载masm5。将masm5.zip解压拷贝到debug.exe所在的目录下。(3) 连接器
(2)中masm5目录下含连接器,可直接用其下的link。2 源程序
在masm5下新建src\first文件夹,在first内用Notepad++编写一个汇编程序如下:Figure1. 第一个汇编程序
汇编源程序中包含两种指令,一种是汇编指令,一种是伪指令。汇编指令是有对应的机器码的指令,可以被编译器机器指令,最终为CPU所执行。伪指令没有相应的机器指令,又编译器来执行。
3 编译
对汇编源程序进行编译,生成包含机器代码的目标文件。进入masm5目录,运行masm,为masm输入汇编文件的路径及汇编文件名,指定汇编文件经编译后所生成的目标文件名,忽略列表文件和交叉引用文件的生成(直接回车):
Figure2. 编译汇编源文件
经过这些步骤后,在src\first目录下会自动生成first.obj目标文件。
4 连接
在对源程序进行编译得到目标文件后,再对目标文件进行连接,从而得到可执行文件。进入masm5目录,运行link,根据提示输入目标文件及可执行文件的名称:
Figure3. 连接
经过此过程后,src\first\目录下会自动生成first.exe可执行文件。
5 执行
(1) 执行操作
直接输入可执行文件的名字,可执行文件即可得到执行:Figure4. 执行可执行程序
这个汇编程序经执行后似乎没有任何的反应(如在黑屏幕上输出一个字符串什么的),是因为程序还没有被赋予这样的功能。
(2) 执行过程分析
在DOS中直接执行first.exe时,正在运行的command(shell)程序将first.exe中的程序加载到内存;程序所在内存区的地址为ds:0,这个区域的前256字节中存放的是PSP,DOS用PSP来和程序进行通信;从256字节处向后的空间存放的是程序。CS:IP等寄存器的值备份,command设置CPU的CS:IP指向程序的第一条指令(程序入口),使程序得以运行;
程序运行完毕后,CS:IP等寄存器的值复原,返回到command中。
6 用调试工具跟踪程序运行
用command加载程序运行时,command会放弃CPU的控制权,CPU立即开始执行程序,直至程序运行结束。Debug可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug不放弃对CPU的控制,这样,就可以使用Debug的相关命令来单步执行程序,查看每一条指令的执行过程。
(1) 单步执行
Figure5. 程序被加载到内存的地址
此时CS:IP指向程序的第一条指令,(DS + 10H):0(076A:0)也是程序的物理地址。CX存放的是程序的长度。076A:0000 ~ 076A:000A存放了程序的机器码。
Figure6. 单步执行汇编程序
程序执行完毕时返回到Debug中。再输入Q则返回到command中。在DOS中用debug masm5\src\first\first.exe时,程序加载的顺序是:command加载Debug,debug加载first.exe。返回的顺序是:从first.exe返回到Debug,从debug返回到command。
(2) 查看PSP内容
Figure7. PSP内容
ds:0 ~ ds:FFH存放的是PSP的内容。
[2014.11.21 - 22:54]
R《Hb》Note Over.
相关文章推荐
- 程序的执行——编译、连接与加载(上)
- 关于Mq c++程序32位编译 和Mq命令必须加载64位动态库执行 矛盾的解决
- 初始化java环境变量以及编译执行,找不到或无法加载主类解决办法
- 加载驱动+建立连接+创建sql语句+执行并获取结果+释放连接 增删改查
- C++的编译单元、可执行程序、内部连接与外部连接
- 一步步学习汇编系列(6)-从一个简单的程序谈编译,连接,执行,跟踪的原理
- java 编译和加载和执行类的全过程
- Delphi中的包(一):关于exe的编译、连接和执行
- 在android中如何编译连接 .c 的可执行文件
- Linux驱动编程day5-驱动自动加载,编译进内核以及自动执行
- 请大家编译连接并执行一下
- 工具接口标准(TIS)可执行链接格式(ELF)规范-卷III-操作系统特性-程序加载和动态链接(一)
- gcc 编译 连接 生成可执行文件
- CentOS 6.5 编译Eclipse plugin for hadoop 2.5及加载连接
- 工具接口标准(TIS)可执行链接格式(ELF)规范-卷III-操作系统特性-程序加载和动态链接(五)
- 学习笔记-编译、连接和执行
- C源代码编译及加载执行过程(二)
- 工具接口标准(TIS)可执行链接格式(ELF)规范-卷III-操作系统特性-程序加载和动态链接(三)
- 汇编语言自学习02_编辑、编译、连接、加载各个阶段的程序的表现形式
- Java动态编译源代码并加载执行