工学1号馆

home

汇编程序执行过程的跟踪

Wu Yudong    September 13, 2016     Assembly   611   

在上篇文章《汇编的第一个程序 》中,实现并运行了第一个汇编程序,但依然存在两个疑问;

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命令查看各寄存器的情况

QQ截图20160913150932

debug将可执行文件加载入内存后,cx中存放的是程序的长度,1.exe的机器码共有15个字节,故cx=000F

QQ截图20160913152312

(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命令查看其它的指令

QQ截图20160913161828

可以看到从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

No comments yet.
To verify that you are human, please fill in "七"(required)