나는 operand_a + operand_b를 계산하는 어셈블리에서 프로그램을 작성하려고했습니다.어셈블리 레지스터 EAX와 피연산자
operand와 operandb가 16 바이트 (4d 단어)로 표현 될 수 있다면 큰 문제가됩니다. 그래서이 코드를 작성했습니다 :
mov eax, operanda
mov ebx, operandb
add eax, ebx
그러나 피연산자가 32 비트보다 큽니다.
내가 놓친 것이 있습니까?
나는 operand_a + operand_b를 계산하는 어셈블리에서 프로그램을 작성하려고했습니다.어셈블리 레지스터 EAX와 피연산자
operand와 operandb가 16 바이트 (4d 단어)로 표현 될 수 있다면 큰 문제가됩니다. 그래서이 코드를 작성했습니다 :
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에 내 번호가 포함되어 있습니다. 그것은 segmantion 결함을 제공합니다. 그 이유는 무엇일까요? –
@AdamSh : edx 및 ebx에는 숫자 자체가 아니라 추가하려는 숫자의 주소가 포함되어야합니다. –
dword 크기보다 큰 추가를 수행하는 캐리 플래그가 있습니다. add
을 사용하여 가장 중요한 두 단어를 추가하기 만하면됩니다. 더하기가 dword에 맞지 않으면 캐리 플래그를 설정합니다. 그런 다음 adc
을 사용하여 다음 두 dword를 추가하십시오. 그러면 두 개의 피연산자 dword와 carry 플래그가 추가됩니다. 가장 중요한 두 단어에 도달 할 때까지 adc
을 사용하여 계속 dwords를 계속 추가하십시오.
감사합니다, 나는 썼다 : 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 잘못을 제공합니다. 그 이유는 무엇일까요? –
16 바이트 피연산자 (128 비트 인)입니다 :
그런 다음 중간 캐리의 잊고없는 가장 중요한 dword 값의 최하위 개의 dword에서 오래 추가 할. x86 프로세서는 16 바이트 너비의 논리 연산 (AND, OR, XOR, NAND) 만 지원하므로 SSE를 사용해야합니다. – hirschhornsalz