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