一个汇编语言程序从写出到最终执行的简要过程:1.用汇编语言写源程序 2.对源程序进行编译链接 3.执行可执行文件中的程序。操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化
1.一段简单的汇编语言源程序:
assume cs:code
code segment
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,bx
mov ax,4c00H
int 21H
code ends
end
说明:汇编语言源程序中,包含两种指令,一种是汇编指令,一种是伪指令。汇编指令是有对应的机器码的指令,最终为CPU执行。伪指令没有,是由编译器来执行的指令,编译器根据伪指令进行相关的编译工作
assume cs:code ->将有特定用途的段和相关的段寄存器关联起来
code segment ->定义一个段,段的名称为‘code’ ,这个段从此开始
...
code ends ->结束‘code’段 PS:一个汇编程序是由多个段组成的,这些段被用来存放代码,数据或当作栈空间来使用
end ->一个汇编程序的结束标记
2.程序怎样得到运行
在DOS系统中,一个程序P2在可执行文件中,则必须有一个正在运行得程序P1,将P2从可执行文件中加载入内存后,将CPU的控制权交给P2,P2才能运行,P2开始运行后,P1暂停运行,当P2运行结束后,将CPU的控制权交还给P1(P1将控制权交给P2前,先将P1此时的寄存器状态保存,在恢复P1运行时,恢复P1暂停时的各个寄存器的值)。
一个程序结束后,将CPU的控制权交还给使得它可以运行的程序,这个过程叫做:程序返回。mov ax,4c00H
int 21H
这两条指令实现的功能就是程序返回
3.编辑,编译,连接
编辑:用汇编语言写出源代码
编译:使用编译器,将源代码翻译为机器码,得到目标文件
连接:对目标文件进行连接,得到可执行文件
问题4.1
有一个正在运行的程序将1.exe可执行文件中的程序加载入内存,这个正在运行的程序是什么?它将程序加载入内存后,如何使得程序得以运行?
操作系统的外壳shell。。。。。。
汇编程序从写出到执行的过程:
编程 -> 1.asm-> 编译-> 1.obj-> 连接-> 1.exe-> 加载-> 内存中的程序-> 运行
(Edit) (masm) (link) (command) (CPU)
DOS系统中.exe文件中的程序的加载过程:
1.找到一段起始地址为SA:0000(起始地址的偏移地址为0)的容量足够的空闲内存区。
2.在这段内存区的前256个字节中,创建一个称为程序段前缀(PSP)的数据区,DOS要利用PSP来和被加载程序进行通信。
3.从这段内存区的256字节处开始(在PSP的后面),将程序装入,程序的地址被设为SA+10H:0;
地址安排:
空闲内存区:SA:0
PSP区:SA:0
程序区:SA+10H:0
TIPS:PSP区和程序区虽然物理地址连续,却有不同的段地址
4.将该内存区的段地址存入ds中,初始化其它相关寄存器后,设置CS:IP指向程序的入口
实验3 编程,编译,连接,跟踪
(1)将下面的程序保存为1.asm,将其生成可执行文件1.exe
assume cs:code
code segment
mov ax,2000H
mov ss,ax
mov sp,0
add sp,10 ;设置栈 段地址和栈顶指针
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax,4c00H
int 21H
code ends
end
跟踪执行过程,了解每一步执行后,相关寄存器中的值。此处实验可以和实验2 相结合了解。2000:0地址处保存中断例程的寄存器变量。