《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 解決方案 > ARM匯編語言子程序調(diào)用及返回

ARM匯編語言子程序調(diào)用及返回

2017-06-22
關(guān)鍵詞: 匯編語言

在ARM匯編語言中,子程序調(diào)用是通過BL指令來完成的。BL指令的語法格式如下:

BL          subname

其中:subname是被調(diào)用的子程序的名稱。BL指令完成2個操作,即將子程序的返回地址放在LR寄存器中,同時將PC寄存器值設(shè)置成目標(biāo)子程序的第一條指令地址。

在返回調(diào)用子程序時,轉(zhuǎn)移鏈接指令保存到LR寄存器中的值需要拷貝回程序寄存器PC。對于最簡單的子程序,一條MOV指令就可完成子程序的返回,例如:

SUB2      …

              MOV             PC,R14               ;把R14拷貝到R15來返回

其實(shí),任何數(shù)據(jù)處理指令都可用來計算返回地址,但是MOV指令時至今最常見的形式。碎玉在子程序中出現(xiàn)嵌套調(diào)用時,鏈接寄存器LR中的返回地址可能會在第二次調(diào)用時被覆蓋,所以需要將返回地址壓入堆棧來進(jìn)行保存。在子程序返回時,返回地址和保存的工作寄存器都可用多寄存器存取指令恢復(fù)。例如:

       SUB1             STMFD          R13!,{R0-R2,R14}            ;保存工作寄存器和鏈接

                            BL                 SUB2

                                   …

                            LDMFD         R13!,{R0-R2,PC}              ;恢復(fù)工作寄存器并返回

需要注意的是,返回地址是直接恢復(fù)到程序計數(shù)器PC,而不是鏈接寄存器LR。這種單元恢復(fù)和返回指令是非常有用的。

下面是一個子程序調(diào)用的簡單例子。子程序DOADD完成加法運(yùn)算,操作數(shù)放在R0和R1寄存器中,結(jié)果放在R0中。

AREA     EXAMPLE,CODE,READONLY

              ENTRY

Start              MOV             R0,#10               ;設(shè)置輸入?yún)?shù)R0

              MOV             R1,#3                 ;設(shè)置輸入?yún)?shù)R1

              BL                 Doadd                   ;調(diào)用子程序Doadd

                     …

Doadd     ADD              R0,R0,R1         ;子程序

              MOV             PC,LR                ;從子程序中返回

END                                                        ;結(jié)束匯編


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。