汇编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
call 这个指令 是先要 push cs ip 的 所以call到的应该是 CS的地址 正确的跳转位子应该是当前的DS : CS 我说反了 纠正一下 先PUSH IP cs 首先要明确,在执行call指令时,ip指向的是下一条指令的地址。也就是inc ax指令的地址。怎么会是0呢!而执行call指令时有两个操作,第一将ip入栈,第二是跳到word ptr ds:对应的地址进行执行。执行完毕后返回主流程继续执行。至于一些细节lz画图自己琢磨吧。 本帖最后由 属専色灰 于 2013-4-3 00:03 编辑
小小小小鱼 发表于 2013-4-2 08:45 static/image/common/back.gif
我说反了 纠正一下 先PUSH IP cs
你想把我弄晕么? 本帖最后由 属専色灰 于 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
是我把栈和数据存放没搞清楚
属専色灰 发表于 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处),而这个地址的内容正好是下一条指令的地址。 1971827035 发表于 2013-4-3 08:46 static/image/common/back.gif
这个不用猜测。在执行call指令时,ip指向下一条指令(inc ax)的地址,所以将改地址入栈。入栈前sp=10h, ...
恩,问题搞清楚了,鱼油们都是好人来着!谢谢!!!
页:
[1]