Compiler construction 编译器如何知道使用哪种寻址模式

Compiler construction 编译器如何知道使用哪种寻址模式,compiler-construction,computer-science,Compiler Construction,Computer Science,体系结构具有不同的寻址模式,其中一些寻址模式在可处理的位移量方面受到限制。设想一个体系结构有两条指令: #1 ldw reg, signed imm7(reg) # max displacement = 64 (2^6) #2 ldw reg, (index-reg, base-reg) # no limit on amount of displacement 我很难理解的是:编译器如何在这两条指令之间进行选择。在连接时间之前,通常不知道所需的位移 编译器是否总是采取保守的方法,并且仅在知道

体系结构具有不同的寻址模式,其中一些寻址模式在可处理的位移量方面受到限制。设想一个体系结构有两条指令:

#1 ldw reg, signed imm7(reg) # max displacement = 64 (2^6)

#2 ldw reg, (index-reg, base-reg) # no limit on amount of displacement
我很难理解的是:编译器如何在这两条指令之间进行选择。在连接时间之前,通常不知道所需的位移


编译器是否总是采取保守的方法,并且仅在知道最大位移的情况下使用指令#1?还是我遗漏了什么?

编码后,1和2是否在机器代码中使用了不同数量的字节?有时这可以在链接器(
ld
)中解决,而编译器只是对指令进行一些特殊的重新定位(作为优化;在可变长度编码中可能很困难)。在其他情况下,“英特尔编译器”(intel compiler)中的mcmodel等代码有默认内存模型(“small-告诉编译器将代码和数据限制在前2GB的地址空间内”),编译器知道代码将被限制在2GB,并且可能使用32位有符号置换;mcmodel large将使用64位DISP。在我的例子中,这些指令在编码后使用相同数量的字节。使用像您描述的英特尔内存模型这样的约定是一种非常明智的方法,我没有想到这一点。事实上,这就是我问题的答案。非常感谢。