五、程序的编写与执行
五、程序的编写与执行
汇编语言程序写出到执行的过程: 写出源程序—>对源程序进行编译连接—>生成可执行文件—>操作系统将其加载入内存—>CPU执行程序
1.源程序
源程序包括汇编语言和伪指令。
示例:
伪指令
伪指令是给编译器看的指令,编译器根据伪指令来进行相关编译工作。
(1) segment与ends
作用:定义一个段。
segment 表示一个段的开始,ends 表示一个段的结束。
用法:
段名 segment
:
段名 ends
(2) end
作用:结束编译。
PS: 注意区分end与ends的含义。
用法:在程序结尾处使用。
(3) assume
作用:将段与指定的段寄存器关联起来。(即声明该段在CPU中的执行位置)
用法:在一个段的开头使用。
assume 段寄存器:段名
(4) 标号
一个标号指代了一个段地址。
它被编译后最终处理为一个段地址。
程序与程序结构
程序返回
(1)DOS中的程序运行
DOS是一个单任务的操作系统。
当要运行XXX.exe程序时,DOS程序会终止运行,CPU将控制权移交给此exe程序,程序运行完成后,会返回DOS程序继续运行,等待下一条指令的输入。
我们称这个过程为程序返回
原理详见CSAPP中对于进程与线程的阐述。
(2) 实现程序返回(中断机制)
在程序末尾添加返回的程序段。
mov ax,4c00H
int 21H
PS: 这是汇编指令,由CPU负责执行。
小结:
逻辑错误与语法错误
被编译器发现的错误是语法错误;编译后,在运行时发生的错误是逻辑错误。
(一个是语句错误书写,一个是缺少必要语句或者本身的逻辑问题)
2.环境配置
(1)下载Notepad++(用于编写源程序,用其他文本软件也可以)
(2)下载MASM,并将这几个程序与源程序文件放在一起
(3)在Notepad++上编写源程序并保存到上述的文件夹中
3.源程序的编译、连接与执行
(1)如源程序的示例那样编写好源程序后,我们就可以将其保存为一个XXX.asm的文件,然后进入DOSBox程序,输入以下命令以打开源程序文件所在位置:
mount c D:\StudyAssembler\MASM\ (文件所在位置)
C:
如图所示:
(2)输入以下命令以编译源程序:
masm 1.asm
如下图所示:
(3)编译完成后会生成一个1.obj对象文件,输入以下命令以连接程序:
link 1.obj
由于书本中的1.asm文件只有一个代码段,所以无需作其他配置,接下来一直回车直到出现命令行的出现。
如下图所示:
(4)输入“1.exe”运行程序,会看到一个短暂的黑屏,然后回到DOS命令行,程序运行完毕。
至此,我们完成了1.asm文件的编译、连接和运行,但是,我们并没有看到运行程序的过程。
PS:
- XXX.com文件大小为64KB,只能有一个段。
XXX.exe文件可以很大,其中一般有多个段。
所以当你编写的程序中只有一个段,可以考虑使用XXX.com文件执行,可以用于伪装。 - 可以用“ML 1.asm”指令来编译并连接程序,并且文件后缀和文件名有时可省略,因为已默认文件位置和类型。
- 可以指定文件生成的位置,只需在执行文件前加上路径
- Link的作用:可以将源程序分开编译,然后将它们连在一起
- 在命令行输入指令后加分号,可以使编译器忽略中间文件的生成,更简捷
4.对于DOS程序运行原理的解释
(1)任何通用系统都要提供shell(外壳)程序,用户使用此程序来操作计算机系统进行工作。
(2)DOS中有一个程序command.com,这个程序在DOS中称为命令解释器,也就是DOS系统的shell。
(3)DOS启动时,先完成其他重要的初始化工作,然后运行command.com,command.com运行后,执行完其他的相关任务后,在屏幕上显示出由当前盘符和当前路径组成的提示符,比如:“c:\”或“c:\windows”等,然后等待用户的输入。
(4)command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序的入口。此后,command暂停运行,CPU运行程序。程序运行结束后,返回到command中,command再次显示由当前盘符和当前路径组成的提示符,等待用户的输入。在DOS中,command处理各种输入:命令或要执行的程序的文件名。我们就是通过command来进行工作的。
故汇编程序的完整执行过程为:
编程 (Edit) 一>l.asm一>编译(masm)一>1.obj一>连接(link)一>1.exe一>加载 (command) 一>内存中的程序一>运行(CPU)
5.跟踪程序的执行
在源程序的汇编指令前加标号(对段命名),并在end后加上这个标号,就给程序设置了一个入口。
Debug利用中断指令实现对程序的跟踪。
CX中存放程序的长度。
上图说明内存中程序存放在DS地址+10H(即256字节)处,这256字节里存放着PSP,DOS用来和程序通信。
故程序的物理地址为:(X+16)x16+0 (左移一格)
可用段地址和偏移地址:X+10H:0
Debug的执行原理:command加载Debug,Debug加载1.exe。程序结束后从1.exe中的程序返回到Debug,从Debug返回到command。