.幾種特定的ATPCS...


      A.支援資料堆疊限制檢查的ATPCS.


      如果在程式設計期間能够准確地計算出程式所需的記憶體總量,就不需要進行資料堆疊的檢查,但是在通常情况下這是很難做到的,這時需要進行資料堆疊的檢查. 在進行資料堆疊的檢查時,使用暫存器R10作為資料堆疊限制指標,這時暫存器R10又記作sl.用户在程式中無法控制該暫存器.具體來説,支援資料堆疊限制的ATPCS要滿足下面的規則: 在已經占有的堆疊的最低位址和sl之間必須有256位元組的空間,也就是説,sl所指的記憶體位址必須比已經使用的堆疊的最低位址低256個位元組.當中斷處理程式可以使用用户的資料堆疊時,在已經使用的堆疊的最低位址和sl之間除了必須保留的256個位元組的記憶體單元外,還必須為中斷處理預留足够的記憶體空間; 用户在程式中無法修改sl的值;資料堆疊堆疊指標sp的值必須不小于sl的值.


      與支援資料堆疊限制檢查的ATPCS相關的編譯/彙編選項有下面幾種: 選項/SWST 指示編譯器生成的程式碼遵守支援資料堆疊限制檢查的ATPCS,用户在程式設計期間無法够准確計算程式所需的資料堆疊大小時,需要指定該選項;選項/noswst指示編譯器生成的程式碼不支援資料堆疊限制檢查的功能,用户在程式設計期間能够准確計算出程式所需的資料堆疊大小,可以指定該選項,這個選項是預設的;選項/SWSTNA 如果組譯器對于是否進行資料堆疊檢查無所謂,而與該組譯器連線的其他程式指定了選項swst/noswst,這時使用該選項.


      編寫遵守支援資料堆疊限制檢查的ATPCS的組合語言程式.


      對于C程式和C++程式來説,如果在編譯時指定了選項SWST,生成的目標程式碼將遵守支援資料堆疊限制檢查的ATPCS. 對于組合語言程式來説,如果要遵守支援資料堆疊限制檢查的ATPCS,用户在編寫程式時必須滿足支援資料堆疊限制檢查的ATPCS所要求的規則,然後指定選項SWST,下面介紹用户編寫組合語言程式時的一些要求.


      葉子子程式是指不呼叫彆的程式的子程式.


      資料堆疊小于256位元組的葉子子程式不許要進行資料堆疊檢查,如果幾個子程式組合起來構成的葉子子程式資料堆疊也小于256位元組,這個規則同様適用; 資料堆疊小于256位元組的非葉子子程式可以使用下面的程式碼段來進行資料堆疊檢查.


      ARM程式使用:
SUB sp,sp,#size ;#size
spsl之間必須保留的空間大小
CMP sp,sl;
BLLO _ARM_stack_overflow


      THUMB程式使用:
ADD sp,#-size ; #size
spsl之間必須保留的空間大小
CMP sp,sl;
BLLO _THUMB_stack_overflow


      資料堆疊大于256位元組的子程式,為了保證sp的值不小于資料堆疊可用的記憶體單元最小的位址值,需要引入相應的暫存器.


      ARM程式使用下列程式碼:
SUB ip,sp,#size;
CMP ip,sl;
BLLO _ARM_stack_overflow


      THUMB程式使用下列程式碼:
LDR wr,#-size;
ADD wr,sp;
CMP wr,sl;
BLLO _THUMB_stack_overflow


      支援唯讀段位置無關的ATPCS...


      支援可讀寫段位置無關的ATPCS...


      支援ARM程式和THUMB程式混合使用的ATPCS...


      在編譯或彙編時,使用/intework告訴編譯器或彙編器生成的目標程式碼遵守支援ARM程式和THUMB程式混合使用的ATPCS,它用在以下場合: 程式中存在ARM程式呼叫THUMB程式的情况;程式中存在THUMB程式呼叫ARM程式的情况;需要連線器來進行ARM狀態和THUMB狀態切换的情况;.在下述情况下使用選項nointerwork:程式中不包含THUMB程式;用户自己進行ARM程式和THUMB程式切换.需要注意的是:在同一個C/C++程式中無法同時有ARM指令和THUMB指令.

    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()