在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寄存器之间移动的目的是什么?那就是我不知所措......
答案 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是工作者变量。并且第二个例程是与内存管理,构造函数或在分配引用时需要完成的事情相关的事情。很可能是构造函数。
但正如所说,这只是一个有根据的猜测。