缌唸 发表于 2013-10-5 09:24:15

实验10 搞不懂 谁帮一下 啊

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

(1)下面的程序执行后,ax中的数值为多少?
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:
   inc ax
   inc ax
   inc ax
   mov ax,<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />4c00h
   int 21h
code ends
end start

推算:
执行call word ptr ds:指令时,先cs入栈,再ip=11入栈,最后ip转移到(ds:)。(ds:)=11h,执行inc ax……最终ax=3



上面的是答案,可是我搞不懂 call word ptr ds: 这条命令 执行过程是啥啊? 还有ds的段地址是啥啊?还有为啥答案说要先将cs入栈,再将ip入栈 ,可是书上明明写的是只将ip入栈啊.只有是call dword ptr 才将cs ip 一块入栈,是答案错了还是什么?求解啊

machine1 发表于 2013-10-5 09:24:16

缌唸 发表于 2013-10-5 11:23 static/image/common/back.gif
为啥 ip=11啊还有 jmo word ptr 跳转到哪里 (就是cs 和ip的值是啥)

我自己是这样理解的,没必要太纠结于ip具体等于多少,
执行 call word ptr内存单元的时候,可以看成分两步进行
1 读取指令,ip加上指令长度
2 执行指令

其中,第一步,ip加上call指令的长度之后,实际上指向了call 下面的一条指令,就是15行的inc ax,
第二部,执行指令,将ip压入栈中,这个ip实际上是inc ax这条指令得地址。
即 栈中的数据是15行inc ax指令的地址

jmp word ptr 内存单元 ,这条指令执行后,cs不变,ip改成内存中存储的数据。
这么说或许还不太容易明白,建议画一张图看看,详细的看看栈中的数据存放位置。

machine1 发表于 2013-10-5 09:59:43

1 call word ptr 内存单元 执行过程是
push ip;jmp word ptr 内存单元
2 ds的段地址是啥?
这个问题听不明白。ds不就是数据段寄存器吗?就是在开头定义的那段数据的段地址
3 我也认为只是将ip入栈,答案错了,我从前还没看答案呢,呵呵

缌唸 发表于 2013-10-5 11:23:16

machine1 发表于 2013-10-5 09:59 static/image/common/back.gif
1 call word ptr 内存单元 执行过程是
push ip;jmp word ptr 内存单元
2 ds的段地址是啥?


为啥 ip=11啊还有 jmo word ptr 跳转到哪里 (就是cs 和ip的值是啥)

machine1 发表于 2013-10-5 12:11:49

至于你说的 为什么 ip=11,这个要了解每条指令的长度,或者在debug中查看,可以尝试下。

缌唸 发表于 2013-10-5 21:38:25

machine1 发表于 2013-10-5 12:11 static/image/common/back.gif
至于你说的 为什么 ip=11,这个要了解每条指令的长度,或者在debug中查看,可以尝试下。

哦 谢谢 我去试试

baby520 发表于 2013-10-7 17:45:46

还没学到。。。

dwlsxj 发表于 2013-10-8 22:46:10

我认为是这样的,call word ptr ds:,这里访问的数据段和栈段是一致的,call指令可以分解为两个指令push ip,jmp word ptr ds,当你调用call时,是把call执行之后要执行下一条的Ip推向栈为0e处,再调用jmp word ptr ds刚好调用的是inc ax 的ip

风吹绿野 发表于 2013-11-18 12:50:37

路过看看哈
页: [1]
查看完整版本: 实验10 搞不懂 谁帮一下 啊