一个源程序从写入到执行的过程
共分为三部:
- 编写源程序
- 编译连接,编译后生成的可执行文件分为两部分:
- 程序和数据
- 相关的描述信息(提供给操作系统的)
- 执行
在操作系统中,执行可执行文件时。操作系统将按照可执行文件中的描述信息,将可执行文件中的机器码和数据加载进入内存,并进行相应的初始化。
源程序
assume cs:codesg
codesg segment
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,ax
codesg ends
end
该段源程序分为三部分
- 伪指令
- 程序(汇编指令)
- 标号
伪指令没有对应的机器码(不是汇编指令)。被编译器来执行。
比如segment
和ends
就是一对成对使用的伪指令,这是编写被编译器编译的汇编程序必须要使用的一对伪指令。segment和ends的功能就是声明一个段。segment说明一个段的开始,而ends则说明一个段的结束。一个段必须有一个名称来标识(标号)
一个汇编程序就是有多个段来组成的,分别用来存放数据和代码。一个源程序将计算机所要处理的信息按类别划分待不同的段中。
end
指令指示整个程序的结束。编译器如果碰到了伪指令end,就会结束对源程序的编译。
assume
假设某一段寄存器与程序中的某一个段相关联。在需要时编译程序可以将段寄存器和某一个具体的段相关联。
汇编源程序中的标号代表了一个地址,比如codesg作为一个段的名称。在他最终被编译以后,连接程序将其处理为一个段的段地址。
好像可以这样认为,一个汇编程序就是有程序段和数据段组成。
程序的返回
以DOS(单任务操作系统)为基础讨论。
程序P1将可执行文件P2装入内存,并将cpu控制权交给P2。P2开始运行,P1暂停。
P2运行结束,将cpu控制权交还给使他运行的程序P1,之后P1继续运行。
其中,这个交还cpu控制权的过程,称为程序返回。
其中,
mov ax,4c00H
int 21H
实现程序返回的功能。
语法错误和逻辑错误
语法错误就是一般可以在编译期间发现的错误
而逻辑错误通常要在程序运行中才能够发现。
其中,逻辑错误要比语法错误能以解决。
谁将可执行文件中的程序装在如内存并使他运行
对于DOS环境,也就是是command.exe(系统shell)。
任何通用操作系统都会提供一个shell(壳)程序,这是用户和系统进行交互的接口(方式之一)。
debug为什么能实现程序执行的跟踪
这是因为和shell执行可执行文件不同,debug并不会完全放弃对cpu的控制。
debug将可执行文件装入内存以后,cx中存放程序的长度(汇编指令的长度)
PSP占256个字节,观察图4.19可以发现ds和cs相差10H。这也可以从侧面证明这一点。
PSP是DOS用来和程序进行通信的,之后才存放的是真正的程序。