回 帖 发 新 帖 刷新版面

主题:[讨论]哪里出问题了???

自己写的一个完整程序:

#include <iostream.h>
#include <stdlib.h>
#include "Afx.h"
fun(unsigned long *addr)
{
    _asm{
        push eax
        mov eax, [addr]
         
        pop eax
    }
}

void main ()
{
    unsigned long begin = GetTickCount();
    for ( int i = 1; i < 10 ; ++i)
    {
        for ( int j = 1; j <= i ; ++j )
        {
            cout << j << "x" << i << " = " << i * j << "  ";
            if ( j == i) 
            {
                cout << endl;
            }
            
        }
    }
    unsigned long cost_ms = GetTickCount() - begin;
    unsigned long *addr = &cost_ms ;    
    fun( addr);
    cout << cost_ms << endl;
}

以上这个程序在传参数的过程中为什么不能得到那个地址中的值啊,在调试的过程中还是只得到那个地址的值,而地址中的值却获取不到,而改写一下就能得到其传递过来的地址中的值,改写如下:
mov eax, addr
mov edx, [eax]
这样调试一下就能得到其地址中的值,为什么不改写直接用mov eax,[addr]就不能获得其中的值呢?
有谁帮忙说说吗?先谢谢了!~&~[em2]

回复列表 (共1个回复)

沙发



mov eax, addr 和
mov eax, [addr] 是一会事,加括号是正规写法

传到 fun 中 addr 所在的内存单元是 [esp + 4] ( 这里假设编译器没有进行修饰,[esp] 是 IP, 那么 [esp + 4] 是就是参数), 所以 mov eax, addr, 所送入  eax  中的值为 
dword ptr [esp + 4], 即 cost_ms 的地址.

我来回复

您尚未登录,请登录后再回复。点此登录或注册