+ -
当前位置:首页 → 问答吧 → 这里高手多,请教个简单的问题

这里高手多,请教个简单的问题

时间:2011-04-02

来源:互联网


unsigh int g_iGud[100] = {1,2,3,...100};

unsigh int iTmp;

// 请问以下指令的差别、运行结果及导致原因
第一种情况
__asm
{
  pushad
  mov eax, dword ptr[g_iGud]
  mov iTmp, eax
  mov ebx, dword ptr[iTmp + 0x10]
  popad
}

__
第二种情况
asm
{
  pushad
  mov eax, dword ptr[g_iGud]
  mov ebx, dword ptr[eax + 0x10]
  popad
}

第三种情况

asm
{
  pushad
  mov ebx, dword ptr[g_iGud+ 0x10]
  popad
}

最近在反汇编一个程序,有几个算法,想拿出来用,但代码实在是太长了,翻译成c估计要20多天,就懒省事,把汇编直接嵌入到VC中用,没想到遇到了类似上边的问题,感觉很迷惑。由于代码中有些地址被编译器硬编码了,所以要处理以下,没啥经验,感觉挺麻烦的,期待高手

作者: C20062222   发布时间: 2011-04-02

第一种不合法
第二种把g_iGud[0]作为索引,ebx等于内存地址17指向的,显然是无效地址
第三种ebx等于g_iGud[16]

作者: Lactoferrin   发布时间: 2011-04-02

来学习了

作者: lizhenghaw006   发布时间: 2011-04-03