x86_64 ASM:movq 的替代品?
x86_64 ASM: Alternative to movq?
有没有其他方法可以将 qword 放入 mmx 寄存器?
例如,在这段代码中:
db random 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa
run:
movq mm2, [rel random]
我现在可以将其作为 qword 0xaaaaaaaaaaaaaaaaa 来处理,并对其执行 pxor 等操作。有没有其他方法可以将这些数据放入寄存器中?也许按 pushing/popping 到吧?
不知道你为什么要这样做,但你可以避免 movq
如果你将寄存器清零然后使用一些操作引入值,例如:
pxor mm2, mm2
pxor mm2, [rel random]
或者,您可以使用 pinsrw
:
加载单词
pinsrw mm2, [rel random], 0
pinsrw mm2, [rel random + 2], 1
pinsrw mm2, [rel random + 4], 2
pinsrw mm2, [rel random + 6], 3
这种方法也可以反向使用 pextrw
但必须通过通用寄存器:
pextrw eax, mm2, 0
mov [rel random], ax
pextrw eax, mm2, 1
mov [rel random + 2], ax
pextrw eax, mm2, 2
mov [rel random + 4], ax
pextrw eax, mm2, 3
mov [rel random + 6], ax
如果只能避免 movq
但可以使用 maskmovq
那么你可以这样做:
pcmpeqb mm1, mm1
lea rdi, [rel random]
maskmovq mm2, mm1
有没有其他方法可以将 qword 放入 mmx 寄存器?
例如,在这段代码中:
db random 0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa
run:
movq mm2, [rel random]
我现在可以将其作为 qword 0xaaaaaaaaaaaaaaaaa 来处理,并对其执行 pxor 等操作。有没有其他方法可以将这些数据放入寄存器中?也许按 pushing/popping 到吧?
不知道你为什么要这样做,但你可以避免 movq
如果你将寄存器清零然后使用一些操作引入值,例如:
pxor mm2, mm2
pxor mm2, [rel random]
或者,您可以使用 pinsrw
:
pinsrw mm2, [rel random], 0
pinsrw mm2, [rel random + 2], 1
pinsrw mm2, [rel random + 4], 2
pinsrw mm2, [rel random + 6], 3
这种方法也可以反向使用 pextrw
但必须通过通用寄存器:
pextrw eax, mm2, 0
mov [rel random], ax
pextrw eax, mm2, 1
mov [rel random + 2], ax
pextrw eax, mm2, 2
mov [rel random + 4], ax
pextrw eax, mm2, 3
mov [rel random + 6], ax
如果只能避免 movq
但可以使用 maskmovq
那么你可以这样做:
pcmpeqb mm1, mm1
lea rdi, [rel random]
maskmovq mm2, mm1