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

正文內(nèi)容

第9章arm程序設(shè)計(jì)(存儲(chǔ)版)

2024-12-03 15:00上一頁面

下一頁面
  

【正文】 用的 C 程序函數(shù)。 ? 已占用的數(shù)據(jù)棧 (used stack)指?;泛?SP之間的區(qū)域,其中包括棧指針對(duì)應(yīng)的內(nèi)存單元。SP在子程序進(jìn)入和退出時(shí)的值必須相等。 ARM基本 的 ATPCS規(guī)定了 寄存器 使用、 數(shù)據(jù)棧 使用以及 參數(shù) 傳遞這三方面的基本規(guī)則; 而派生的其他幾種特定的 ATPCS則 是在 此 基礎(chǔ)上再添加其他規(guī)則 (如支持 子程序可重入性 、 數(shù)據(jù)棧 界限 檢查 等) 而形成 的。 將 N的值復(fù)制到 R2,并影響相應(yīng)條件標(biāo)志 ? …… ? SUN_L1 ? ADD R0,R1 ? …… ? BHS SUM_END ? …… ? B SUN_L1 ? SUM_ERR ? MOV R0,0 ? SUM_END ? MOV R8,R0 。 標(biāo)識(shí)程序入口 ? CODE32 ? ARM_CODE ? LDR SP,=0X30003F00 。 外循環(huán)起始 ? LDR r1,=src ? inner 。 運(yùn)算 ? CMP r0, num 。 R0中保存 data1 ? LDR R1, data2 。 R0中保存 data2的首地址 ? LDR R3, [R0] 。當(dāng)程序較長(zhǎng)時(shí),可以分割為多個(gè)代碼段和數(shù)據(jù)段,多個(gè)段在程序編譯連接時(shí)最終形成一個(gè)可執(zhí)行的映象文件。整數(shù) Y表示要返回的字符個(gè)數(shù) 。 X:ROL:Y X循環(huán)左移 Y位 X:ROR:Y X循環(huán)右移 Y位 X:SHL:Y X左移 Y位 X:SHR:Y X右移 Y位 X:AND:Y 按位邏輯與 X:OR:Y 按位邏輯或 :NOT:Y 按位邏輯非 X:EOR:Y 按位邏輯異或 X = Y X等于 Y X Y X大于 Y X Y X小于 Y X = Y X大于等于 Y X = Y X小于等于 Y X /= Y X不等于 Y X Y X不等于 Y X:LAND:Y 邏輯與 X:LOR:Y 邏輯或 :LNOT:Y 邏輯非 X:LEOR:Y 邏輯異或 28/52 注意:這些運(yùn)算在匯編過程中計(jì)算,機(jī)器碼中出現(xiàn)的已經(jīng)是表達(dá)式的值了。 LCLS S1 。 ? 數(shù)字常量一般為 32位的整數(shù),用“ ”標(biāo)識(shí)。 ?INCBIN偽指令用于將一個(gè) 目標(biāo)文件或數(shù)據(jù)文件 包含到當(dāng)前的源文件中 被包含的文件不作任何變動(dòng),編譯器從其后開始繼續(xù) 處理。若該標(biāo)號(hào)被 B或 BL指令引用,則將 B或 BL指令置為 NOP操作。其中 EQU可用 “ *” 代替。為 8字節(jié)對(duì)齊 指令序列 END 20201129 19/52 CODE1 CODE32偽指令 在 ARM指令和 Thumb指令混合編程的代碼里,該偽指令用于通知編譯器其后的指令序列為 16位還是 32位。代碼段 Init屬性為只讀 ENTRY 。 ,多個(gè)屬性關(guān)鍵字以逗號(hào)分隔: ?CODE:用于定義代碼段。 宏定義開始 $lable xmac $p1, $p2 。 宏 的使用方式和功能與 子程序 有些相似。 定義 A的長(zhǎng)度為 4字節(jié),相對(duì)位置為 0 B FIELD 4 。 定義 B的長(zhǎng)度為 4字節(jié),相對(duì)位置為 4 X FIELD 8 。 定義 A的長(zhǎng)度為 4字節(jié),位置為 0x1000 B FIELD 4 。 分配一片連續(xù)的 半字 存儲(chǔ)單元并初始化 DataTest DCD 4, 5, 6 。聲明全局邏輯變量 Test2,賦值為“真” Test2 SETL {TRUE} GBLS Test3 。即一般用匯編語言開發(fā) 應(yīng)用軟件時(shí)應(yīng)依次 完成以下幾個(gè)步驟: ( 1)編輯得到源程序 ( 2)匯編得到目標(biāo)代碼(解決語法錯(cuò)誤) ( 3)鏈接得到可執(zhí)行文件(解決定位錯(cuò)誤) ( 4)調(diào)試得到功能正確的應(yīng)用軟件(解決邏輯錯(cuò)誤) (以上第 2~ 4步任何一步有錯(cuò)都應(yīng)返回到第 1步重來) 7/52 符號(hào)定義偽指令 符號(hào)類型 指示符 功能 符號(hào)定義 偽指令 GBLA 聲明和初始化一個(gè) 全局 算術(shù)變量 , 初始值為 0 GBLL 聲明和初始化一個(gè)全局邏輯變量 , 初始值為 {FALSE} GBLS 聲明和初始化一個(gè)全局字符串變量 , 初始值為空 LCLA 聲明和初始化一個(gè) 局部 算術(shù)變量 , 初始值為 0。 局部邏輯變量只能在宏中進(jìn)行聲明 。 聲明局部邏輯變量 Test5 ,賦值為“真” Test4 SETL {TRUE} LCLS Test6 。 分配一片連續(xù)的 字 存儲(chǔ)單元并初始化 DataTest DCQ 100 。 定義 Y的長(zhǎng)度為 8字節(jié),位置為 0x1010 String FIELD 256 。 定義 String為 256字節(jié),相對(duì)位置為 24 ADR R9, DATASTART;偽指令 ADR 初始化 R9 LDR R5, B 。 定義 Y的長(zhǎng)度為 8字節(jié),相對(duì)位置為 16 String FIELD 256 。 20201129 14/52 定義一條宏指令,使其可以完成測(cè)試 跳轉(zhuǎn)操作。 $ BL $p1 。 ?READWRITE:指定本段為可讀寫屬性,數(shù)據(jù)段默認(rèn)為 READWRITE。其中: ?表達(dá)式可能的取值為 2的冪(如 1, 2, 4, 8和 16等)。 通知編譯器其后為 32位的 ARM指令 LDR R0, = NEXT + 1 。 定義常量 Test的值為 50 Addr EQU 0x55, CODE32 。 ?標(biāo)號(hào)在程序中區(qū)分大小寫。 通知編譯器此處插入數(shù)據(jù)文件 INCBIN C:\ 。 20201129 25/52 變 量 ARM(Thumb)匯編程序支持?jǐn)?shù)字變量、邏輯變量和字符串變量。表達(dá)式 常用于各種變量的運(yùn)算,一般由變量、常量、運(yùn)算符和括號(hào)構(gòu)成。 ① LEN:X 返回字符串 X的長(zhǎng)度 (字符數(shù) )。 20201129 29/52 其它常用運(yùn)算符 ③ ?X 返回定義符號(hào) X的代碼行所生成的可執(zhí)行代碼的長(zhǎng)度(字 節(jié)數(shù)) ④ :DEF:X 判斷是否定義了符號(hào) X:如果符號(hào) X已經(jīng)定義則結(jié)果為真,否則為假。 ? 零個(gè)或多個(gè)不包含初始化數(shù)據(jù)的數(shù)據(jù)段,數(shù)據(jù)段的屬性為默認(rèn)為 READWRITE。 低 32位相加,并影響標(biāo)志位,保存進(jìn)位 ? ADC R5,R1,R3 。 R0R1則跳轉(zhuǎn)到標(biāo)號(hào)為 save處 ? MOV R0,R1 。 讀跳轉(zhuǎn)表首地址 ? LDR pc, [r3,r0,LSL2] 。 外循環(huán)結(jié)束 ? AREA Array,DATA,READWRITE ? src DCD 2,4,10,8,14,1,20 。 跳轉(zhuǎn)并切換處理器狀態(tài) ? LTORG 。一般情況下,一個(gè) ARM工程 (project)應(yīng)該由多個(gè)文件組成,其中包括: – 擴(kuò)展名為 .s的匯編語言源文件 – 擴(kuò)展名為 .c的 C語言源文件 – 擴(kuò)展名為 .cpp的 C++源文件 – 以及擴(kuò)展名為 .h的頭文件等 ARM匯編語言與 C/C++的混合編程 1.初始化程序部分 硬件系統(tǒng)的 初始化 ,包括設(shè)定 CPU工作狀態(tài), 中斷使能,主頻設(shè)定,以及 RAM的控制參數(shù) 設(shè)置及初始化等,通常都使用匯編代碼。被調(diào)用的子程序在返回前無需恢復(fù)其內(nèi)容。 ⑥ 寄存器 R15是程序計(jì)數(shù)器 PC,不能用于其他用途。 子程序結(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)存來傳遞。 聲明 strcopy為導(dǎo)出符號(hào) strcopy LDRB R2, [R1], 1 。 聲明 g為外部引用符號(hào) STR LR, [SP, 4] 。 調(diào)用 C函數(shù) g(),返回值在 R0中 ADD SP, SP, 4 。 建議也不要使用 復(fù)雜的 C表達(dá)式 , 因?yàn)?編譯器 在 計(jì)算匯編代碼中的 C表達(dá)式時(shí),可能會(huì)使用物理寄存器 ( 如 R0~R R1 SP、LR ) ,并修改 CPSR中的 標(biāo)志位 。 內(nèi)嵌 匯編語言 中其他的注意事項(xiàng) ?內(nèi)嵌匯編指令可以使用 C表達(dá)式 ,編譯器會(huì)計(jì)算表達(dá)式的值并為其分配寄存器。 ? printf(addition result is : %d\n,a)。 /*定義中間變量 res*/ ? __asm ? { ? ADD res, i, j // 。 64/52 內(nèi)嵌匯編中使用物理寄存器的注意事項(xiàng) 2 int example1(int x) /*錯(cuò)誤 { _asm { ADD R0, R0, 1 } return x。 instruction] …… [instruction] } ?如果一行有多個(gè)匯編指令,則指令之間用分號(hào)隔開; ?如果一條指令占多行,則要使用續(xù)行符號(hào) (\); ?在匯編指令段中可以使用 C語言的注釋語句。 (R2)=i*3 ADD R3, R1, R2 。 復(fù)制完畢,返回 END extern void strcopy(char *d,const char *s) //參數(shù)由左向右依次傳遞給 R0~
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1