第四章 第一个程序

一个汇编语言程序从写出到最终执行的简要过程: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地址处保存中断例程的寄存器变量。

原文地址:https://www.cnblogs.com/linxisuo/p/13212859.html