為了使單獨編譯的c語言和匯程式設計序之間能夠相互呼叫,必須為子程式間的呼叫規定一定的規則。atpcs就是arm和thumb程式中子程式呼叫的基本規則
基本規則包括子程式呼叫過程中暫存器的使用規則、資料棧的使用規則、引數的傳遞規則。根據需要分為
組合語言子程式必須滿足:
規定了在子程式呼叫時的一些基本規則,包括:
相對於其他atpcs,滿足基本atpcs的程式的執行速度更快,所占用的記憶體更少。但是它不能提供以下的支援:
6.2.1 暫存器的使用規則
6.2.2 資料棧使用規則
棧指標的位置,指向棧頂位置稱為full棧;指向與棧頂元素相鄰的乙個可用資料單元時,稱為empty棧
棧的增長方向,當向記憶體位址減小的方向增長時,稱為descending棧;當向記憶體位址增加的方向增長時,稱為ascending棧。
4種資料棧:
6.2.3 引數傳遞規則
引數個數固定的子程式
如果系統包含浮點運算的硬體部件,浮點運算將按照下面的規則傳遞:
第乙個整數引數,通過暫存器r0~r3來傳遞。其他引數通過資料棧傳遞。
引數個數可變的子程式
當不超過4個時,可以使用暫存器r0~r3來傳遞引數;超過4個時,還可以使用資料棧來傳遞引數。
子程式結果返回規則:
6.3.1 支援資料棧限制檢查的atpcs
基本原理
在進行資料棧檢查時,使用暫存器r10作為資料棧限制指標,這時暫存器r10又記作sl.使用者在程式中不能控制該暫存器。
這種atpcs要滿足以下規則:
編寫匯程式設計序
葉子子程式是指不呼叫別的程式的子程式
編寫支援資料棧限制檢查的aptcs的匯程式設計序
6.3.2 支援唯讀段位置無關(ropi)的aptcs
支援唯讀段位置無關(ropi)的atpcs的應用場合
可以避免必須將程式放在特定的位置
應用場合:
遵守支援唯讀段位置無關(ropi)的atpcs的程式設計
6.3.3 支援可讀寫段位置無關(rwpi)的atpcs
如果乙個程式中所有的可讀可寫都是位置無關的,則稱程式遵守支援可讀可寫段位置無關(rwpi)的aptcs。使用支援可讀寫段位置無關(rwpi)的atpcs可以避免必須將程式存放到特定的位置。這時r9通常作為靜態基址暫存器,記作sb。可重入的子程式可以在記憶體中同時有多個例項。各個例項擁有獨立的可讀寫段。在生成乙個新的例項時,sb指向該例項的可讀寫段。rwpi段中的符號的計算方法:聯結器首先計算出該符號相對於rwpi段中某特定位置的偏移量,通常該特定位置選為rwpi段的第乙個位元組處,在程式執行時,將該偏移量加到sb上即可生成該符號的位址。
6.3.4 支援arm程式和thumb程式混合使用的atpcs
在編譯或彙編時,使用/interwork告訴編譯器(或彙編器)生成的目標**遵守支援arm程式和thumb程式混合使用的atpcs,用在以下場合:
6.3.5 處理浮點運算的atpcs
atpcs支援vfp和fpa體系兩種不同的浮點硬體體系和指令集。兩種體系對應的**不相容。
程式設計第六章總結
一 主要內容摘要 1 for語句 for 表示式1 表示式2 表示式3 迴圈體語句 用途 在迴圈頂部進行迴圈條件測試,如果迴圈條件第一次迴圈就為假,則迴圈體一次也不執行,即用於實現當型迴圈控制結構。適用於迴圈次數已知 技術控制的迴圈。例 輸出1 100之間所有偶數 include using nam...
ARM體系結構與程式設計學習(六)
adr偽指令例項 設定本段程式的名稱及屬性 area adrlabel code,readonly entry start 跳轉到子程式func執行 bl func 呼叫angel swireason reportexception arm semihosting swi stop mov r0,0...
mysql第六章 第六章 mysql日誌
第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...