【发布时间】:2019-12-21 14:44:10
【问题描述】:
我很难理解正确的事件顺序。 当用抽象语言编写的程序被编译时,它被翻译成机器代码。 随后,只有在程序运行之后,它才会被加载到内存中的代码段中。 此时,程序中的每条指令都将位于特定的内存地址上。 在汇编中调用函数时,Call 语句通常后跟一个标签。 我假设这个标签将被编译器替换为函数的内存地址。 这是我绝对无法理解的地方。 如果指令只在程序运行时才加载到内存中,从而每条指令都获得了自己的内存地址,那么编译器怎么知道标签对应的内存地址呢? 如果函数还没有在内存中,那么以二进制代码编译且标签不再可用的程序如何知道与该标签相对应的内存地址,函数将在执行时加载到哪里?我有点困惑。帮帮我。
【问题讨论】:
-
传统上,内存地址由链接器选择并且总是相同的。在现代系统中,您有时会看到事先不知道地址的位置无关代码。然而,即便如此,标签之间的距离是恒定的,这就是我们所需要的。
标签: function assembly linker call