现在的位置: 首页 > 综合 > 正文

为什么程序开始用PUSH DS等

2018年02月11日 ⁄ 综合 ⁄ 共 1090字 ⁄ 字号 评论关闭

 = 问题 =
  这是一个程序的开始部分.
...
code segment
assume cs:code,s:data
main proc par
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
...
这段代码您因该可以看的懂了.这是我书上面例子的一部分,几乎每一个例子开始
都的这样的.但我现在有些地方也不明白.
push ds
push ax
ds, ax它们不是都还没有赋值的吗,但这时为什么要入栈呢.里面又有什么值的.

还有sub ax,ax
有些地方是xor ax,ax 或add ax,ax
ax不是也没赋值吗,做这些运算有意义吗?

谢谢高手了.耐心一点啦.指点指点兄弟吧.. 
 

--------------------------------------------------------------------------------
  在程序中一些PUSH,是为了保存值的
等到用时POP就可以啦

什么sub、ADD,那样看程序才能知道有什么具体的意思

不知道你看的是什么书
上来就保存PSP段值,挺老的吧。

(再细细看来,好像错啦)
我猜你的第六行写错啦,应该是Xor ax,ax
我再说详细些吧。

开始将PSP段值压入然后将0压入,这里的0是指偏移0
到最后执行到ret时,从堆栈取出开始时压入的PSP段值与偏移
到CS和IP,随后CPU就执行位于PSP首的指令 "int 20h "
程序结束,回到DOS

大多数程序是为了结束自己才这样做的
我个人认为,这种方法太古老啦。
现在流行的是将
mov ah,4ch
int 21h

现在用PSP一般都是为了取命令行
呵呵

讲得够详细的啦,不知道你明白否?
---------------------------------------------------------------
1、push ds
push ax
ds, ax它们不是都还没有赋值的吗,但这时为什么要入栈呢.里面又有什么值的.

答:
在程序刚开始时,DS=ES=PSP,所以PUSH DS就是把PSP的值压栈。
SUB AX,AX
PUSH AX
SUB AX,AX就是把AX的值自己减去自己,那结果当然是AX=0了;所以这两句就是把0压栈。
这些是为了程序结束时的RETF(或者RET)时用的。到那时CS:IP=PSP:0,也就是INT 20H(返回DOS的中断)。

2、还有sub ax,ax
有些地方是xor ax,ax 或add ax,ax

答:xor就是把两个数字的相对应的每位进行这样处理:相同为0不同为1。
AX和AX的相对应的每位自然是相同的(不管它的值是多少),所以其效果等于把AX清零。
至于这里用“add ax,ax”,那肯定是你看错了。

 

  
 

抱歉!评论已关闭.