主题:请教一下
kidants
[专家分:0] 发布于 2006-03-29 18:08:00
程序里刚开始有一段不明白,希望解释下,谢谢
push ds
mov ax,0
push ax
回复列表 (共3个回复)
沙发
C语言爱好者 [专家分:19410] 发布于 2006-03-29 19:37:00
这是旧式汇编退出程序的方法。
程序在内存中加载后,ds的值是该程序PSP的段值,PSP的头两个字节,保存着一条指令:cd 20,就是int 20h。int 20h是从dos1.0开始提供的旧式退出DOS的方法,int 20h实际上调用的是DOS内核21h的0号功能。
在程序开头push ds,就保存了指向cd 20的段值,由于偏移为0,因此只要再push一个0值就行了,由于80386之前不能push立即数,就改为push ax了。保存了这两个16位数后,退出程序时,ret就会用开头保存在栈中的那两个16位段值和偏移分别修改CS和IP,使程序运行PSP头两个字节的int 20h指令,于是就返回到DOS了。
现在已经不再使用这种方式了,而是直接
mov ax, 4c00h
int 21h
这是后期推荐的方式。
板凳
blueskyhao [专家分:100] 发布于 2006-03-31 23:31:00
楼上的真实高人,佩服佩服~~
3 楼
yrd2002 [专家分:1000] 发布于 2006-04-09 09:59:00
我对此有些疑问。
返回指令ret
功能:安装call指令入栈的逆序,从栈顶弹出返回地址(弹出一个子到IP,若子程序是far型还需再弹出一个字到CS),然后返回主程序继续执行
如果程序过程未经说明,则默认是near,那么ret只弹出ip
对于exe程序,dos未把cs初始化成PSP基址,
那么cs:ip也就不指向psp段的0偏移,又如何返回呢?
请教.
我来回复