繁体   English   中英

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

[英]Assembler - Load value from register instead of Immediate value

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

例如:

如果我想移动xmm寄存器,则有pslldq命令:

PSLLDQ xmm1, imm8

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

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

您可以使用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]

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

在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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM