为了帮助理解x86指令集,我一直在NASM中尝试各种形式的mov
,并将生成的代码与英特尔文档中列出的操作码进行比较。他们中的大多数都是按照我的预期出现的,但有一个我似乎无法让NASM产生:
a1 mov eax,moffs32
特别是,这不会这样做(而是组装成另一个操作码):
mov eax,[44332211h]
64位变体和反操作码a3也是如此。如何让汇编程序生成这些操作码?我误解了“记忆偏移”的含义吗?
答案 0 :(得分:1)
NASM可能会采用较短的变体。在64位寻址模式下,A1操作码具有64位地址,使指令长度为9个字节:A1 11 22 33 44 00 00 00 00
。通过选择具有ModR / M编码的操作码,它允许使用32位偏移而不是7字节长的指令。例如:8B 04 25 11 22 33 44