关于汇编程序的执行问题
在DOS中,可执行文件中的程序P1若要运行,必须有一个正在运行的程序p2,将p1从可执行文件中加载入内存,将CPU的控制权交给它.p1才能够运行,当p1运行完毕后,应该将cpu的控制权交还给使她得以运行的程序p2
思考问题
- 在提示符C:\masm后面输入可执行文件的名字”1”,按下回车enter键,这时,思考问题4.1
- 1.exe运行
- 运行结束后,返回。再次显示提示符C:masm.思考问题4.2
4.1 此时,有一个正在运行的程序将1.exe中的程序加载入内存,这个正在运行的程序是什么?它将程序加载入内存后,如何使程序得以运行?
操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统,都要提供一个成为shell的程序,用户使用这个程序来操作计算机系统进行工作。
DOS中有一个程序command.com,这个程序在DOS中成为命令解释器,也就是DOS系统的shell。
DOS启动时,先完成其他重要的初始化工作,然后运行command.com,command.com运行后,执行完其他相关的任务后,在屏幕上显示出当前盘符和当前路径组成的提示符,等待用户输入。
用户可以输入所要执行的命令,如:cd、dir、type等,这些命令由command执行,command执行完这些命令后,再次显示由当前盘符和当前路径组成的提示符,等待用户输入。
如果用户要执行一个程序,则输入该程序的可执行文件的名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载到内存中,设置CS:IP指向程序的入口。此后command暂时停止运行,CPU运行程序。程序运行结束后,返回到command中,command再次显示出由当前盘符和当前路径组成的提示符,等待用户输入。
在DOS中,command处理各种输入:命令或要执行的程序的文件名。我们就是用过command来进行工作的。
4.2 程序运行结束后,返回到了哪里?
程序运行结束后,返回到了command中。
汇编程序从写出到执行的过程
编程 -> 1.asm -> 编译 -> 1.obj -> 链接 -> 1.exe -> 加载 -> 内存中的程序 -> 运行
观察下面程序执行过程中,寄存器和栈顶元素的变化
assume cs:codeseg
codeseg segment
start:  mov ax,2000H
        mov ss,ax
        mov sp,0
        pop ax
        pop bx
        push ax
        push bx
        pop ax
        pop bx
    
    mov ax,4c00H
    int 21h
codeseg ends
end start
endax bx 各出入栈。IP和SP指针在变化,其余寄存器没看到变化。栈顶元素最后还是变化到跟初始状态下一致了
PSP的头两个字节时CD20,其中的内容为

 
                        
                        