英特尔手册称,mov有两个既涉及内存又涉及32位即时操作数的变体:
MOV r/m32, imm32
MOV r/m64, imm32第一个拷贝四个字节,第二个拷贝八个,取给定的32位立即,并将其扩展到64位。
在为MASM64编写程序集代码时,如何指定需要哪个程序集代码?
发布于 2022-06-04 19:57:11
@ecm的上述评论给出了答案:
mov qword ptr [rsp+08h], 0 ; selects MOV r/m64, imm32
mov dword ptr [rsp+08h], 0 ; selects MOV r/m32, imm32发布于 2022-06-05 01:13:01
与往常一样,重写内存操作数的大小。
mov qword ptr [rdx], 123
add byte ptr [rcx], 1
movzx eax, word ptr [r8]
shl dword ptr [r9], cl一般认为设置内存操作数的大小是有意义的,而不是直接的,因为这总是有效的,即使在movzx或shl dword ptr [mem], 4中,操作数不必是相同的大小(移位计数是一个字节,可能是CL)。
您没有覆盖任何有关即时的内容;您仍然希望add qword ptr [mem], 4使用sign_extended_imm8编码,将编码留给汇编程序处理。(只有mov和test缺少符号扩展的字节格式,这是从原始的8086的ALU指令中提取的。)
即使是像NASM这样接受add [rcx], word 0x0001的汇编程序,我也不会这样写。
特别是在NASM中,您可以强迫它在add qword [rdi], strict qword 123中使用一个4字节的即时代码,这将在机器代码中使用一个4字节的直接值,其他代码可以重写。在没有dword的情况下立即使用strict似乎是错误的思维方式。
特别是在启用了NASM的默认优化之后,您不需要像mov rax, dword -1这样的东西来避免imm64编码,或者不需要add dword [rdi], byte 1来避免imm32编码。(对于nasm -O0,如果不建议使用非严格提示的较小编码,则这些编码会选择更长的编码,因此,将大小设置为直接编码与设置操作数大小是可以分开的。)
(NASM对strict qword 123的要求有点混乱,而不是strict dword,它与操作数大小相匹配,而不是直接宽度。国际海事组织拒绝add qword [rdi], strict dword 123是一个错误。语法可能是在x86-64存在之前设计的,并且/或在如何将其扩展到存在字节以外的非全宽度直接项的情况下出现了错误。)
https://stackoverflow.com/questions/72498381
复制相似问题