第一个程序
前言
4.1 一个源程序从写出到执行的过程
4.2 对源程序进行编译连接
使用编译程序MASM.exe对源程序文件中的源程序进行编译,产生目标文件,即.obj文件
。
再用连接程序LINK.exe对目标文件进行连接,生成可以在操作系统中直接运行的可执行文件,即.exe文件
。
源程序:
可执行文件
可执行文件中包含两部分:
程序:源程序汇编指令翻译的机器码。
数据:源程序中定义的数据。
相关的描述信息:程序大小,内存空间等。
汇编指令
- 有对应的机器码的指令,可以被编译为机器指令,最终为CPU执行。
伪指令
- 没有对应机器码的指令,最终不被CPU所执行。由编译器来执行。
segment ends 定义一个段
segment,ends,这两个成对使用的伪指令。
segment:定义一个段开始。
ends:定义一个段结束。
一个段必须有一个名称来标识:
- 段名 segment
- 段名 ends
一个汇编程序是由多个段组成的,这些段用来存放代码、数据或栈空间来使用。至少有一个段来存放代码。
- end是一个汇编程序的结束标记,代表着源程序的结束编译,不可或缺一定要加在结尾。
不要搞混ends和end。
assume 寄存器与段关联
- assume:假设一段寄存器和程序中某一个用segment——ends定义的段相关联。
汇编源程序:
- 伪指令(编译器处理)
- 汇编指令(编译为机器码)
程序:源程序中最终由计算机执行、处理的指令或数据。
案例:
这其中所有代码合称为源程序。
程序经编译连接后变成机器码。
codesg 标号
一个标号指代一个地址。
- codesg:放在segment之前,作为一个段的名称,最终被处理为一个段的段地址。
4.3 程序返回、段结束、程序结束、段返回
- 程序返回:
DOS为单任务操作系统
,一个程序p2作为可执行文件,必须有一个正在运行的程序p1,将p2从可执行文件中加载进内存后,p1将CPU控制权交给P2,p2开始运行,p1暂停运行。p2运行完后,把控制权交回p1.。这整个过程称为程序返回. - mov ax,4c00H
- int 21H
这两条指令所实现的功能就是程序返回。
4.4 1.exe的执行
问题
1)***DOS中有一个command,即CMD称为命令解释器,也就是DOS的shell。***是CMDshell将1.exe加载进内存。
2)CMD设置CPU的CS:IP执行程序的第一条指令,从而运行程序。
3)程序运行结束后,返回到CMD中,CPU继续运行CMD。
从编程到CPU运行的过程(重要)
程序真正开始在SA+10H:0,因为这一段地址需要给PSP数据区。
从CS:0100H开始是程序真正开始。即DS和CS之间相差10。
总结
程序加载后,DS中放着程序所在内存区的段地址,这个内存区的偏移地址为0。
程序所在内存区的地址为:DS:0。
内存区的前256字节存放PSP数据区,DOS用来和程序进行通信。
256字节后的空间存放的是程序。
故PSP段地址为SA,PSP偏移地址为0,物理地址即为SA*16+0
因PSP占256字节,所以程序的物理地址为:SA*16+0+256
用段地址和偏移地址表示为:SA+10:0
4.5 程序执行过程的跟踪
最后程序返回的命令不能用t执行,需要用P执行。