zoukankan      html  css  js  c++  java
  • 第一个程序03 零基础入门学习汇编语言22

    第四章:第一个程序03

     

    让编程改变世界

    Change the world by program


     

    可执行文件中的程序装入内存并运行的原理

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

    1.exe的执行过程

    1)我们在提示符“G:TRY”后面输入可执行文件的名字“1”,按Enter键。 2)1.exe中的程序运行; 3)运行结束,返回,再次显示提示符“G:TRY”。 执行第(1)步操作时,有一个正在运行的程序将1.exe中的程序加载入内存,这个正在运行的程序是什么? 它将程序加载入内存后,如何使程序得以运行? 执行第(3)步操作,程序运行结束后,返回到哪里?  

    知识扩充:

    操作系统的外壳 操作系统是由多个功能模块组成的庞大 、复杂的软件系统。任何通用的操作系统 ,都要提供一个称为shell(外壳)的程序 ,用户(操作人员)使用这个程序来操作计算机系统工作。 DOS中有一个程序command.com ,这个程序在 DOS 中称为命令解释器,也就是DOS系统的shell。 (1)我们在DOS中直接执行 1.exe 时,是正在运行的command将1.exe中的程序加载入内存。 (2)command设置CPU的CS:IP指向程序的第一条指令(即程序的入口),从而使程序得以运行。 (3)程序运行结束后,返回到command中,CPU继续运行command。  

    汇编程序从写出到执行的过程

      [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/4_一个源程序从写出到执行的过程.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] Get Adobe Flash player [/kml_flashembed]

    程序执行过程的跟踪

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

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

    [caption id="attachment_312" align="aligncenter" width="300"] 用R命令看一下各个寄存器的设置情况[/caption]   可以看到,Debug将程序从可执行文件加载入内存后,cx中存放的是程序的长度。1.exe 中程序的机器码共有15个字节。 现在程序已从 1.exe 中装入内存,接下来我们查看一下它的内容,可是我们查看那里的内容呢? 程序被装入内存的什么地方? 我们如何得知?  

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

    [caption id="attachment_313" align="aligncenter" width="300"] EXE文件中的程序的加载过程[/caption] 注意:有一步称为重定位的工作我们在上面没有讲解,因为这个问题和操作系统的关系较大,我们不作讨论(在小甲鱼的《解密系列》系统篇之PE结构有详细讲解到,有兴趣的鱼油们可以参考学习下)。  

    总结

      程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0 ,则程序所在的内存区的地址为:ds:0; 这个内存区的前256 个字节中存放的是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。  

    程序执行过程的跟踪原理

     

    用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。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LPVNZLIALTMV']视频下载[/Downlink]
  • 相关阅读:
    CentOS 7.3 CDH 5.10.0 Druid0.12.4安装记录
    cloudera manager卸载流程
    CDH5.10.0 离线安装(共3节点) 转
    CentOS 7 安装Httpd(转)
    CentOS下MySQL的彻底卸载
    CentOS7 修改主机名
    sendEvent()
    QSignalMapper Class
    ubuntu12.04开启虚拟机的unity模式
    BCM_I2C函数更改
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3845998.html
Copyright © 2011-2022 走看看