freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

第9章arm程序設(shè)計(jì)-資料下載頁

2024-10-24 15:00本頁面

【導(dǎo)讀】清水河,研究院大樓108. 第9章ARM程序設(shè)計(jì)。主要分為基于Windows平臺(tái)的和基于Linux平臺(tái)的。–ADS,目前已經(jīng)基本被替代。司,入門簡單,授權(quán)費(fèi)用高。德國Keil公司,多用于低端ARM處理器開發(fā)。–ARM-Linux-GCC,GNU開發(fā)的編譯器集,依賴于不同的。目標(biāo)機(jī)的平臺(tái),使用繁瑣但不需要授權(quán)費(fèi)用。替代ADS的新一代開發(fā)環(huán)境。集程序的編輯、編譯及調(diào)試于一體。支持軟件仿真和硬件調(diào)試。目前廣泛的應(yīng)用于ARM處理器開發(fā)。包括CodeWarriorIDE集成開發(fā)環(huán)境和。有很大的不同,因此匯編源程序幾乎不具有移植性;但匯。源程序,如:內(nèi)存邏輯段的劃分情況、數(shù)據(jù)在內(nèi)存中的存。這些信息的說明由匯編程序指定相應(yīng)的偽。指令來完成,并不由CPU定義;目標(biāo)代碼,并在程序運(yùn)行過程中執(zhí)行;能在宏中進(jìn)行聲明。給一個(gè)雙精度VFP寄存器命名。GBLSTest3;聲明全局字符串變量為Test3,賦值為"Testing“。;聲明寄存器列表RegList,LDM/STM指令可通過該名稱訪問寄存器列表

  

【正文】 (2):數(shù)據(jù)棧使用規(guī)則 ARM的數(shù)據(jù)棧可為 FD(Full Descending), ED(Empty Descending), FA(Full Ascending)或 EA(Empty Ascending) ,但 ATPCS規(guī)定數(shù)據(jù)棧為 FD類型,且 8字節(jié)對(duì)齊 的。 ? 數(shù)據(jù)棧 指針 (stack pointer)指向最后入棧的數(shù)據(jù)單元地址。 ? 數(shù)據(jù)棧 基址 (stack base)指向數(shù)據(jù)棧的最高地址。 ? 數(shù)據(jù)棧 界限 (stack limit)指向數(shù)據(jù)棧的最低地址。 ? 已占用的數(shù)據(jù)棧 (used stack)指?;泛?SP之間的區(qū)域,其中包括棧指針對(duì)應(yīng)的內(nèi)存單元。 ? 數(shù)據(jù)棧中的 數(shù)據(jù)幀 (stack frame)指棧中為子程序分配的用來保存寄存器和局部變量的區(qū)域。 對(duì)于匯編代碼來說,必須保證在進(jìn)入該匯編代碼后,直到調(diào)用外部代碼之間,棧指針變化為偶數(shù)個(gè)字; 應(yīng)使用 PRESERVE8偽指令告訴連接器,本匯編代碼是 8字節(jié)對(duì)齊的; 應(yīng)使用 FRAME偽指令描述數(shù)據(jù)幀 ; 基本 ATPCS(3):參數(shù)傳遞規(guī)則 子程序入口參數(shù)傳遞規(guī)則 參數(shù)不超過 4個(gè)時(shí)使用寄存器 R0~R3,依次將各字?jǐn)?shù)據(jù)傳送到 寄存器; 參數(shù)超過 4個(gè)時(shí)將剩余的字?jǐn)?shù)據(jù)傳送到 數(shù)據(jù)棧, 入棧的順序與參數(shù)順序相反,即最后一個(gè)參數(shù)先入棧。 子程序結(jié)果返回規(guī)則 當(dāng)結(jié)果為一個(gè) 32位的整數(shù)時(shí)通過寄存器 R0返回子程序結(jié)果; 當(dāng)結(jié)果為一個(gè) 64位的整數(shù)時(shí)通過 R0和 R1返回子程序結(jié)果,以此類推; 當(dāng)對(duì)于位數(shù)更多的子程序結(jié)果,需要通過調(diào)用內(nèi)存來傳遞。 56/52 C程序調(diào)用匯編函數(shù) 1. 匯編程序的設(shè)置要遵循 ATPCS 規(guī)則,保證程序調(diào)用時(shí) 參數(shù)、寄存器和堆棧 的正確使用。 EXPORT 偽指令聲明本子程序,使其它程序可以調(diào)用此子程序。 C 語言程序中使用 extern關(guān)鍵字聲明要調(diào)用的匯編子程序?yàn)橥獠亢瘮?shù)。 匯編程序調(diào)用 C函數(shù) ATPCS 規(guī)則 ,保證程序調(diào)用時(shí) 參數(shù)、寄存器和堆棧 的正確使用。 IMPORT 偽指令聲明將要調(diào)用的 C 程序函數(shù)。 BL 調(diào)用 C程序函數(shù)。 AREA SCopy, CODE, READONLY EXPORT strcopy 。 聲明 strcopy為導(dǎo)出符號(hào) strcopy LDRB R2, [R1], 1 。 R1中的值為源數(shù)據(jù)塊的首地址 STRB R2, [R0], 1 。 R0中的值為目標(biāo)數(shù)據(jù)塊的首地址 CMP R2, 0 BNE strcopy 。 未復(fù)制完,循環(huán)繼續(xù)復(fù)制 MOV PC, LR 。 復(fù)制完畢,返回 END extern void strcopy(char *d,const char *s) //參數(shù)由左向右依次傳遞給 R0~R3: d為目標(biāo)指針 (R0); s為源指針 (R1) int main(void) { const char *srcstr= First string soure。 char deststr[] = Second string destination。 …… strcopy(deststr,srcstr)。 //調(diào)用匯編函數(shù) strcopy …… } 數(shù)據(jù)塊復(fù)制 20201129 58/52 例 RVDS上的運(yùn)行結(jié)果 int g(int a, int b, int c, int d, int e) { return a + b + c + d + e } 在匯編函數(shù) f中調(diào)用 C函數(shù) g( ),以實(shí)現(xiàn)下面的功能: int f(int i){ return g(i, 2*i, 3*i, 4*i, 5*i)} EXPORT f AREA f, CODE, READONLY ENTRY IMPORT g 。 聲明 g為外部引用符號(hào) STR LR, [SP, 4] 。 將 斷點(diǎn) 存入堆棧 MOV R0,2 。 i=2 ADD R1, R0, R0 。 (R1)=i*2 ADD R2, R1, R0 。 (R2)=i*3 ADD R3, R1, R2 。 (R3)=i*5 STR R3,[SP, 4] 。 將 (R3)即第 5個(gè)參數(shù) i*5存入堆棧 ADD R3, R1, R1 。 (R3)=i*4 BL g 。 調(diào)用 C函數(shù) g(),返回值在 R0中 ADD SP, SP, 4 。 調(diào)整數(shù)據(jù)棧指針,準(zhǔn)備返回 LDR PC, [SP, 4] 。 恢復(fù) 斷點(diǎn) END 20201129 60/52 例 RVDS上的運(yùn)行結(jié)果 C程序中嵌入?yún)R編代碼 ARM體系結(jié)構(gòu)支持 C、 C++以及匯編語言的混合使用,內(nèi)嵌匯編器還允許在 C程序中 嵌入?yún)R編代碼 ,以提高程序的效率。 在 ARM C語言程序中使用關(guān)鍵詞 _asm來標(biāo)識(shí)一段匯編指令程序,其格式如下: _asm { instruction [。 instruction] …… [instruction] } ?如果一行有多個(gè)匯編指令,則指令之間用分號(hào)隔開; ?如果一條指令占多行,則要使用續(xù)行符號(hào) (\); ?在匯編指令段中可以使用 C語言的注釋語句。 內(nèi)嵌匯編中使用物理寄存器的注意事項(xiàng) 1 一般不要直接指定 物理寄存器 存放數(shù)據(jù) , 而應(yīng)該使用 C變量 ,讓編譯器自動(dòng)分配寄存器。 _asm /*錯(cuò)誤 { MOV R0, x ADD y, R0, x/y } int cvar; _asm /*正確 { MOV cvar, x ADD y, cvar, x/y } C編譯器計(jì)算 x/y值時(shí)會(huì)破壞 R2, R3, R12和 LR的值;更新 N,Z, C和 V條件標(biāo)志位;并在 R0中返回商, R1中返回余數(shù)。因此左邊代碼段中 R0存放的數(shù)據(jù)在執(zhí)行 ADD指令前已被修改。 建議也不要使用 復(fù)雜的 C表達(dá)式 , 因?yàn)?編譯器 在 計(jì)算匯編代碼中的 C表達(dá)式時(shí),可能會(huì)使用物理寄存器 ( 如 R0~R R1 SP、LR ) ,并修改 CPSR中的 標(biāo)志位 。如果編譯器 無法 分配 使用 合適的寄存器,將會(huì)報(bào)告 寄存器沖突錯(cuò)誤 。 不要使用 物理 寄存器代替變量。 盡管有時(shí)寄存器明顯對(duì)應(yīng)某個(gè)變量,但也不能直接使用寄存器代替變量。 64/52 內(nèi)嵌匯編中使用物理寄存器的注意事項(xiàng) 2 int example1(int x) /*錯(cuò)誤 { _asm { ADD R0, R0, 1 } return x。 } int example1(int x) /*正確 { _asm { ADD x, x, 1 } return x。 } 進(jìn)入子程序 example1后,參數(shù) x的值的確保存在寄存器 R0中,但編譯器認(rèn)為內(nèi)嵌匯編發(fā)生了寄存器沖突,可能使用其他寄存器存放 x。因此左邊代碼段并不能完成對(duì) x的加 1操作。 內(nèi)嵌 匯編語言 中其他的注意事項(xiàng) ?內(nèi)嵌匯編指令可以使用 C表達(dá)式 ,編譯器會(huì)計(jì)算表達(dá)式的值并為其分配寄存器。但其值被視為無符號(hào)數(shù);若為帶符號(hào)數(shù)則用戶需要自己處理與符號(hào)有關(guān)的操作; ?若內(nèi)嵌匯編指令中的 C表達(dá)式包含有逗號(hào),則該表達(dá)式應(yīng)該包含在括號(hào)中; 如: _asm{ADD x, y, (f(), z)} 。 (f(), z)為 C表達(dá)式 ?內(nèi)嵌匯編指令中 常量 前面的“ ”可以省略,并使用“ 0x”代替“ amp?!?表示十六進(jìn)制數(shù); ?不支持 內(nèi)存分配 偽指令,可通過定義變量由編譯器自動(dòng)完成分配; ?不支持 BX指令,并且只有 B指令可以使用 C程序標(biāo)號(hào) ,而 BL不行; ?不能向 PC賦值,程序跳轉(zhuǎn)只能使用 B或 BL指令; ?內(nèi)嵌的 SWI和 BL指令除了正常的操作數(shù)外,可增加幾個(gè)可選的寄存器列表用于參數(shù)傳送; ? …… 內(nèi)嵌匯編指令的應(yīng)用舉例:兩個(gè)數(shù)相加 ? include ? int add(int i, int j) ? { ? int res。 /*定義中間變量 res*/ ? __asm ? { ? ADD res, i, j // 。實(shí)現(xiàn) res=i+j ? } ? return res。 ? } ? void main( ) ? { ? int a。 ? a = add(2,3)。 ? printf(addition result is : %d\n,a)。 ? } 求和 子程序 調(diào)用 子程序(注意書上漏印) 例 RVDS上的運(yùn)行結(jié)果 作業(yè) ? 必做: 、 、 ? 選做: 、 、 、 ? 注意,除題目明確要求外,所有的程序均采用匯編語言編寫 航空航天學(xué)院 清水河,研究院大樓 108 陳 敏 Email: TELE: 02861830626 第 9章 結(jié)束
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1