簡體   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