w5271591
驱动牛犊
驱动牛犊
  • 注册日期2007-04-24
  • 最后登录2008-07-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望18点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
阅读:1464回复:3

《天方夜读》中,有个地方不明白,想问一问,呵呵。。。

楼主#
更多 发布于:2007-10-26 10:30
《天方夜读》第16页中,页面下部。
for(i=0;i<3;i++)
00401000 mov eax,dword ptr [esp+4] ;a 保存到eax 中
00401004 mov edx,dword ptr [esp+0Ch] ;c 保存到edx 中
00401008 mov ecx,dword ptr [esp+8] ;b 保存到ecx 中。
0040100C push ebx
0040100D push esi
;问题 start
0040100E add eax,4 ;这里已经开始处理数据。必须把这些指令和
                    ;函数入口指令和循环控制指令分开
;问题 end
00401011 push edi
;问题 start
00401012 add edx,8 ;同前面的add eax,4
;问题 end
00401015 mov esi,3 ;循环变量取3
0040101A lea ebx,[ebx] ;无意义指令


0040100E add eax,4 这行,为什么eax要加4啊,eax中保存的不应该是内存地址吗,
怎么好像跟栈扯上了关系,push一次,就加4,下面的情况也是类似。
w5271591
驱动牛犊
驱动牛犊
  • 注册日期2007-04-24
  • 最后登录2008-07-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望18点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-26 14:39
刷成新帖,好让大牛哥帮俺解决解决。。。
w5271591
驱动牛犊
驱动牛犊
  • 注册日期2007-04-24
  • 最后登录2008-07-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望18点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-10-26 16:26
把汇编代码再仔细的看了看,发现eax中存储的是内存地址,只是第一遍循环,它用[eax]代表 a[0][1],而不是习惯上的a[0][0],下面的edx也是,第一遍循环[edx]代表的是c[0][2]。
感觉挺奇怪,为什么不老老实实地用[eax]代表a[0][0],用[edx]代表c[0][0],反而加上一个偏移量呢?
zjan521
驱动牛犊
驱动牛犊
  • 注册日期2002-10-02
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望91点
  • 贡献值0点
  • 好评度74点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-29 21:23
你看的是《天方夜读》,又不是汇编教材, 扣那么细干嘛?

实在遇到搞不清的, 上机调试下.
0040100E add eax,4
00401020 mov ebx,dword ptr [eax]
00401029 imul edi,dword ptr [eax+4]
0040102F mov ebx,dword ptr [eax-4]
0040106F add eax,0Ch
有什么看不懂的吗?
游客

返回顶部