2011-11-24 3 views
0

나는 operand_a + operand_b를 계산하는 어셈블리에서 프로그램을 작성하려고했습니다.어셈블리 레지스터 EAX와 피연산자

operand와 operandb가 16 바이트 (4d 단어)로 표현 될 수 있다면 큰 문제가됩니다. 그래서이 코드를 작성했습니다 :

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

그러나 피연산자가 32 비트보다 큽니다.

내가 놓친 것이 있습니까?

+0

16 바이트 피연산자 (128 비트 인)입니다 :

그런 다음 중간 캐리의 잊고없는 가장 중요한 dword 값의 최하위 개의 dword에서 오래 추가 할. 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에 내 번호가 포함되어 있습니다. 그것은 segmantion 결함을 제공합니다. 그 이유는 무엇일까요? –

+0

@AdamSh : edx 및 ebx에는 숫자 자체가 아니라 추가하려는 숫자의 주소가 포함되어야합니다. –

0

x64에는 최소 2 개의 레지스터가 필요합니다. 어셈블리는 32 비트 어셈블리를 사용하고 있음을 나타내므로 4 개의 레지스터를 사용해야하므로 레지스터가 더 복잡해집니다.

거기에 C++ 클래스 here이 있습니다. 메서드를 에뮬레이트 할 필요가 있지만 32 비트 시나리오에서는 복잡해지기 때문에 컴파일 방법을 사용하여 컴파일하고 디스 어셈블 할 수 있습니다. x64를 사용하고 있다면 this이 사용됩니다.

1

dword 크기보다 큰 추가를 수행하는 캐리 플래그가 있습니다. add을 사용하여 가장 중요한 두 단어를 추가하기 만하면됩니다. 더하기가 dword에 맞지 않으면 캐리 플래그를 설정합니다. 그런 다음 adc을 사용하여 다음 두 dword를 추가하십시오. 그러면 두 개의 피연산자 dword와 carry 플래그가 추가됩니다. 가장 중요한 두 단어에 도달 할 때까지 adc을 사용하여 계속 dwords를 계속 추가하십시오.

+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 + [buf32 + 12], eax 여기서 buf32는 .bss에 정의됩니다. ebx & ebx에 내 번호가 포함되어 있습니다. 그것은 segmantion 잘못을 제공합니다. 그 이유는 무엇일까요? –