2011-11-24 60 views
0

我試圖在Assembly中編寫一個計算operand_a + operand_b的程序。程序集 - 寄存器EAX和操作數

如果operanda和operandb可以用16個字節(4個d字)表示,那麼我的問題就很大。所以我寫了這段代碼:

mov eax, operanda 
mov ebx, operandb 
add eax, ebx 

但是我知道我的操作數比32位大。

我錯過了什麼?

+0

16字節的操作數(即128位)是罕見的基本算術指令。 x86處理器僅支持16字節寬度的邏輯運算(AND,OR,XOR,NAND),您需要使用SSE。 – hirschhornsalz

回答

1

定義另一個變量,operandc,結果。

然後做長除了從最低顯著雙字不忘掉中間進的最顯著雙字:

mov eax, dword ptr [operanda] 
add eax, dword ptr [operandb] 
mov dword ptr [operandc], eax 

mov eax, dword ptr [operanda+4] 
adc eax, dword ptr [operandb+4] 
mov dword ptr [operandc+4], eax 

mov eax, dword ptr [operanda+8] 
adc eax, dword ptr [operandb+8] 
mov dword ptr [operandc+8], eax 

mov eax, dword ptr [operanda+12] 
adc eax, dword ptr [operandb+12] 
mov dword ptr [operandc+12], eax 
+0

謝謝,我寫道: MOV EAX,DWORD [EDX] 添加EAX,[EBX] MOV DWORD [buf32],EAX MOV EAX,DWORD [EDX + 4] ADC EAX,DWORD [EBX + 4] MOV DWORD [buf32 + 4],EAX MOV EAX,DWORD [EDX + 8] ADC EAX,DWORD [EBX + 8] MOV DWORD [buf32 + 8],EAX MOV EAX,DWORD [EDX + 12] adc eax,dword [ebx + 12] mov dword [buf32 + 12],eax 其中buf32在.bss中定義。 ebx&ebx包含我的號碼。 它給了n分段錯誤。可能是什麼原因? –

+0

@AdamSh:edx和ebx必須包含要添加的數字的地址,而不是數字本身。 –

0

您需要使用多個寄存器,至少2個x64。你的程序集表示你使用32位程序集,所以你需要使用4個寄存器,這使得它更復雜。

對於它來說有一個C++類here,你只需要模擬這個方法,但是看到它在32位方案中可能會變得複雜,你可能想根據你如何使用它並對它進行反彙編。如果你真的使用x64,this將被使用。

1

有一個進位標誌用於執行大於dword大小的添加。只需使用add添加兩個最不重要的雙字。如果添加不符合雙字,這將設置進位標誌。然後,使用adc添加接下來的兩個雙字。這將添加兩個操作數雙字和進位標誌。繼續使用adc添加雙字,直到達到兩個最重要的雙字。

+0

謝謝,我寫道:mov eax,dword [edx] add eax,[ebx] mov dword [buf32],eax mov eax,dword [edx + 4] adc eax,dword [ebx + 4] mov dword [buf32 + 4 ],eax mov eax,dword [edx + 8] adc eax,dword [ebx + 8] mov dword [buf32 + 8],eax mov eax,dword [edx + 12] adc eax,dword [ebx + 12] mov dword [buf32 + 12],eax其中buf32在.bss中定義。 ebx&ebx包含我的號碼。它給了n分段錯誤。可能是什麼原因? –