ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
在 16-BIS 状态下获取的函数地址使用相应函数的 16-BIS 状态入口点的地址(设置第 0 位地址)。同样,在 32-BIS 状态下获取的函数地址使用相应函数的 32-BIS 状态入口点的地址(清除第 0 位地址)。然后,所有间接调用都是通过将被调用函数的地址加载到寄存器中并执行分支和交换(BX)指令来完成的。这会自动更改状态并确保代码正常运行,无论地址在获取时处于何种状态。
还必须设置返回地址,以便处理器的状态在返回时保持一致且已知。测试第 0 位地址以确定 BX 指令是否调用状态更改。如果它不调用状态更改,则为函数的状态设置返回地址。如果它调用状态更改,则为备用状态设置返回地址并执行代码以返回到函数的状态。
函数的入口点取决于获取地址的函数的状态,因此在与函数处于相同状态时获取该函数的地址更有效。这可确保使用实际函数的地址,而不是其备用入口点。间接调用本身可以调用状态更改,因此即使从不同的状态调用它,也不需要通过其备用入口点进入函数。
Example6-8 显示了调用 max() 的 sum(),具有针对 16-BIS 状态编译的代码并支持双状态交互工作。sum( ) 函数使用 -code_state=16 选项进行了编译,该选项为 UAL 之前的汇编代码创建 16 位指令。(有关 UAL 语法的信息,请参阅《ARM 汇编语言工具用户指南》。)Example6-11 显示了相同的函数调用,具有针对 32-BIS 状态编译的代码并支持双状态交互工作。函数 max( ) 在编译时未使用 -code_state=16 选项,并创建 32 位指令。