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 狀態(tài)下獲取的函數(shù)地址使用相應函數(shù)的 16-BIS 狀態(tài)入口點的地址(設置第 0 位地址)。同樣,在 32-BIS 狀態(tài)下獲取的函數(shù)地址使用相應函數(shù)的 32-BIS 狀態(tài)入口點的地址(清除第 0 位地址)。然后,所有間接調(diào)用都是通過將被調(diào)用函數(shù)的地址加載到寄存器中并執(zhí)行分支和交換(BX)指令來完成的。這會自動更改狀態(tài)并確保代碼正常運行,無論地址在獲取時處于何種狀態(tài)。
還必須設置返回地址,以便處理器的狀態(tài)在返回時保持一致且已知。測試第 0 位地址以確定 BX 指令是否調(diào)用狀態(tài)更改。如果它不調(diào)用狀態(tài)更改,則為函數(shù)的狀態(tài)設置返回地址。如果它調(diào)用狀態(tài)更改,則為備用狀態(tài)設置返回地址并執(zhí)行代碼以返回到函數(shù)的狀態(tài)。
函數(shù)的入口點取決于獲取地址的函數(shù)的狀態(tài),因此在與函數(shù)處于相同狀態(tài)時獲取該函數(shù)的地址更有效。這可確保使用實際函數(shù)的地址,而不是其備用入口點。間接調(diào)用本身可以調(diào)用狀態(tài)更改,因此即使從不同的狀態(tài)調(diào)用它,也不需要通過其備用入口點進入函數(shù)。
Example6-8 顯示了調(diào)用 max() 的 sum(),具有針對 16-BIS 狀態(tài)編譯的代碼并支持雙狀態(tài)交互工作。sum( ) 函數(shù)使用 -code_state=16 選項進行了編譯,該選項為 UAL 之前的匯編代碼創(chuàng)建 16 位指令。(有關 UAL 語法的信息,請參閱《ARM 匯編語言工具用戶指南》。)Example6-11 顯示了相同的函數(shù)調(diào)用,具有針對 32-BIS 狀態(tài)編譯的代碼并支持雙狀態(tài)交互工作。函數(shù) max( ) 在編譯時未使用 -code_state=16 選項,并創(chuàng)建 32 位指令。