2009-11-24 53 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