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

正文內(nèi)容

第9章arm程序設(shè)計(jì)-免費(fèi)閱讀

2025-11-24 15:00 上一頁面

下一頁面
  

【正文】 ? } ? void main( ) ? { ? int a。 } 進(jìn)入子程序 example1后,參數(shù) x的值的確保存在寄存器 R0中,但編譯器認(rèn)為內(nèi)嵌匯編發(fā)生了寄存器沖突,可能使用其他寄存器存放 x。 _asm /*錯誤 { MOV R0, x ADD y, R0, x/y } int cvar; _asm /*正確 { MOV cvar, x ADD y, cvar, x/y } C編譯器計(jì)算 x/y值時(shí)會破壞 R2, R3, R12和 LR的值;更新 N,Z, C和 V條件標(biāo)志位;并在 R0中返回商, R1中返回余數(shù)。 將 (R3)即第 5個(gè)參數(shù) i*5存入堆棧 ADD R3, R1, R1 。 …… strcopy(deststr,srcstr)。 BL 調(diào)用 C程序函數(shù)。 ? 數(shù)據(jù)棧中的 數(shù)據(jù)幀 (stack frame)指棧中為子程序分配的用來保存寄存器和局部變量的區(qū)域。 ⑤ 寄存器 R14用作連接寄存器 LR。 在基于 ARM的混合編程技術(shù)中, C語言子程序只需開發(fā)者指定 ATPCS類型,而匯編子程序則需完全依靠開發(fā)者來保證。 將結(jié)果保存在 R8中 ? POP {R1R7,PC} 。 設(shè)置堆棧指針 ? ADR R0,THUMB_CODE+1 。 內(nèi)循環(huán)起始 ? LDR r2,[r1] ? …… ? CMP r1,r6 ? BLT inner 。 判斷 R0中的參數(shù)是否越界 ? integer ? BHI Outofrange 。 R1中保存 data2 ? CMP R0, R1 。 用寄存器間接尋址方式讀數(shù)據(jù) 2的高 32位到 R3 ? LDR R4,[R0,4] 。 可執(zhí)行映象文件 通常由以下幾部分構(gòu)成: ? 一個(gè) 或多個(gè)代碼段,代碼段的屬性默認(rèn)為 READONLY。 ⑤ X:RIGHT:Y 返回字符串 X右端的一個(gè)子串。 字符串表達(dá)式及運(yùn)算符 字符串表達(dá)式一般由 字符串常量、字符串變量、運(yùn)算符和括號 構(gòu)成。 定義局部字符串變量 S1和 S2 LCLS S2 S1 SETS Test! S2 SETS This is a $S1 。 當(dāng)作為無符號數(shù)時(shí),其取值范圍為 0~2321 當(dāng)作為有符號數(shù)時(shí),其取值范圍為 231~2311 ? 邏輯常量只有兩種取值情況:真 {TURE}或假 {FAUSE} 。 AREA Init, CODE, READONLY GET C:\ 。 使用 IMPORT則標(biāo)號一定會被加入到當(dāng)前源文件的符號表中。 當(dāng)表達(dá)式為 32位的常量時(shí),其數(shù)據(jù)類型可以為 CODE16,CODE32或 DATA三種類型之一。 注意它們只能控制編譯方式,并不能切換處理器狀態(tài)。指定應(yīng)用程序的入口點(diǎn) 指令序列 END 。 ?DATA:用于定義數(shù)據(jù)段。 宏的名稱為 xmac,有兩個(gè)參數(shù) $p1和 $p2 $ 。子程序可以提供模塊化的程序設(shè)計(jì)、節(jié)省存儲空間并提高運(yùn)行速度,但在使用子程序結(jié)構(gòu)時(shí)需要保護(hù)現(xiàn)場,從而增加了系統(tǒng)的開銷。 定義 B的長度為 4字節(jié),相對位置為 4 X FIELD 8 。 定義 X的長度為 8字節(jié),相對位置為 8 Y FIELD 8 。 定義 B的長度為 4字節(jié),位置為 0x1004 X FIELD 8 。 分配一片連續(xù)的 字 存儲單元并初始化 FdataTest DCFD 2E115, 5E7 。聲明全局字符串變量為 Test3,賦值為 Testing“ Test3 SETS Testing“ LCLA Test4 。 局部算術(shù)變量只能在宏中進(jìn)行聲明 。 LCLL 聲明和初始化一個(gè)局部邏輯變量 , 初始值為 {FALSE}。 聲明局部數(shù)字變量 Test4,賦值為 0xaa Test3 SETA 0xaa LCLL Test5 。 分配一片連續(xù)的 字 存儲單元并初始化 FdataTest DCFS 2E5, 5E7 。 定義 X的長度為 8字節(jié),位置為 0x1008 Y FIELD 8 。 定義 Y的長度為 8字節(jié),相對位置為 16 String FIELD 256 。 定義 X的長度為 8字節(jié),相對位置為 8 Y FIELD 8 。因此,在代碼較短且需要傳遞的參數(shù)較多時(shí),可以使用宏指令代替子程序。 $ …… BGE $ $ 指令 。 ?READONLY:指定本段為只讀屬性,代碼段默認(rèn)為 READONLY。通知編譯器源程序結(jié)束 18/52 ALIGN偽指令 ALIGN {表達(dá)式 {,偏移量 }} ALIGN偽指令可通過添加填充字節(jié)的方式,使當(dāng)前位置滿足一定的對其方式。 AREA Init, CODE, READONLY …… CODE32 。 Test EQU 50 。使用 EXTERN則標(biāo)號未被引用時(shí)不會被加入到當(dāng)前源文件的符號表中。 通知編譯器此處插入源文件 C:\ INCBIN 。 ? 字符串常量為一個(gè)固定的字符串,一般用于程序運(yùn)行時(shí)的信息提示。 S2的值為 This is a Test!” 26/52 常用運(yùn)算符和表達(dá)式 ? 在匯編語言程序設(shè)計(jì)中,經(jīng)常會使用各種表達(dá)式。編譯器支持的字符串最大長度為 512字節(jié) 。整數(shù) Y表示要返回的字符個(gè)數(shù) ⑥ X:CC:Y 將字符串 Y連接到字符串 X的后面形成一個(gè)新字符串。 ? 零個(gè)或多個(gè)包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性默認(rèn)為 READWRITE。 用寄存器間接尋址方式讀數(shù)據(jù) 1的低 32位到 R4 ? ADDS R6,R2,R4 。 比較 R1和 R0中的值的大小 ? BHI save 。 參數(shù)超出跳轉(zhuǎn)表范圍直接賦值 R0=0xFF ? ADR r3, JumpTable 。 內(nèi)循環(huán)結(jié)束 ? ADD r4,r4,4 ? …… ? BLE outer 。 ? BX R0 。 寄存器出棧,返回 ? END 初始化設(shè)置 切換工作狀態(tài) 調(diào)用子程序 保存現(xiàn)場和斷點(diǎn) 計(jì)算 1到 N之和 恢復(fù)現(xiàn)場和斷點(diǎn) 例 RVDS上的運(yùn)行結(jié)果 ARM匯編語言與 C/C++的混合編程 ? 在嵌入式軟件開發(fā)過程中,通常會使用包括 ARM匯編語言和 C/C++語言在內(nèi)的多種語言。 基本 ATPCS (1):寄存器使用規(guī)則 ①寄存器 R0~R3( A1~A4 ) 用做子程序參數(shù)傳遞。如果子程序中保存了返回地址,則 R14可用于其他用途。 對于匯編代碼來說,必須保證在進(jìn)入該匯編代碼后,直到調(diào)用外部代碼之間,棧指針變化為偶數(shù)個(gè)字; 應(yīng)使用 PRESERVE8偽指令告訴連接器,本匯編代碼是 8字節(jié)對齊的; 應(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ù)先入棧。 AREA SCopy, CODE, READONLY EXPORT strcopy 。 //調(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 。 (R3)=i*4 BL g 。因此左邊代碼段中 R0存放的數(shù)據(jù)在執(zhí)行 ADD指令前已被修改。因此左邊代碼段并不能完成對 x的加 1操作。 ? a = add(2,3)。實(shí)現(xiàn) res=i+j ? } ? return res。 } int example1(int x) /*正確 { _asm { ADD x, x, 1 } return x。 內(nèi)嵌匯編中使用物理寄存器的注意事項(xiàng) 1 一般不要直接指定 物理寄存器 存放數(shù)據(jù) , 而應(yīng)該使用 C變量 ,讓編譯器自動分配寄存器。 (R3)=i*5 STR R3,[SP, 4] 。 char deststr[] = Second string destination。 IMPORT 偽指令聲明將要調(diào)
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1