国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

DSP編程技巧之20---理解函數(shù)的調(diào)用過程

發(fā)布時間:2014-12-3 16:21    發(fā)布者:看門狗
關(guān)鍵詞: DSP編程
作者:paradoxfx 來源:電子產(chǎn)品世界

  在我們使用C/C++對DSP進行編程的時候,函數(shù)無疑是功能模塊劃分的重要組成部分,這些函數(shù)之間則通過顯式地調(diào)用或者中斷等方式來共同工作。除了對特定的RTS庫中的函數(shù)(例如某些數(shù)學函數(shù))的調(diào)用按照它們內(nèi)置規(guī)則進行分配外,我們自定義的函數(shù)之間的調(diào)用則需要遵循一定的規(guī)則,了解這一過程對理解程序的執(zhí)行和調(diào)試也是十分有幫助的,下面我們就來解讀一下函數(shù)的調(diào)用過程,并且可以從其中了解到CPU寄存器、FPU寄存器以及棧(stack)在這一過程中的作用。

  一.父函數(shù)調(diào)用子函數(shù)

  在父函數(shù)調(diào)用子函數(shù)(被調(diào)函數(shù))時,通常會執(zhí)行以下的步驟:

  1.如果寄存器不是SOE類型的(入口保存,save on entry),即它的值沒有被被調(diào)用函數(shù)占用,但是在被調(diào)用函數(shù)返回值之后又會用到該寄存器的值的話,則該寄存器的值被保存在棧中。

  2.如果被調(diào)函數(shù)返回一個結(jié)構(gòu)體,則調(diào)用函數(shù)會為結(jié)構(gòu)體分配空間,并且把這段空間的地址作為第一個參數(shù)傳遞給被調(diào)函數(shù),被調(diào)函數(shù)需要創(chuàng)建一個該結(jié)構(gòu)體的本地副本。

  3.傳遞給被調(diào)函數(shù)的參數(shù)一般情況下會保存在寄存器中,在必要的情況下則會保存在棧中,因為寄存器的數(shù)量有限;具體的規(guī)則是:

  (1)如果目標器件是FPU,并且傳遞的有32位的浮點從那時,則前4個浮點參數(shù)被保存在R0H-R3H這4個FPU寄存器中(注意與CPU寄存器AR0H-AR3H相區(qū)別)。

  (2)如果有64位的整形(longlong)參數(shù),則第一個64位整形參數(shù)的高32位存入ACC寄存器中,低32位存入P寄存器中,其它的64位整形參數(shù)按照逆序(函數(shù)聲明中參數(shù)列表里最左邊的參數(shù)最后被壓入棧中)保存在棧中。

  此外,如果P寄存器被用于參數(shù)傳遞,則對該函數(shù)的裝入(prolog)和排空(epilog)的提取的優(yōu)化功能(通過減小性能達到減小程序尺寸)被禁止。

  (3)如果參數(shù)中有任何的32位長整形或者浮點型,則第一個會放入ACC寄存器中,其它的32位參數(shù)則按照逆序保存在棧中。

  (4)指針參數(shù)被放入CPU寄存器XAR4和XAR5中,其它的指針則存入棧中。

  (5)剩余的16位的參數(shù)在CPU寄存器AL,AH,XAR4和XAR5可用的情況下,按照這一寄存器的順序被保存在它們中。

  4.任何沒有被存入寄存器的參數(shù)都會被以逆序壓入棧中,所有的32位參數(shù)在壓入棧中時都會對齊到偶數(shù)地址。

  如果一個函數(shù)的參數(shù)中使用了省略號,即參數(shù)個數(shù)是可變的,則最后一個顯式聲明的參數(shù)在壓入棧中之后,它在棧中的地址可以用來定位未顯式聲明的參數(shù)。

  5.棧指針SP必須在父函數(shù)調(diào)用子函數(shù)之前偶對齊。如果不是偶對齊,則需要把SP加1.

  6.父函數(shù)使用LCR指令(使用返回程序指針寄存器RPC的方式來進行22位的長調(diào)用)來調(diào)用子函數(shù),在調(diào)用時RPC寄存器的值會被壓入棧中,從而可以把返回地址保存在RPC寄存器中。

  7.最后,棧被對齊到函數(shù)的邊界上。

  二.子函數(shù)響應(yīng)父函數(shù)

  在子函數(shù)被調(diào)用時,通常會執(zhí)行以下的步驟:

  1.如果被調(diào)函數(shù)修改了XAR1、XAR2或者XAR3的值,則必須保存它們的值,因為在調(diào)用前后,父函數(shù)假設(shè)這3個寄存器的值在被返回之前是被保留的。如果目標是FPU,并且在被調(diào)函數(shù)中修改了R4H-R8H的值,則同樣需要保存它們的值。

  2.被調(diào)用的函數(shù)需要在棧中為所有的本地變量、臨時存儲區(qū)域已經(jīng)任何被調(diào)用的參數(shù)分配足夠的空間。在通過為SP寄存器加偏移量跳轉(zhuǎn)到被調(diào)函數(shù)之后,這段存儲空間就立刻被分配了。

  3.棧被對齊到函數(shù)的邊界上。

  4.如果被調(diào)用的函數(shù)參數(shù)中有結(jié)構(gòu)體,則它實際接收到的是該結(jié)構(gòu)體的指針。如果在被調(diào)函數(shù)中對該結(jié)構(gòu)體進行了寫操作,則必須在棧中分配空間以創(chuàng)建該結(jié)構(gòu)體的副本,在完成操作之后把本地結(jié)構(gòu)體通過指針復(fù)制回原有的結(jié)構(gòu)體。如果在被調(diào)函數(shù)中不對傳入的結(jié)構(gòu)體參數(shù)進行寫操作,則可以通過對其指針的操作來完成參數(shù)的引用。

  5.完成參數(shù)傳入之后,被調(diào)函數(shù)執(zhí)行它本身的代碼。

  6.功能執(zhí)行完成之后,被調(diào)函數(shù)返回值,根據(jù)返回值的類型,它們值的保存位置分別為:

  16位整數(shù):AL寄存器

  32位整數(shù):ACC寄存器

  64位整數(shù):ACC和P寄存器

  16位或者22位指針:XAR4寄存器

  FPU下的32位浮點數(shù):R0H寄存器

  結(jié)構(gòu)體:其指針保存在XAR4寄存器中

  在返回結(jié)構(gòu)體的情況下,例如s=f(x),其中s為結(jié)構(gòu)體,f為函數(shù),則可以直接用f(&s,x)的方式在父函數(shù)中調(diào)用子函數(shù)f,通過結(jié)構(gòu)體指針,被調(diào)函數(shù)可以自動返回結(jié)構(gòu)體的值了。

  7.通過把SP中減去調(diào)用子函數(shù)時加的偏移量,SP寄存器可以重新指向父函數(shù)。

  8.被調(diào)函數(shù)恢復(fù)所有在第一步中保存的建城七隊值。

  9.被調(diào)函數(shù)使用LRETR(使用PC指針返回)指令返回,PC寄存器的值被置為RPC寄存器中的值,即返回地址,然后RPC寄存器中的原有值被推出棧并重新保存在RPC寄存器中。

  通過以上的描述,可以看出棧在函數(shù)調(diào)用前后起著非常關(guān)鍵的中繼作用。所以,如果在調(diào)用時傳遞的參數(shù)非常多,例如傳遞了一個很長的數(shù)組,或者有多個64位的參數(shù),則棧很有可能沒有足夠的空間來完成參數(shù)的暫存,造成棧的溢出,甚至造成程序運行結(jié)果的異常或者錯誤的輸出結(jié)果,因為編譯器無法檢查棧的溢出錯誤(除非我們自己編寫某些代碼來檢測),所以要為棧分配一個相對較大的存儲空間,它的默認值是1K字。即使是非常小的程序,常用例程里棧的長度也往往能達到0x400這樣的長度。
本文地址:http://m.qingdxww.cn/thread-134636-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責;文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • 利用SAM E54 Xplained Pro評估工具包演示CAN轉(zhuǎn)USB橋接器以及基于CAN的主機和自舉程序應(yīng)用程序
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产国语对白一级毛片 | 妻子的诱惑中文版在线免费观看 | 91亚洲人成手机在线观看 | 日日噜| 国产亚洲欧美日韩在线看片 | www.狠狠插 | 国产香蕉一区二区在线网站 | 精品中文字幕一区二区三区四区 | a毛片全部免费播放 | 激情天堂| 亚洲精品中文字幕乱码影院 | 亚洲自拍偷拍区 | 亚洲黄色一级 | 亚洲综合插插 | 国产日韩欧美自拍 | 性夜影院爽黄a爽免费视 | 日韩男女视频 | 国产精品短视频 | 精品国产区一区二区三区在线观看 | 伊人影视在线观看日韩区 | 日本在线视频网址 | 亚洲日韩中文字幕一区 | 窝窝午夜一级看片爽 | 亚洲欧洲精品国产二码 | 四虎免费永久网站入口 | 国产 另类 在线 欧美日韩 | 伊人久操| 欧美日韩精选 | 国产97免费视频 | 国产欧美一区二区成人影院 | 欧美在线观看视频一区 | 91网址 | 欧美日韩一区二区三区自拍 | 自拍偷拍另类 | 亚洲综合色网站 | 蜜臀传煤mv在线观看 | 日韩高清网站 | 欧美成人免费网站 | 美国一级毛片片aa成人 | 国产99视频精品免费观看7 | 日日噜噜夜夜狠狠视频 |