汇编程序 - 从寄存器加载值而不是立即值

时间:2014-03-21 18:27:45

标签: assembly x86-64 cpu-registers

某些AMD64 / x86命令期望立即值为操作数(例如imm8)。是否可以使用存储在某个寄存器中的值(例如啊)而不是这个硬编码值?

例如:

如果我想移动xmm寄存器,则有pslldq-command:

PSLLDQ xmm1, imm8

我必须将它移位n次(其中n存储在寄存器中)。没有条件跳转是否可以做到?

3 个答案:

答案 0 :(得分:1)

如果部分长度相等,您可以将跳转表或索引分支用于重复的代码部分。

答案 1 :(得分:1)

您可以使用pshufb和查找表来模拟它。

shl eax, 4
pshufb xmm0, [lut + eax]

查找表将以(我认为)

开头
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
80 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E
80 80 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D

您也可以使用普通的旧对齐读取,并且不使用任何“怪异”:(未经测试)

movdqa [temp + 16], xmm0
pxor xmm0, xmm0
movdqa [temp], xmm0
neg eax
movdqu xmm0, [eax + temp + 16]

但这可能会受到商店转发失败的影响,这可能需要十几个周期。

答案 2 :(得分:0)

x86下没有指令(暂时)。 但你可以用硬核方式做:

    mov     cl, n                        ;n as shift count number from 0 to 31
    mov     byte ptr[@_PSLLDQ + 4], cl   ;overwrite last byte of instruction
    mfence                               ;ensure that intruction is globally visible 
@_PSLLDQ:
    PSLLDQ  xmm1, 0

并且你的代码库必须启用写访问权。