Assembly 是否有一个通用的<;类型>;程序集中可以从标签推断类型的ptr指令?

Assembly 是否有一个通用的<;类型>;程序集中可以从标签推断类型的ptr指令?,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,汇编中是否有可以从标签推断类型的通用ptr指令 例如,我们有一个类型的变量,它可以是byte、word或dword,我想把它移到一个寄存器中,如果我们不知道它的类型,有没有办法 .data VAR1 dword 2 VAR2 byte 3 .code mov eax, ? ptr VAR1 mov eax, ? ptr VAR2 不是真的,您可能已经能够使用movsx,但是如果VAR1或VAR2与寄存器EAX的大小相同(32位),它就会抱怨。@RossRidge最近的一个回答可能会建议使用MA

汇编中是否有可以从标签推断类型的通用ptr指令

例如,我们有一个类型的变量,它可以是byte、word或dword,我想把它移到一个寄存器中,如果我们不知道它的类型,有没有办法

.data
VAR1 dword 2
VAR2 byte 3
.code
mov eax, ? ptr VAR1
mov eax, ? ptr VAR2

不是真的,您可能已经能够使用
movsx
,但是如果VAR1或VAR2与寄存器EAX的大小相同(32位),它就会抱怨。@RossRidge最近的一个回答可能会建议使用MASM的条件组装能力来完成这样的事情。请参见此答案:类型是根据标签的类型自动推断的。您只需要在希望使用不同大小的内存访问时使用PTR。所以你可以只做
moveax,VAR1
。另一方面,
mov eax,BYTE PTR VAR2
是非法的,出于同样的原因,
mov eax,VAR2
也是非法的。MOV指令的两个操作数的大小必须相同。正如Michael Petch所建议的,你需要在第二个语句中使用MOVSX或MOVZX(符号扩展或零扩展值)。@Ross:这可能就是为什么AMD在设计AMD64时给出的原因,以确保
MOVSX eax,var
var
为32位时不合法。该操作码仅用于REX前缀(扩展到64b的符号),可能他们真的不希望将其用作
mov r32,r/m32
的同义词。(IDK它是如何在K8上解码的;根据Agner Fog的表格,它可能仍然使用ALU端口以及加载端口(如
movsxd r64,m32
)进行解码。事实上,您可能无法使用
movsx
,但如果VAR1或VAR2与寄存器EAX的大小相同(32位),它会抱怨。@RossRidge最近的一个回答可能会建议使用MASM的条件组装能力来完成这样的事情。请参见此答案:类型是根据标签的类型自动推断的。您只需要在希望使用不同大小的内存访问时使用PTR。所以你可以只做
moveax,VAR1
。另一方面,
mov eax,BYTE PTR VAR2
是非法的,出于同样的原因,
mov eax,VAR2
也是非法的。MOV指令的两个操作数的大小必须相同。正如Michael Petch所建议的,你需要在第二个语句中使用MOVSX或MOVZX(符号扩展或零扩展值)。@Ross:这可能就是为什么AMD在设计AMD64时给出的原因,以确保
MOVSX eax,var
var
为32位时不合法。该操作码仅用于REX前缀(扩展到64b的符号),可能他们真的不希望将其用作
mov r32,r/m32
的同义词。(IDK如何在K8上解码;根据Agner Fog的表格,它可能仍然使用ALU端口和加载端口进行解码,如
movsxd r64,m32
does)