2009-11-24 84 views
0

汇编程序中几个'mov'类型语句的目的是什么?在我看来,只是在不同寄存器之间移动数据是相当“无意义的”,尽管它很可能不是这样。在汇编程序寄存器之间移动数据

例子:

Worker work = new Worker(); // C# statement 
00000035 B9 40 9E 31 00 mov   ecx,319E40h 
0000003a E8 95 0A 9A FF call  FF9A0AD4 
0000003f 89 45 BC   mov   dword ptr [ebp-44h],eax 
00000042 8B 4D BC   mov   ecx,dword ptr [ebp-44h] 
00000045 E8 0E B0 9B FF call  FF9BB058 
0000004a 8B 45 BC   mov   eax,dword ptr [ebp-44h] 
0000004d 89 45 C0   mov   dword ptr [ebp-40h],eax 

下面的C#语句会导致它下面的汇编,什么是ECX和EAX寄存器之间搬东西的目的是什么?这就是我迷失方向的地方......

回答

2
mov ecx,319E40h // probably a value uniquely identifiying the classtype? 
call FF9A0AD4  // call a routine on it? puts result in eax probably 
mov dword ptr [ebp-44h],eax // save result(eax) to a localvariable 
mov ecx,dword ptr [ebp-44h] // reload the local parameter to ecx, probably 
           // the reference to the new class instance. 
call FF9BB058     // some function on the instantiated class. 
mov eax,dword ptr [ebp-44h] // reload the reference 
mov dword ptr [ebp-40h],eax // store to another local variable. 

所以我的猜测是,第一个例程叫做实例化,而ebp-40是工作变量。第二个例程与内存管理,构造函数或分配引用时需要完成的操作有关。主要可能是构造函数。

但正如说这只是一个受过教育的猜测。

+0

人们无法确切知道这两个电话究竟是什么,但这种分析似乎是完全合理的。尼斯。 – 2009-11-25 15:49:33

2

大多数汇编指令需要输入(思考函数参数),并且正如大多数语言要求您以特定顺序传递参数一样,汇编指令假设它的参数将处于特定的订单 - 具体而言将存在于特定的寄存器中。

此外,最后两行很可能存在,因为mov从内存位置到使用间接寻址的内存位置可能不受支持 - 必须将数据从内存移到寄存器,然后注册到新的内存位置。

+1

这不是问题所在。 ebp-44的整体需求是一个问题。为什么不在整个模块中使用ebp-40并保存说明? 这更可能与构造函数产生异常时发生的情况有关。 – 2009-11-26 11:09:27

相关问题