2014-03-29 51 views
0

我怎么能在x86程序集中复制x64 MOVQ(移动四字)指令?在x86程序集中复制x64 MOVQ

例如。鉴于:

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

我认为[this](http://www.x86-64.org/documentation/assembly.html)会有帮助。如果不是那么抱歉) –

+0

我试过比较两个结果,但是当我使用我的时候发生崩溃提供了片段。 – user3475849

回答

1

尝试

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

SSE2 movq xmm, xmm/m64在32位代码的作品(在支持它的CPU)。你显示的代码已经使用了32位寻址模式,所以它在32位模式下不会改变。还有另一种形式的movq只适用于64位模式,即movq xmm, r64/m64。相同操作码的内存源形式,可让您执行movq xmm0, rax

但无论如何,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 

取决于你在做什么,它可能可能是值得的使用MMX,如果你有,但不是SSE1:

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

; emms required later, after a loop. 

如果你真的想要一个单指令64位加载/存储so it's atomic (on P5 and later)对齐地址,那么fild/fistp是一个不错的选择。 (海湾合作委员会将此用于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甚至可能有更好的吞吐量拷贝零散的64位块比使用32位整数,加载/存储,至少在现代的CPU。对于32或64字节或更大的连续副本,请使用rep movsd。 (一般为rep movsd的阈值是值得的高得多,但我们不SIMD矢量谈论和仅32位整数或64位fild/fistp多UOP加载/存储指令。)


使用普通整数,只需选择一个可以打开的寄存器即可。 (或者在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 

如果你能抽出2个寄存器,那么是的,这可能会更好地做两个负载,然后两个商店。