ZHCADC4A September 2011 – March 2014
C64+ ISA 以及一些更高版本均具有称为紧凑指令的功能,这是一种将 16 位指令对打包到程序存储器的 32 位字中的编码格式。在大端字节序模式下,指令以与其在源程序中的词法顺序相反的顺序存储在存储器中,并且与它们的执行顺序相反。本节阐明了针对这种差异表示地址的约定。
一条 16 位指令可以被视为具有两个地址:
在小端字节序配置中,逻辑地址与物理地址相同。在大端字节序中,16 位指令对会在程序存储器中交换,因此,如果地址 A 表示包含该对的 32 位字的物理地址,则第一个逻辑指令存储在 A+2 中,而第二个指令存储在 A 中。
图 5-1 中的代码片段展示了逻辑地址和物理地址之间的区别。程序按其词法顺序显示。第一列显示小端字节序物理地址,这也是小端字节序和大端字节序的逻辑地址。第二列显示大端字节序物理地址。虚线表示程序存储器中的 32 位边界。
ABI 指定目标文件中的所有程序地址均表示为逻辑地址。这包括分支位移、符号值、展开表中的地址和调试信息中的地址。
参考图 5-1,尽管所标记的指令(操作码 0x40CE)存储在 0x0002,但是符号表中标号 code 的值为 0x0000。同样,尽管所标记的指令(操作码 0xA14F)存储在 0x0008,但是标号 local 的值为 0x000A。
在大多数情况下,逻辑地址和物理地址之间的区别对于程序员和工具链都是透明的。为了保持这种透明度,规定了以下条件:
条件 (1) 和 (2) 加在一起,将间接分支排除到非 32 位对齐的地址。请注意,(2b) 的实例不需要重定位,因为偏移量是汇编时常量。这反过来实现了条件 (3),因而不需要在逻辑地址和物理地址之间进行转换来访问可重定位字段。