1.DOS中的程序运行
DOS是一个单任务的操作系统
一个程序P2的可执行文件,则必须有一个正在运行的程序P1, 将P2的加载到内存,将CPU的控制权交给P2,P2才得以运行。
P2开始运行后,p1暂停运行, 当P2运行完毕后,应将CPU的控制权交还给使得他运行的程序P1,使得继续运行。
2.程序的返回
在程序的末尾添加程序段
mov ax,4c00H
int 21H
3.将数据、代码、栈放入不同的段
assume cs:code,ds:data,ss:stack
data segment
dw 0123H,0456H
data ends
stack segment
dw 0,0
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,4
mov ax,data
mov ds,ax ; 引用 ds:[1]
mov bx,0
mov cx,2
s: push [bx] ;基于 ds的偏移 ds:[bx]
add bx,2
loop s
mov bx,0
mov cx,2
s0: pop ds:[bx]
add bx,2
loop s0
mov ax,4c00H
int 21H
code ends
end start
用 cs:code 会把code的指令连接到代码段
ds:data 会把data的指令连接到数据段
ss:stack 会把stack的指令连接到栈端
这个任务由编译器通过伪指令来完成
Q:CPU是如何知道去执行它们的呢?
A:我们在源程序的最后用" end start" 说明程序的结束,已经 "start" 标明的程序的入口,
这个入口将被写入可执行文件的描述信息,可执行文件被加载到内存后,CPU的CS:IP被设置执行这个入口,从而开始执行程序中的第一条指令。
注意start入口 写在执行指令的前面 如果再 data段中,他会把数据段的指令当做指令来执行 就会出现错误.
如果去掉前面的start 则上面的程序是不正确的。 CPU就会把第一个 dw 0123H,0456H 当做代码段来执行,如果code segment在最前面 那就是正确的,建议都加上伪指令。