在汇编程序寄存器之间移动数据

时间:2009-11-24 18:00:17

标签: c# assembly x86

在Assembler中一个接一个的'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 个答案:

答案 0 :(得分:2)

大多数汇编指令都需要输入(想想函数参数),就像大多数语言要求您以特定顺序传递参数一样,汇编指令假定其参数将按特定顺序排列 - 具体而言,将存在于特定寄存器中。

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

答案 1 :(得分: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是工作者变量。并且第二个例程是与内存管理,构造函数或在分配引用时需要完成的事情相关的事情。很可能是构造函数。

但正如所说,这只是一个有根据的猜测。