嵌入式之匯編程序示例

目錄

經典例子:求階乘

一:數組求和

二:數據壓棧退棧

三:函數嵌套調用??


經典例子:求階乘

?知識點:

  • BGT?用于判斷?r2 > r0,確保循環執行?恰好?r0?次
  • BNE?用于判斷?r2 ≠ r0,會導致循環多執行一次,得到錯誤結果。

這就是階乘代碼中必須使用?BGT?而非?BNE?的原因。

AREA Factorial, CODE, READONLYENTRYstartLDR sp, =0x40001000      ; 初始化棧指針MOV r0, #10              ; 設置輸入值為10MOV r1, #1               ; 結果初始化為1MOV r2, #1               ; 循環計數器初始化為1loopCMP r2, r0               ; 比較計數器與輸入值BGT end_loop             ; 如果計數器 > 輸入值,結束循環MUL r1, r1, r2           ; 累乘:result *= counterADD r2, r2, #1           ; 計數器加1B loop                   ; 繼續循環end_loopMOV r0, r1               ; 將結果存入r0
stopB stop                   ; 程序終止END

一:數組求和

例:編寫一個ARM匯編程序累加一個“數組”的所有元素,碰上0時停止。結果放入 r4。

    area test, code, readonly  ; 定義代碼段test,屬性為代碼段、只讀entry                  ; 程序入口標記
startldr r0,=array          ; 將array的絕對地址加載到r0(正確寫法應為ldr r0, =array)
loopldr r1,[r0],#4         ; 從r0地址讀取數據到r1,然后r0自增4字節(4字節=字長,適用于32位數據)cmp r1,#0              ; 比較r1是否為0addne r4,r4,r1         ; 若r1≠0,將r1累加到r4(注意:r4未初始化,默認值不確定)bne loop               ; 若r1≠0,跳轉回loop繼續遍歷
stopb stop                 ; 無限循環,程序在此處結束#DCD偽操作數據緩沖池技術#dcd機器碼
arraydcd 0x11               ; 定義數組元素,0x11(十進制17)dcd 0x22               ; 0x22(十進制34)dcd 0                  ; 0(數組結束標記)

二:數據壓棧退棧

例:先將棧地址設置為將要壓棧的數據存入寄存器r1-r5中,然后壓棧

AREA first, CODE, READONLYCODE32ENTRYstartLDR sp, =0x40001000      ; 初始化棧指針,指向0x40001000地址; 數據準備:設置寄存器初始值MOV r1, #0x11            ; r1 = 0x11MOV r2, #0x22            ; r2 = 0x22MOV r3, #0x33            ; r3 = 0x33MOV r5, #0x55            ; r5 = 0x55 (修正中文逗號為英文逗號); 壓棧操作:保存寄存器值到棧STMFD sp!, {r1-r3, r5}   ; 保存r1-r3和r5到棧,SP自動遞減; 數據清零:驗證后續恢復操作MOV r1, #0               ; 清零r1MOV r2, #0               ; 清零r2MOV r3, #0               ; 清零r3MOV r5, #0               ; 清零r5; 出棧操作:從棧恢復寄存器值LDMFD sp!, {r1-r3, r5}   ; 從棧恢復r1-r3和r5,SP自動遞增stopB stop                   ; 無限循環結束程序END

三:函數嵌套調用??

當有多級函數嵌套,函數返回值我們不可能都存儲在通用寄存器中,必須利用ldm將程序跳轉前的寄存器值以及函數的返回地址壓棧。

AREA test, CODE, READONLYENTRYstartLDR sp, =0x40002000      ; 初始化棧指針MOV r1, #0x11            ; 設置r1 = 0x11MOV r2, #0x22            ; 設置r2 = 0x22MOV r3, #0x33            ; 修正中文逗號為英文逗號MOV r5, #0x55            ; 修正中文逗號為英文逗號BL child_func            ; 調用子函數ADD r0, r1, r2           ; 計算r0 = r1 + r2
stopB stop                   ; 無限循環結束程序; 非葉子函數(調用其他函數的函數)
child_funcSTMFD sp!, {r1-r3, r5, lr} ; 保存寄存器和返回地址到棧MOV r1, #10                ; 修改r1的值BL child_funcl             ; 調用子子函數LDMFD sp!, {r1-r3, r5, lr} ; 恢復寄存器和返回地址MOV pc, lr                 ; 返回主函數; 葉子函數(不調用其他函數的函數)
child_funclSTMFD sp!, {r1-r3, r5}     ; 保存寄存器到棧MOV r1, #11                ; 修改r1的值LDMFD sp!, {r1-r3, r5}     ; 恢復寄存器MOV pc, lr                 ; 返回父函數END

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81093.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81093.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81093.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【MySQL】第九彈——索引(下)

文章目錄 🌏索引(上)回顧🌏使用索引🪐自動創建索引🪐手動創建索引🚀主鍵索引🚀普通索引🚀唯一索引🚀復合索引 🪐查看索引🪐刪除索引🚀刪除主鍵索引…

畢業論文格式(Word)

目錄 Word目錄怎么自動生成?快速生成試試這3個方法! - 知乎https://zhuanlan.zhihu.com/p/692056836目錄生成需要先設置標題樣式,這個不僅是目錄生成需要,和后續的圖表也有關系。 最好不要自己創建新的樣式,而是在現有…

PostGIS實現柵格數據轉二進制應用實踐【ST_AsBinary】

ST_AsBinary解析與應用實踐(同ST_AsWKB) 一、函數概述二、核心參數解析三、典型用法示例四、Out-DB 波段處理機制五、二進制格式與其他格式的轉換六、性能與存儲優化七、應用場景八、注意事項九、擴展應用:基于Python Web的柵格二進制數據的…

線性回歸原理推導與應用(七):邏輯回歸原理與公式推導

邏輯回歸是一種分類算法,常用于二分類,也就是得出的結果為是和不是,例如通過各種因素判斷一個人是否生病,信用卡是否違約等。邏輯回歸在社會和自然科學中應用非常廣泛, 前置知識 線性回歸 邏輯回歸的底層方法就是線…

Fastrace:Rust 中分布式追蹤的現代化方案

原文鏈接:Fastrace: A Modern Approach to Distributed Tracing in Rust | FastLabs / Blog 摘要 在微服務架構中,分布式追蹤對于理解應用程序的行為至關重要。雖然 tokio-rs/tracing 在 Rust 中被廣泛使用,但它存在一些顯著的挑戰&#xf…

水果系列數據集- 葡萄grapes>> DataBall

該數據集可以用于目標檢測,水果分類 ,文生圖相關項目。 以下是圖片樣例:

HTTP協議接口三種測試方法之-postman

HTTP協議作為現代Web開發的基石,其接口測試是開發過程中不可或缺的環節。Postman作為最流行的API測試工具之一,能夠極大提升我們的測試效率。本文將詳細介紹如何使用Postman進行HTTP接口測試。 一、HTTP協議基礎回顧 在開始使用Postman之前&#xff0c…

佰力博科技與您探討半導體電阻測試常用的一些方法

一、兩探針法? 兩探針法是一種較為基礎的測試方法。該方法將兩根探針與半導體樣品表面緊密接觸,通過電源在兩根探針之間施加電壓,同時使用電流表測量通過樣品的電流,再根據歐姆定律計算電阻。?這種方法的優點在于操作簡單、設備要求較低&a…

機器學習的一些基本概念

看了b站一個清華博士的視頻做的筆記,對于人工智能的底層原理,訓練方式,以及生成式文本輸出,圖片生成的底層原理有了一個了解,算是一個還不錯的科普文。之前一直想要了解一下機器學習的入門原理,神經網絡相關…

Python爬蟲實戰:研究Grab 框架相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網的快速發展,網絡上的數據量呈爆炸式增長。如何高效地獲取和利用這些數據成為了當前的研究熱點。網絡爬蟲作為一種自動獲取網頁內容的技術,能夠按照一定的規則,自動地抓取萬維網信息,在搜索引擎、數據挖掘、信息整合等領域有著廣泛的…

uniapp 嵌入鴻蒙原生組件 具體步驟

關于怎么使用uniapp 嵌入鴻蒙原生組件 HBuilder X 版本 4.64 app-harmony文件下新建 index.uts button.ets button.ets里面復制uniapp 官方提供的 示例代碼 https://uniapp.dcloud.net.cn/tutorial/harmony/native-component.html button.ets import { NativeEmbedBuilderO…

阿里云 OS Copilot 使用指南

安裝: AlibabaCloudLinux: sudo yum install -y os-copilotUbuntu: curl -#S https://mirrors.aliyun.com/os-copilot/os-copilot-all-in-one-latest.sh | bash添加RAM用戶 打開 https://ram.console.aliyun.com/users 復制AccessKey,Ac…

枚舉類擴充處理

問題背景 由于 Java 不允許枚舉繼承另一個枚舉(enum cannot extend enum),但可以通過 組合方式 或 工具類 來實現類似功能。 ? 解決方案一:組合方式引入原始枚舉值 示例代碼: public enum CustomErrorCodeEnum imp…

Spring Security探索與應用

Spring Security核心概念 框架定位與核心能力 Spring Security是Spring生態中實現應用級安全的核心框架,其官方定義為"強大且高度可定制的認證與訪問控制框架"。作為Spring應用程序安全防護的事實標準解決方案,它通過模塊化設計提供以下核心能力: 認證(Authenti…

藍橋杯國14 不完整的算式

!!!!!!!!!!!!!!!理清思路 然后一步步寫 問題描述 小藍在黑板上寫了一個形如 AopBC 的算式&#x…

掃描電鏡:打開微觀世界的“超維相機“

當你用手機拍攝一朵花的微距照片時,放大100倍已足夠驚艷。但如果告訴你,科學家手中的"相機"能將物體放大百萬倍,連病毒表面的蛋白突觸都清晰可見,你是否會好奇這背后的黑科技?這把打開微觀宇宙的鑰匙&#x…

JVM學習(四)--對象內存布局

目錄 一、對象內存布局 1、對象的實例化 1.1、你有幾種方式創建對象? 1.2、創建對象的步驟 1.2.1、從字節碼角度看待對象創建過程 1.2.2、從執行步驟角度分析 2、對象的內存布局 2.1、對象頭 2.2、實例數據 2.3、對齊填充 3、對象的訪問定位 3.1、句柄訪…

SQL每日一題(4)

前言:第四更 雖然已經全部做完了,這套卷子非常推薦! 根據題目還原出來的原始表 employees表 idnameagestatus1張三28在崗2李四35在崗3王五42在崗4趙六NULL在崗5錢七58在崗6孫八24在崗7周九31離職8吳十-5在崗9鄭十一45在崗10王十二52在崗 題…

如何做好一份技術文檔?

文章目錄 前言一、技術文檔的核心原則二、技術文檔的類型與場景三、技術文檔的寫作流程3.1 需求分析階段(文檔生產的基礎)3.2 架構設計階段(文檔的骨架搭建)3.3 內容開發階段(血肉填充)3.4 質量保障階段&am…

怎么判斷一個Android APP使用了KMM這個跨端框架

要判斷一個 Android 應用是否使用了 KMM(Kotlin Multiplatform Mobile) 框架,可以通過以下方法逐步驗證: 一、安裝包結構分析 解壓 APK 將 .apk 文件重命名為 .zip 并解壓,檢查以下特征: ? kotlin/ 目錄&a…