回 帖 发 新 帖 刷新版面

主题:请教一下

程序里刚开始有一段不明白,希望解释下,谢谢

   push ds
   mov  ax,0
   push ax

回复列表 (共3个回复)

沙发

这是旧式汇编退出程序的方法。

程序在内存中加载后,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

这是后期推荐的方式。

板凳

楼上的真实高人,佩服佩服~~

3 楼

我对此有些疑问。
返回指令ret
功能:安装call指令入栈的逆序,从栈顶弹出返回地址(弹出一个子到IP,若子程序是far型还需再弹出一个字到CS),然后返回主程序继续执行

如果程序过程未经说明,则默认是near,那么ret只弹出ip

对于exe程序,dos未把cs初始化成PSP基址,

那么cs:ip也就不指向psp段的0偏移,又如何返回呢?

请教.

我来回复

您尚未登录,请登录后再回复。点此登录或注册