在上篇文章《汇编的第一个程序 》中,实现并运行了第一个汇编程序,但依然存在两个疑问;
1、谁将.exe文件中的程序装载进入内存并使它运行
在DOS启动时,先完成其他重要的初始化工作,然后运行 command.com,command.com运行后,通过用户的输入来完成其他相关的任务
如果输入的是可执行文件的名称,command首先通过文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序的入口,此后command暂停运行,CPU运行程序,程序结束后,返回到command中,继续提示用户输入。
本文地址:http://wuyudong.com/2016/09/13/2735.html,转载请注明源地址。
2、如何跟踪程序的执行过程
虽然上面讲到command在程序运行的时候对CPU失去控制权,但是DEBUG并不放弃对CPU的控制
具体方法:
debug 1.exe
可以输入r命令查看各寄存器的情况
debug将可执行文件加载入内存后,cx中存放的是程序的长度,1.exe的机器码共有15个字节,故cx=000F
(1)程序加载后,ds中存放着程序所在内存的段地址,这个内存区的偏移地址为0,则程序所在的内存区的地址为ds:0;
(2) 这个内存区的前256个字节中存放的是PSP,DOS用来和程序进行通信。从256字节向后的空间存放的是程序
从ds中可以查到PSP的段地址,DS = 075A,PSP的偏移地址为0,所以PSP的物理地址为:
SA×16+0=DS×16+0
因为PSP占256(100H)字节,所以程序的物理地址是:
SA×16+0+256=SA×16+16×16+0=(SA+16)×16+0
可用段地址和偏移地址表示为:SA+10H:0
由DS的值可知PSP的地址为:075A:0,程序的地址为076A:0(即075A+10:0)
CS = 076A , IP = 0000(CS:IP指向程序的第一条指令)
可以使用U命令查看其它的指令
可以看到从076A:0000~076A:000E都是程序的机器码
然后使用T命令单步执行程序
接下来实践一下:将下面的程序保存为t1.asm
assume cs:codesg codesg 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 codesg ends end
执行masm t1; link t1; 生成t1.exe
根据上面的跟踪命令进行观察寄存器内容的变化
Comments