编译后生成奇怪的汇编代码

时间:2014-09-05 01:19:59

标签: c assembly compiler-construction compilation

我只是尝试加上0x3C,但编译器正在将其转换为0x0F0。为什么?

这是kernel32_base声明,它作为参数传递给函数:

  

DWORD * kernel32_base

这里有C代码和反汇编代码:

DWORD PE_shift=NULL;
00DB212E  mov         dword ptr [PE_shift],0  
    PE_shift = *(kernel32_base + 0x3C); //60=3Ch
00DB2135  mov         eax,dword ptr [kernel32_base]  
00DB2138  mov         ecx,dword ptr [eax+0F0h]  ; <-----------------
00DB213E  mov         dword ptr [PE_shift],ecx  

0F0h来自哪里?应该是0x3C吧?

1 个答案:

答案 0 :(得分:1)

因为DWORD是四字节类型。您的C代码表示在基指针后加载0x3C'4字节数量。 40x3C0xF0。如果你想在字节偏移DWORD得到0x3C,那么它需要是:

PE_shift = *(DWORD*)((char*)kernel32_base + 0x3C);