属専色灰 发表于 2013-4-2 02:44:54

汇编10.5的问题

本帖最后由 属専色灰 于 2013-4-3 20:50 编辑

assume cs:code

stack segment   //定义了栈段
   dw 8 dup (0)
stack ends

code segment
start:   mov ax,stack
         mov ss,ax   //开始挂钩
               mov sp,16
               mov ds,ax//把定义的栈当做数据来使用
               mov ax,0
               call word ptr ds: //这里有问题?想不通,ip不是应该等于0么,因为我们的栈段已经把里面的数据全部写为                                          //零,那么为什么还会是会跳到一个莫名其妙的地址上去,没睡的鱼油们帮忙开导一下!
               inc ax
               inc ax
               inc ax
               
               mov ax,4c00h
               int 21h
               
code ends

end start


小小小小鱼 发表于 2013-4-2 08:30:55

call 这个指令 是先要 push cs ip 的 所以call到的应该是 CS的地址   正确的跳转位子应该是当前的DS : CS

小小小小鱼 发表于 2013-4-2 08:45:05

我说反了 纠正一下 先PUSH IP      cs

1971827035 发表于 2013-4-2 14:38:39

首先要明确,在执行call指令时,ip指向的是下一条指令的地址。也就是inc ax指令的地址。怎么会是0呢!而执行call指令时有两个操作,第一将ip入栈,第二是跳到word ptr ds:对应的地址进行执行。执行完毕后返回主流程继续执行。至于一些细节lz画图自己琢磨吧。

属専色灰 发表于 2013-4-2 23:53:34

本帖最后由 属専色灰 于 2013-4-3 00:03 编辑

小小小小鱼 发表于 2013-4-2 08:45 static/image/common/back.gif
我说反了 纠正一下 先PUSH IP      cs
你想把我弄晕么?

属専色灰 发表于 2013-4-2 23:56:17

本帖最后由 属専色灰 于 2013-4-3 00:04 编辑

1971827035 发表于 2013-4-2 14:38 static/image/common/back.gif
首先要明确,在执行call指令时,ip指向的是下一条指令的地址。也就是inc ax指令的地址。怎么会是0呢!而执行 ...
我懂了,oeh是ip的值,所以,他跳的应该是下一句代码,对吧!
inc ax

是我把栈和数据存放没搞清楚

1971827035 发表于 2013-4-3 08:46:34

属専色灰 发表于 2013-4-2 23:56 static/image/common/back.gif
我懂了,oeh是ip的值,所以,他跳的应该是下一句代码,对吧!
inc ax



这个不用猜测。在执行call指令时,ip指向下一条指令(inc ax)的地址,所以将改地址入栈。入栈前sp=10h,入栈后sp=sp-2,也就是0eh。而此时程序将跳转到ds:0eh处执行,因为ds/ss同段,所以程序跳转到栈地址0eh处执行(ip指向0eh处),而这个地址的内容正好是下一条指令的地址。

属専色灰 发表于 2013-4-3 20:50:00

1971827035 发表于 2013-4-3 08:46 static/image/common/back.gif
这个不用猜测。在执行call指令时,ip指向下一条指令(inc ax)的地址,所以将改地址入栈。入栈前sp=10h, ...

恩,问题搞清楚了,鱼油们都是好人来着!谢谢!!!
页: [1]
查看完整版本: 汇编10.5的问题