shuiyu 发表于 2017-7-1 22:08:55

《零基础入门学习汇编语言》第二十二讲

小白刚学,不对的请各位大佬指正,谢谢{:10_254:}

由于我权限不够,只能贴三张图;所以很多过程无法展示,望大家见谅{:10_250:}

PS:我们昨天的Hello world是没有加上入口的,所以今天要加上哦。(见下图红圈中就是加上入口)


一、可执行文件中的程序装入内存并运行的原理
(1)操作系统的外壳:操作系统是由多个功能模块组成的庞大 、复杂的软件系统。任何通用的操作系统 ,都要提供一个称为shell(外壳)的程序 ,用户(操作人员)使用这个程序来操作计算机系统工作。DOS中有一个程序command.com ,这个程序在 DOS 中称为命令解释器,也就是DOS系统的shell。(其实就是我们的cmd.exe窗口)

(2)1.exe的执行过程:
1.我们在提示符“G:\TRY”后面输入可执行文件的名字“1”,按Enter键。
2.1.exe中的程序运行;
3.运行结束,返回,再次显示提示符“G:\TRY”。
问题4.1:执行第(1)步操作时,有一个正在运行的程序将1.exe中的程序加载入内存,这个正在运行的程序是什么?
答:我们在DOS中直接执行 1.exe 时,是正在运行的command将1.exe中的程序加载入内存。
问题4.1:它将程序加载入内存后,如何使程序得以运行?
command设置CPU的CS:IP指向程序的第一条指令(即程序的入口),从而使程序得以运行。
问题4.2:执行第(3)步操作,程序运行结束后,返回到哪里?
程序运行结束后,返回到command中,CPU继续运行command。


二、程序执行过程
(1)汇编程序从写出到执行的过程:



(2)使用Debug单步跟踪程序的运行:
1.使用R命令看各个寄存器时,可以看到,Debug将程序从可执行文件加载入内存后,cx中存放的是程序的长度。1.exe 中程序的机器码共有15个字节。

2.程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0 ,则程序所在的内存区的地址为:ds:0;这个内存区的前256 个字节中存放的是PSP,dos用来和程序进行通信。从 256字节处向后的空间存放的是程序。
3.所以,我们从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。

(3)注意:有一步称为重定位的工作我们在上面没有讲解,因为这个问题和操作系统的关系较大,我们不作讨论。
(4)到了 int 21,我们要用P命令执行:int 21 执行后,显示“Program terminated normally”,返回到Debug中。表示程序正常结束。(我们现在不用深究P命令有什么用,只要记住看到int 21时用P命令就行了)
(5)我们在 DOS中用 “Debug 1.exe” 运行Debug对1.exe进行跟踪时,程序加载的顺序是:command加载Debug,Debug加载1.exe。返回的顺序是:从1.exe中的程序返回到Debug,从Debug返回到command。(差不多就是上一讲中的单线程,一级一级的来分)



谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}


   
本节结束,多谢览阅!
小白刚学,不对的请各位大佬指正,谢谢{:10_254:}

杀手carry 发表于 2017-7-1 22:39:21

{:10_266:}

shuiyu 发表于 2017-7-2 13:51:47

杀手carry 发表于 2017-7-1 22:39


肿么了?{:10_277:}

nihility_z 发表于 2019-7-17 20:59:27

大神,您图一里面圈出来的那个"start"入口是什么啊,我听甲鱼老师讲了好几遍都没听懂,那个是干什么用的啊,求大神解答,越详细越好(我脑子笨),谢谢谢谢啦!{:10_250:}

员理管帅最 发表于 2019-10-22 15:08:25

好像是标志,告诉编译器这程序开始执行的地方,相当于C里面的mian()吧
页: [1]
查看完整版本: 《零基础入门学习汇编语言》第二十二讲