MASM 指令格式
语法
按照以下语法在源代码中编写指令:
有关指令定义、选项和编码的信息,请参阅处理器制造商编程手册。 Microsoft 宏汇编程序可能不支持某些指令和指令选项。
前缀
可以使用设置有关如何编码指令的选项的关键字为一些指令添加前缀。 REP
、REPE
、REPZ
、REPNE
和 REPNZ
关键字与字符串指令一起使用,在单个指令中执行 memcpy
或 strlen
类型的操作。 LOCK
关键字以原子方式对内存操作数执行某些操作。 你可以将其与 XACQUIRE
和 XRELEASE
关键字组合在一起,对受支持的处理器执行硬件锁省略 (HLE) 操作,这在某些情况下允许更大的事务并行度。
其余前缀控制 AVX 指令的编码方式。 使用 VEX
前缀对 AVX 指令进行编码,该前缀显示在操作码之前。 它取代某些字节指令前缀和操作码前导字节。 许多 AVX 指令也是 AVX-512 指令,我们使用支持更多选项的 EVEX
前缀对这些指令进行编码。 MASM 尝试尽可能紧凑地对指令进行编码,但使用这些关键字,你可以更好地控制要与特定指令一起使用的编码。 它们还用于强制生成在相应的 AVX-512 指令后引入的 AVX 指令形式。 例如,vex vpdpbusd
指定 VPDPBUSD
指令的 AVX-VNNI 形式,而不是 AVX512-VNNI 形式。 在没有显式前缀关键字的情况下出现 AVX 指令时,选择的编码取决于当前的 AVX 编码设置。 OPTION AVXENCODING
指令允许你更改此设置。
VEX2
、VEX3
、VEX
和 EVEX
选项在 Visual Studio 2019 版本 16.7 及更高版本中可用。
关键字 | 使用情况 |
---|---|
REP |
按 (E)CX 中的计数重复字符串操作。 |
REPE REPZ |
在比较相等时重复字符串操作,它受 (E)CX 中的计数限制。 |
REPNE REPNZ |
在比较不相等时重复字符串操作,它受 (E)CX 中的计数限制。 |
LOCK |
以原子方式对内存操作数执行操作。 |
XACQUIRE |
开始 HLE 事务,它最常与 LOCK 前缀一起使用。 |
XRELEASE |
完成 HLE 事务,它最常与 LOCK 前缀一起使用。 |
VEX |
使用 VEX 前缀对 AVX 指令进行编码。 |
VEX2 |
使用 2 字节 VEX 前缀对 AVX 指令进行编码。 |
VEX3 |
使用 3 字节 VEX 前缀对 AVX 指令进行编码。 |
EVEX |
使用 EVEX 前缀对 AVX 指令进行编码。 |
助记键
助记键标识特定指令,该指令确定允许的前缀和操作数模式。
操作数列表
大多数指令使用操作数列表来指定指令的显式源操作数和目标操作数。 操作数列表可能包含内存引用、寄存器和常量值。 每个指令只允许某些类型的操作数出现在操作数列表中的每个位置。 除 MOVS
和 CMPS
指令外,只有一个操作数可以是内存引用;所有其他操作数都必须是寄存器引用或常量。
AVX-512 选项
某些 AVX-512 指令允许指定更多选项。 这些选项包括:掩码、零掩码、嵌入式广播、嵌入式舍入和异常抑制。
掩码允许仅将操作应用于矢量的选定元素。 通过将 {k1}
到 {k7}
中的掩码寄存器放置在目标操作数之后来控制此选项。 如果掩码寄存器后跟 {z}
,则目标的所有非选定元素都设置为零。 这种替代方法称为零掩码。
嵌入式广播允许将内存中的标量值应用于矢量的所有元素。 通过将元素大小和关键字 BCST
添加到内存操作数来启用此选项,这类似于对普通内存引用使用 PTR
。
嵌入式舍入控制单个浮点指令的舍入模式,无需设置和重置全局舍入模式。 按照指令操作,将舍入模式置于大括号中,这样就可以启用它。 启用后,它还会禁止显示所有异常(仅针对该指令)。 不舍入的浮点指令也可以使用类似的选项禁止显示所有异常。
; Examples of AVX-512 options
vaddps xmm1 {k1}, xmm2, xmm3 ; merge-masking
vsubps ymm0 {k4}{z}, ymm1, ymm2 ; zero-masking
vmulps zmm0, zmm1, dword bcst scalar ; embedded broadcast
vdivps zmm0, zmm1, zmm2 {rz-sae} ; embedded rounding
vmaxss xmm1, xmm2, xmm3 {sae} ; suppress all exceptions
舍入模式
模型 | 效果 |
---|---|
rn-sae |
舍入到最近的整数,偶数优先,禁止显示所有异常。 |
rz-sae |
输入到零,禁止显示所有异常。 |
rd-sae |
向下舍入(舍入到负无穷大),禁止显示所有异常。 |
ru-sae |
向上舍入(舍入到正无穷大),禁止显示所有异常。 |
sae |
禁止显示所有异常(不需要舍入)。 |