汇编——隐式计算会改变操作码吗?

Assembly - Do implicit calculations change the opcode?

当我有这样的操作时 mov eax, [input+10]:

它的操作码是否与此操作不同:

mov eax, [input](考虑到输入现在具有以前 input+10 的值)?

这两条指令应该生成完全相同的机器代码。

那是因为'input'是一个代表地址的符号,汇编器给它加了常量'10'。在这两种情况下,指令都是 mov register, [displacement]。正在使用的寻址模式称为 "Direct"、a.k.a。 "Displacement-Only".

CPU 对 mov register, [displacement + offset] 没有任何寻址模式(也没有特殊操作码)。

(而且支持这样的寻址方式也没有任何意义,因为displacementoffset都是常量。)

编辑:

当 'input' 在一个程序集文件中被声明为可导出,然后它被导入到另一个程序集文件中,您试图在其中添加一个偏移量时,就会出现一种特殊情况。在这种情况下,汇编程序在汇编您的指令时将不知道 'input' 的确切值,因此将由链接器在链接期间计算操作数的值,或者由加载程序来计算在程序加载期间弄清楚。有两种可能性:要么这些工具(汇编器 + 链接器的组合)有处理这个问题的方法,要么没有。

  • 如果他们确实有办法处理这个问题,那么汇编程序发出的目标代码在“.obj”文件中可能看起来略有不同,但是一旦你的可执行文件被加载后产生的位模式进入内存并开始 运行 应该仍然完全相同。

  • 如果工具无法处理这个问题,你的汇编器应该给你一个错误,它不知道如何将'10'加到'input'因为'input'是一个外部符号。