我在 Ida Pro 中有一個 linux .so 檔案,并且有以下說明:
movss xmm0, cs:dword_5B27420
是否可以將固定值移動到xmm0使用與該指令相同或更少的位元組數?
指令位元組為:
F3 0F 10 05 C8 BB A 00
我想做類似的事情:
movss xmm0, 0.3
uj5u.com熱心網友回復:
不是更少的位元組;如果這里沒有空間,則必須跳轉到其他地方然后回傳,或者只是更改 RIP 相對地址以從其他地方加載不同的常量。(例如,來自兩個函式之間的填充,或者 .rodata 或 .data 中的備用空間(如果有)。)
XMM 暫存器沒有 mov-immediate,并且mov eax, __?float32?__(0.3)(5 bytes) / movd xmm0, eax(4 bytes) 會占用更多的總位元組數。(這是給定 FP 常量的位模式的整數值的NASM 語法mov eax, 0.3。一些匯編程式可能允許,以防萬一有用。)
除了立即數之外,構造 FP 常量的方法包括pcmpeqd xmm0,xmm0(4 個位元組),然后pabsd使用全為位模式進行移位或執行其他操作(如 )。但這至少是 2 條指令,除非你想要一個 NaN。(請參閱Agner Fog 的優化 asm 指南和動態生成矢量常量的最佳指令序列是什么?)
0.3f不是一個簡單的常數,即使在 3 條指令中0xffffffff通過左右移位也可以實作,不像1.0f例如。(但這仍然是三個指令,每個 4 和 5 個位元組來構造 set1(1.0f))
cmpps是 SSE1 非標量,因此它的操作碼比pcmpeqd(沒有強制前綴,只是0f c2)更小,但總體上并沒有更小,因為它需要一個立即數用于比較謂詞。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/443211.html
下一篇:6502裝配JMP
