assembly 英特尔指令文档中未使用XMM寄存器0

hfwmuf9z  于 2023-04-30  发布在  其他
关注(0)|答案(2)|浏览(244)

在Intel x64手册中,它说在32位SSE 2模式下有XMM寄存器0-7。那么,为什么95%的使用这些寄存器的指令都跳过0而使用1-4呢?
例如,Intel的Vol.2手册addpsentry将其列为ADDPS xmm1, xmm2/m128

6vl6ewon

6vl6ewon1#

你误解了一些东西,可能是手册中的占位符。当指令描述为xmm1xmm2时,它通常指任何xmm寄存器,数字仅表示操作数编号。
例如,ADDPS xmm1, xmm2/m128可以添加两个任意的xmm寄存器,或者将内存操作数添加到任意的xmm寄存器。

flvtvl50

flvtvl502#

英特尔手册中的编号是占位符,如第一个xmm操作数,而不是寄存器编号。
blendvps中,对于非AVX版本,XMM 0是一个操作数的唯一选择,而不是占位符:https://felixcloutier.com/x86/blendvps
| 操作码|说明书|手术/EN|
| --------------|--------------|--------------|
| 66 0F 38 14 /r|BLENDVPS xmm1, xmm2/m128, <XMM0>|RM0|
| VEX.128.66.0F3A.W0 4A /r /is4|VBLENDVPS xmm1, xmm2, xmm3/m128, xmm4|RVMR|
| VEX.256.66.0F3A.W0 4A /r /is4|VBLENDVPS ymm1, ymm2, ymm3/m256, ymm4|RVMR|

注意尖括号内的全大写<XMM0>:这就是英特尔在表示需要特定寄存器时所写的内容。(在机器码中隐式使用,如mul rcx的RDX:RAX)

还要注意Op/En(操作数编码)列,它有另一个表的键,“指令操作数编码”,在这里我们可以看到由ModR/M(或VEX)字段编码的寄存器,甚至是立即数;vblendvps有点疯狂。但无论如何,既然指令中有位来编码它们,那么它们显然可以是任何XMM寄存器。
| 手术/EN|操作数1|操作数2|操作数3|操作数4|
| --------------|--------------|--------------|--------------|--------------|
| RM0|ModRM:reg(r,w)|ModRM:r/m(r)|隐式XMM 0|不适用|
| RVMR|ModRM:reg(w)|Vex.vvvv(r)|ModRM:r/m(r)|[7:4]|
(r,w)与(w)或(r)告诉你一个操作数是读、写还是两者都读。
参见

或者阅读前一章卷。2,它告诉你如何阅读条目:操作数编码表包含指令如何指定寄存器的详细信息。* How to read the Intel Opcode notation * 符号有一个引用其中一些的答案,但实际的PDF有例子和东西。

相关问题