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 位指令。