Men*_*ork 0 x86 assembly nasm addressing-mode
当我有这样的操作时mov eax, [input+10]:
它是否具有与此操作不同的操作码:
mov eax, [input](考虑到输入现在具有前值input+10)?
这两条指令应该生成完全相同的机器代码。
那是因为“输入”是一个代表地址的符号,而常量“10”是由汇编程序添加到它的。在这两种情况下,指令都是mov register, [displacement]。正在使用的寻址模式称为“直接”,又名“仅位移”。
CPU 没有任何寻址模式(也没有特殊的操作码)用于mov register, [displacement + offset].
(并且支持这种寻址模式没有任何意义,因为displacement和offset都是常量。)
编辑:
当“输入”在一个程序集文件中被声明为可导出时,会出现一种特殊情况,然后它被导入到另一个程序集文件中,您尝试向它添加偏移量。在这种情况下,汇编器在汇编指令时将不知道“输入”的确切值,因此链接器将在链接期间计算出操作数的值,或者由加载器来计算它在程序加载期间退出。有两种可能性:要么这些工具(汇编器 + 链接器的组合)有处理这个问题的方法,要么没有。
如果他们确实有处理这个问题的方法,那么汇编器发出的目标代码在 '.obj' 文件中可能看起来略有不同,但是一旦你的可执行文件被加载到内存并开始运行,结果位模式应该仍然是相同的。
如果工具没有办法处理这个问题,你的汇编器应该给你一个错误,它不知道如何将 '10' 添加到 'input' 中,因为 'input' 是一个外部符号。