8086汇编-22第一个程序03

#pragma once
/*  22-第一个程序03

  可执行文件中的程序装入内存并运行的原理
    在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的程序P2 ,将 P1 从可执行文件中加载入内存,将CPU的控制权交给它,P1才能得以运行;当P1运行完毕后,应该将CPU的控制权交还给使它得以运行的程序P2。

    1.exe的执行过程
        (1)我们在提示符(CMD)“G:\TRY”后面输入可执行文件的名字“1”,按Enter键。            “G:\TRY” 是文件目录.. 这里写成自己的文件目录即可 .
        问题:  执行第(1)步操作时,有一个正在运行的程序将1.exe中的程序加载入内存,这个正在运行的程序是什么?它将程序加载入内存后,如何使程序得以运行?
                答案 当然是cmd(command) 执行的 

        (2)1.exe中的程序运行;
        (3)运行结束,返回,再次显示提示符“G:\TRY”。
        问题:  执行第(3)步操作,程序运行结束后,返回到哪里?
                答案返回到 调用它的程序中,也就是CMD


  操作系统的外壳
    操作系统是由多个功能模块组成的庞大 、复杂的软件系统。任何通用的操作系统 ,都要提供一个称为shell(外壳)的程序 ,用户(操作人员)使用这个程序来操作计算机系统工作。

    DOS中有一个程序command.com ,这个程序在 DOS 中称为命令解释器,也就是DOS系统的shell。


  回答问题
    (1)我们在DOS中直接执行 1.exe 时,是正在运行的command将1.exe中的程序加载入内存。

    (2)command设置CPU的CS:IP指向程序的第一条指令(即程序的入口),从而使程序得以运行。

    (3)程序运行结束后,返回到command中,CPU继续运行command。

  可执行文件中的程序装入内存并运行的原理
    汇编程序从写出到执行的过程:
        编程 -- 1.asm -- 编译 -- 1.obj -- 连接 -- 1.exe -- 加载 -- 内存中的程序 -- 运行
    过程(edit)           (masm)           (link)          (command)                (cpu)

  程序执行过程的跟踪
    为了观察程序的运行过程 ,我们可以使用Debug。

    Debug 可以将程序加载入内存,设置CS:IP指向程序的入口,但Debug并不放弃对CPU 的控制,这样,我们就可以使用Debug 的相关命令来单步执行程序 ,查看每条指令指令的执行结果。

    接下来可以用R命令看一下各个寄存器的设置情况:

        

 

    可以看到,Debug将程序从可执行文件加载入内存后,cx中存放的是程序的长度。1.exe 中程序的机器码共有15个字节。

    现在程序已从 1.exe 中装入内存,接下来我们查看一下它的内容,可是我们查看那里的内容呢?

    程序被装入内存的什么地方?

    我们如何得知?

    在DOS系统中.EXE文件中的程序的加载过程如下

        
  EXE文件中的程序的加载过程

 

    注意:有一步称为重定位的工作我们在上面没有讲解,因为这个问题和操作系统的关系较大,我们不作讨论。


    总结
        程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0 ,则程序所在的内存区的地址为:ds:0;

        这个内存区的前256 个字节(100H)中存放的是PSP,dos用来和程序进行通信。

        从 256字节处向后的空间存放的是程序。

        所以,我们从ds中可以得到PSP的段地址SA,PSP的偏移地址为 0,则物理地址为SA*16+0。

        因为PSP占256(100H)字节,所以程序的物理地址是:
           SA*16+0+256= SA*16+16*16=(SA+16)*16+0
           可用段地址和偏移地址表示为:SA+10:0。
            意思就是 程序真正的 代码部分是 SA*16+100H ,就是cs段寄存器 + 10  IP:0 的位置,因为PSP 头会占用256个字节,也就是100H,刚开始时候DS 指向的是程序真正的入口,CS指向的是我们编辑的入口,但是实际上我们需要
的是CS 指向的入口.

  程序执行过程的跟踪
    用U命令查看一下其他指令:

    用T命令单步执行程序中的每一条指令,并观察每条指令的执行结果

    到了 int 21,我们要用P命令执行:

    int 21 执行后,显示“Program terminated normally”,返回到Debug中。

    表示程序正常结束。

    注意,要使用P命令执行int 21。            如果不使用这个命令,就会乱跳到其他地方,回不来咯.

    需要注意的是,在 DOS 中运行程序时,是command将程序加载入内存;

    所以程序运行结束后返回到command中,而在这里是debug 将程序加载入内存,所以程序运行结束后要返回到Debug中。

    使用Q命令退出Debug,将返回到command中,因为Debug是由command加载运行的。

    我们在 DOS中用 “Debug 1.exe” 运行Debug对1.exe进行跟踪时,程序加载的顺序是:command加载Debug,Debug加载1.exe。

    返回的顺序是:从1.exe中的程序返回到Debug,从Debug返回到command。
    

实验三要独立完成再继续学习!!
   

 

    答案 (1) 在tl.asm  tl.obj tl.exe 三个文件
            (2) 自己拿着文件执行去
            (3) 2个命令  debug tl.exe       d ds:0
*/        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值