2014-03-29 4 views
0

어떻게하면 x64를 복제 할 수 있습니까? x86 어셈블리에서 MOVQ (쿼드 워드 이동) 명령어를 사용할 수 있습니까?x86 어셈블리의 x64 MOVQ 복제

예를 들면. Given :

movq xmm5, [esi+2h] 
movq [edi+f1h], xmm5 

이 방법이 가능합니까? :

push eax 
push edx 
mov eax, [esi+2h] 
mov edx, [esi+6h] ; +4 byte offset 
mov [edi+f1h], eax 
mov [edi+f5h], edx ; +4 byte offset 
pop edx 
pop eax 
+1

두 가지 모두에서 결과를 비교해 보시지 않겠습니까? –

+0

[이] (http://www.x86-64.org/documentation/assembly.html) 도움이 될 것 같아요. 미안하지만) –

+0

두 결과를 비교해 보았습니다.하지만 제 경우에 충돌이 발생합니다. 미리보기가 제공됩니다. – user3475849

답변

1

는 (그것을 지원 CPU에서) 32 비트 코드에

fild qword ptr [esi+2h] 
fistp qword ptr [edi+f1h] 
1

SSE2 movq xmm, xmm/m64 작품을보십시오. 표시 한 코드는 이미 32 비트 주소 지정 모드를 사용 했으므로 32 비트 모드에서 변경되지 않습니다. movq의 또 다른 형식은 movq xmm, r64/m64 인 64 비트 모드에서만 작동합니다. movq xmm0, rax을 수행 할 수있는 동일한 opcode의 메모리 소스 형식.

어쨌든, 32 비트 SSE2 :

movq xmm5, [esi+2h] 
movq [edi+f1h], xmm5 

만 SSE1하지만 SSE2를 가정 할 경우, 당신은, 당신이 무슨 일을하는지에 따라 movlps

;; xorps xmm5,xmm5  ; optional to break a dependency on old value 
movlps xmm5, [esi+2h]  ; merges into xmm5: false dependency 
movlps [edi+f1h], xmm5 

을이 수 사용할 수 있습니다

movq mm0, [esi+2h] 
movq [edi+f1h], mm0 

; emms required later, after a loop. 

,536,913,632 : 당신이 아니라 SSE1이있는 경우는 MMX를 사용하는 것이 가능 가치 10

정렬 된 주소에 대해 단일 명령어 64 비트로드/저장 so it's atomic (on P5 and later)을 사용하려는 경우 fild/fistp을 선택하는 것이 좋습니다. gcc는 std::atomic<int64_t>-m32 -mno-sse을 사용합니다.

귀하의 데이터를 절대로 괴롭히지 않습니다. unless you (or MSVC++'s CRT) have the x87 precision bits set to less than a 64-bit mantissa.

fild qword ptr [esi+2h] 
fistp qword ptr [edi+f1h] 

fild/fistp

도 적어도 현대의 CPU에 32 비트 정수로드/저장을 사용하는 것보다 64 비트 덩어리를 산란 복사 할 처리량이있을 수 있습니다. 32 또는 64 바이트 이상의 연속 사본의 경우 rep movsd을 사용하십시오. (보통 rep movsd에 대한 임계 값은 훨씬 더 높은 가치가있는, 그러나 우리는 32 비트 정수 또는 64 비트 fild/ fistp 멀티 UOP로드/저장 지침 SIMD 벡터없이 얘기하고 있습니다.)


일반 정수로, 당신이 clobber 수있는 ​​레지스터를 선택하십시오. (또는 MSVC의 인라인 어셈블리에서, 그것을 절약에 대한 컴파일러 걱정을 할 수 있습니다.) 레지스터 꽉 경우, 하나를 사용합니다 (SRC와 DST가 알려진 경우 중첩되지 않음) :

mov eax, [esi+2h] 
mov [edi+f1h], eax 
mov eax, [esi+2h + 4]  ; write the +4 separately in the addressing mode as documentation 
mov [edi+f1h + 4], eax 

당신이이 개 레지스터를 마련 할 수있는 경우 , 그렇다면 아마도로드를 수행 한 다음 두 저장소를 수행하는 것이 좋습니다.