我試圖在Assembly中編寫一個計算operand_a + operand_b的程序。程序集 - 寄存器EAX和操作數
如果operanda和operandb可以用16個字節(4個d字)表示,那麼我的問題就很大。所以我寫了這段代碼:
mov eax, operanda
mov ebx, operandb
add eax, ebx
但是我知道我的操作數比32位大。
我錯過了什麼?
我試圖在Assembly中編寫一個計算operand_a + operand_b的程序。程序集 - 寄存器EAX和操作數
如果operanda和operandb可以用16個字節(4個d字)表示,那麼我的問題就很大。所以我寫了這段代碼:
mov eax, operanda
mov ebx, operandb
add eax, ebx
但是我知道我的操作數比32位大。
我錯過了什麼?
定義另一個變量,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
謝謝,我寫道: 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分段錯誤。可能是什麼原因? –
@AdamSh:edx和ebx必須包含要添加的數字的地址,而不是數字本身。 –
有一個進位標誌用於執行大於dword大小的添加。只需使用add
添加兩個最不重要的雙字。如果添加不符合雙字,這將設置進位標誌。然後,使用adc
添加接下來的兩個雙字。這將添加兩個操作數雙字和進位標誌。繼續使用adc
添加雙字,直到達到兩個最重要的雙字。
謝謝,我寫道: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分段錯誤。可能是什麼原因? –
16字節的操作數(即128位)是罕見的基本算術指令。 x86處理器僅支持16字節寬度的邏輯運算(AND,OR,XOR,NAND),您需要使用SSE。 – hirschhornsalz