首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何区分"MOV /M64,imm32“与"MOV /M32,imm32”在MASM64中的区别?

如何区分"MOV /M64,imm32“与"MOV /M32,imm32”在MASM64中的区别?
EN

Stack Overflow用户
提问于 2022-06-04 08:49:32
回答 2查看 105关注 0票数 3

英特尔手册称,mov有两个既涉及内存又涉及32位即时操作数的变体:

代码语言:javascript
复制
MOV r/m32, imm32
MOV r/m64, imm32

第一个拷贝四个字节,第二个拷贝八个,取给定的32位立即,并将其扩展到64位。

在为MASM64编写程序集代码时,如何指定需要哪个程序集代码?

EN

回答 2

Stack Overflow用户

发布于 2022-06-04 19:57:11

@ecm的上述评论给出了答案:

代码语言:javascript
复制
mov qword ptr [rsp+08h], 0   ; selects MOV r/m64, imm32
mov dword ptr [rsp+08h], 0   ; selects MOV r/m32, imm32
票数 2
EN

Stack Overflow用户

发布于 2022-06-05 01:13:01

与往常一样,重写内存操作数的大小。

代码语言:javascript
复制
mov   qword ptr [rdx], 123
add   byte ptr [rcx], 1
movzx eax,  word ptr [r8]
shl   dword ptr [r9], cl

一般认为设置内存操作数的大小是有意义的,而不是直接的,因为这总是有效的,即使在movzxshl dword ptr [mem], 4中,操作数不必是相同的大小(移位计数是一个字节,可能是CL)。

您没有覆盖任何有关即时的内容;您仍然希望add qword ptr [mem], 4使用sign_extended_imm8编码,将编码留给汇编程序处理。(只有movtest缺少符号扩展的字节格式,这是从原始的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存在之前设计的,并且/或在如何将其扩展到存在字节以外的非全宽度直接项的情况下出现了错误。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72498381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档