汇编——隐式计算会改变操作码吗?
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]
没有任何寻址模式(也没有特殊操作码)。
(而且支持这样的寻址方式也没有任何意义,因为displacement
和offset
都是常量。)
编辑:
当 'input' 在一个程序集文件中被声明为可导出,然后它被导入到另一个程序集文件中,您试图在其中添加一个偏移量时,就会出现一种特殊情况。在这种情况下,汇编程序在汇编您的指令时将不知道 'input' 的确切值,因此将由链接器在链接期间计算操作数的值,或者由加载程序来计算在程序加载期间弄清楚。有两种可能性:要么这些工具(汇编器 + 链接器的组合)有处理这个问题的方法,要么没有。
如果他们确实有办法处理这个问题,那么汇编程序发出的目标代码在“.obj”文件中可能看起来略有不同,但是一旦你的可执行文件被加载后产生的位模式进入内存并开始 运行 应该仍然完全相同。
如果工具无法处理这个问题,你的汇编器应该给你一个错误,它不知道如何将'10'加到'input'因为'input'是一个外部符号。
当我有这样的操作时 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]
没有任何寻址模式(也没有特殊操作码)。
(而且支持这样的寻址方式也没有任何意义,因为displacement
和offset
都是常量。)
编辑:
当 'input' 在一个程序集文件中被声明为可导出,然后它被导入到另一个程序集文件中,您试图在其中添加一个偏移量时,就会出现一种特殊情况。在这种情况下,汇编程序在汇编您的指令时将不知道 'input' 的确切值,因此将由链接器在链接期间计算操作数的值,或者由加载程序来计算在程序加载期间弄清楚。有两种可能性:要么这些工具(汇编器 + 链接器的组合)有处理这个问题的方法,要么没有。
如果他们确实有办法处理这个问题,那么汇编程序发出的目标代码在“.obj”文件中可能看起来略有不同,但是一旦你的可执行文件被加载后产生的位模式进入内存并开始 运行 应该仍然完全相同。
如果工具无法处理这个问题,你的汇编器应该给你一个错误,它不知道如何将'10'加到'input'因为'input'是一个外部符号。