鱼C论坛

 找回密码
 立即注册
查看: 1792|回复: 8

实验10 搞不懂 谁帮一下 啊

[复制链接]
发表于 2013-10-5 09:24:15 | 显示全部楼层 |阅读模式
5鱼币
  1. <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

  2. (1)下面的程序执行后,ax中的数值为多少?
  3. assume cs:code
  4. stack segment
  5.      dw 8 dup (0)
  6. stack ends
  7. code segment
  8. start:   mov ax,stack
  9.      mov ss,ax
  10.      mov sp,16
  11.      mov ds,ax
  12.      mov ax,0
  13.      call word ptr ds:[0eh]
  14.      inc ax
  15.      inc ax
  16.      inc ax
  17.      mov ax,<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />4c00h
  18.      int 21h
  19. code ends
  20. end start

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

复制代码


上面的是答案,可是我搞不懂 call word ptr ds:[0EH] 这条命令 执行过程是啥啊? 还有ds的段地址是啥啊?还有为啥答案说要先将cs入栈,再将ip入栈 ,可是书上明明写的是只将ip入栈啊.
只有是call dword 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不变 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-5 09:24:16 | 显示全部楼层

我自己是这样理解的,没必要太纠结于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改成内存中存储的数据。
这么说或许还不太容易明白,建议画一张图看看,详细的看看栈中的数据存放位置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-5 09:59:43 | 显示全部楼层
1 call word ptr 内存单元 执行过程是
push ip;jmp word ptr 内存单元
2 ds的段地址是啥?
这个问题听不明白。ds不就是数据段寄存器吗?就是在开头定义的那段数据的段地址
3 我也认为只是将ip入栈,答案错了,我从前还没看答案呢,呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-5 11:23:16 | 显示全部楼层
machine1 发表于 2013-10-5 09:59
1 call word ptr 内存单元 执行过程是
push ip;jmp word ptr 内存单元
2 ds的段地址是啥?

为啥 ip=11啊  还有 jmo word ptr 跳转到哪里 (就是cs 和ip的值是啥)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-5 12:11:49 | 显示全部楼层
至于你说的 为什么 ip=11,这个要了解每条指令的长度,或者在debug中查看,可以尝试下。

评分

参与人数 1鱼币 +3 收起 理由
缌唸 + 3 那个设最佳了,你也回了,也给你鱼币吧

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-5 21:38:25 | 显示全部楼层
machine1 发表于 2013-10-5 12:11
至于你说的 为什么 ip=11,这个要了解每条指令的长度,或者在debug中查看,可以尝试下。

哦 谢谢 我去试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-7 17:45:46 | 显示全部楼层
还没学到。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-8 22:46:10 | 显示全部楼层
我认为是这样的,call word ptr ds:[0e],这里访问的数据段和栈段是一致的,call指令可以分解为两个指令push ip,jmp word ptr ds[0e],当你调用call时,是把call执行之后要执行下一条的Ip推向栈为0e处,再调用jmp word ptr ds[0e]刚好调用的是inc ax 的ip
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-18 12:50:37 | 显示全部楼层
路过看看哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 23:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表