[ARM][匯編] 01.基礎概念

目錄

1.全局標號

1.1.使用方法

1.1.1.聲明全局標號

1.1.2.定義全局標號

1.1.3.引用全局標號

1.2.全局標號與局部標號的區別

1.3.注意事項

2.局部標號

2.1.使用方法

2.1.1.定義局部標號

2.1.2.跳轉引用

2.2.局部標號與全局標號的對比

2.3.注意事項

3.符號定義偽指令

3.1.變量與數據定義

3.1.1.定義字節 - DCB

3.1.2.定義字 - DCW

3.1.3.定義雙字 - DCD

3.2.內存分配與對齊

3.2.1.預留內存空間 - SPACE

3.2.2.內存對齊 - ALIGN

3.2.3.設置起始地址 - ORG

3.3.符號重定義與別名

3.3.1.定義常量 - EQU

3.3.2.定義變量 - SET

3.3.3.宏定義 - MACRO、MEND

3.4.代碼段與數據段控制

3.4.1.定義段 - AREA

3.5.外部符號引用

3.5.1.聲明外部符號 - IMPORT

3.5.2.導出符號 -?EXPORT

3.6. 注意事項

4.程序控制偽指令

4.1.程序入口 - ENTRY

4.2.程序結束 - END

5.條件編譯偽指令


1.全局標號

ARM 匯編中,全局標號是可在整個程序范圍內被引用的標識符,代表了內存中的一個特定地址,能夠指向代碼中的某條指令,也可以指向數據段里的某個數據項,全局標號通過 .global 或 .globl 偽指令來聲明,其作用如下:

  • 跨文件引用:大型項目中,程序往往會被分割成多個源文件,全局標號能讓不同源文件之間相互引用特定的代碼或數據,從而實現模塊化編程。

  • 鏈接器識別:鏈接器在將多個目標文件鏈接成一個可執行文件時,會利用全局標號來確定不同模塊之間的跳轉地址和數據引用,保證程序的正確執行。

1.1.使用方法

1.1.1.聲明全局標號

使用 .global 或 .globl 偽指令將一個標號 <label> 聲明為全局標號,語法如下:

@ 方式一:
.global <label>@ 方式二:
.globl <label>

1.1.2.定義全局標號

全局標號聲明后,就可以在代碼中定義它,例如,以下代碼定義了一個名為 _start 的全局標號,它通常作為程序的入口點:

@ 聲明全局標號 _start全局標號
.global _start@ _start 定義
_start:MOV R0, #1MOV R7, #1SWI 0

1.1.3.引用全局標號

在其他文件或代碼段中,可直接引用已經聲明的全局標號,例如,在另一個文件中調用上述代碼中的 _start 標號:

.extern _start @ 引用全局標號 _startB _start   @ 跳轉至該全局標號處執行

其中 .extern 偽指令用于聲明外部全局標號,表示該標號在其他文件中定義

1.2.全局標號與局部標號的區別

  • 作用域:

    • 全局標號:作用域是整個程序,可以在任何文件或者代碼段中被引用。

    • 局部標號:作用域僅限于當前文件或代碼段,不能在其他文件中被引用。

  • 聲明方式:

    • 全局標號:需要使用 .global 或 .globl 偽指令進行聲明。

    • 局部標號:直接在代碼中定義,無需額外的聲明指令。

1.3.注意事項

  • 命名沖突:使用全局標號時,要確保標號名稱在整個程序中是唯一的,避免出現命名沖突,否則,鏈接器在鏈接過程中會報錯。

  • 標號類型:全局標號既可以指向代碼,也可以指向數據,在引用標號時,要明確其類型,確保正確使用。

  • 鏈接順序:在鏈接多個目標文件時,鏈接器會按照指定的順序處理這些文件,要保證引用全局標號的文件在鏈接時能夠找到定義該標號的文件。

2.局部標號

ARM 匯編中,局部標號是一種僅在特定范圍內有效的標號,與全局標號相對。局部標號僅能在當前文件或代碼段內被引用,它代表內存中的一個特定地址,可指向代碼中的某條指令,也可指向數據段里的某個數據項,局部標號有如下特點:

  • 作用域局限:局部標號的作用范圍僅限于定義它的文件或代碼段,在其他文件中無法引用,這使得局部標號具有較好的封裝性,能避免不同文件之間的標號命名沖突。

  • 使用靈活:局部標號通常用于標記代碼中的臨時位置,比如循環的起始和結束位置、條件分支的跳轉點等,方便代碼的編寫和維護。

  • 無需額外聲明:和全局標號不同,局部標號不需要使用 .global 或 .globl 偽指令聲明,直接在代碼中定義即可。

2.1.使用方法

2.1.1.定義局部標號

局部標號由標號名和一個 : 組成,以下代碼定義了一個名為 fun_1 的局部標號:

fun_1:MOV R0, #10CMP R0, #20BLE fun_1b  ; 跳轉到標號 1 處(向后跳轉)

在這個例子中,fun_1 就是一個局部標號,fun_1b 表示向后跳轉到標號 fun_1 處。

2.1.2.跳轉引用

局部標號主要用于跳轉指令,通過指定標號和跳轉方向(向前或向后)實現代碼的跳轉

跳轉方向通過 f(forward,向前)或 b(backward,向后)指定,例如:

    MOV R1, #0
fun_2:ADD R1, R1, #1CMP R1, #8BLT fun_2b  ; 若 R1 < 8,向后跳轉到標號 fun_2 處繼續執行

上面的代碼中,當 R1 中的值小于 8 時,向后跳轉至標號 fun_2 處繼續執行

    MOV R0, #15CMP R0, #8BGT fun_1f  ; 如果 R0 大于 8,向前跳轉到標號 fun_3 處繼續執行MOV R1, #20
fun_3:ADD R2, R0, R1MOV R7, #1SWI 0  ; 退出程序

上面的代碼中,當 R0 中的值大于 8 時,向前跳轉至標號 fun_3 處繼續執行

2.2.局部標號與全局標號的對比

  • 作用域:

    • 全局標號:作用域是整個程序,可以在任何文件或代碼段中被引用。

    • 局部標號:作用域僅限于當前文件或者代碼段,不能在其他文件中被引用。

  • 聲明方式:

    • 全局標號:需要使用 .global 或 .globl 偽指令進行聲明。

    • 局部標號:直接在代碼中定義,無需額外的聲明指令。

  • 使用場景:

    • 全局標號:常用于定義程序的入口點、公共函數、全局變量等,方便不同文件之間的調用和引用。

    • 局部標號:主要用于標記代碼中的臨時位置,如循環、分支等,方便代碼的控制和跳轉。

2.3.注意事項

  • 標號重復使用:由于局部標號的作用域僅限于當前文件或代碼段,同一個局部標號可以在不同的代碼段中重復使用,但在同一個代碼段中不能重復定義。

  • 跳轉方向:在使用局部標號進行跳轉時,要明確指定跳轉方向(f 或 b),否則可能會導致跳轉錯誤。

3.符號定義偽指令

在匯編中,如果要定義變量,則需要用到特定的符號定義偽指令,同時,匯編中也提供了一些偽指令用于修改變量的值或者實現類似 C 語言中宏定義 #define 的功能

3.1.變量與數據定義

3.1.1.定義字節 - DCB

  • 作用:在內存中定義一個或多個字節(8 位)數據,可用于存儲字符、數值或二進制數據:

label: DCB value1, value2, ...
  • 示例:

; 定義字符串(ASCII 碼)
message: DCB 'H', 'e', 'l', 'l', 'o', 0; 定義數值數組
data_array: DCB 10, 20, 30, 40, 50; 定義二進制數據
flags: DCB 0x01, 0x02, 0x04, 0x08

3.1.2.定義字 - DCW

  • 作用:定義 16 位數據(半字),常用于存儲短整數或 16 位常量:

label: DCW value1, value2, ...
  • 示例:

; 定義 16 位整數數組
short_nums: DCW 1000, 2000, 3000; 定義 16 位常量
max_value: DCW 0xFFFF

3.1.3.定義雙字 - DCD

  • 作用:定義 32 位數據(雙字),常用于存儲整數、地址或指針:

label: DCD value1, value2, ...
  • 示例:

; 定義 32 位整數數組
int_array: DCD 1, 2, 3, 4, 5; 定義地址常量
device_addr: DCD 0x40000000; 定義函數指針
func_ptr: DCD my_function  ; 指向 my_function 函數的地址

3.2.內存分配與對齊

3.2.1.預留內存空間 - SPACE

  • 作用:在內存中預留指定字節數的未初始化空間,常用于創建緩沖區:

label: SPACE size_in_bytes
  • 示例:

; 預留 100 字節的緩沖區
buffer: SPACE 100; 預留 4 字節空間(初始值未定義)
temp_var: SPACE 4

3.2.2.內存對齊 - ALIGN

  • 作用:強制后續代碼或數據按指定字節對齊(如 2、4、8 字節),優化內存訪問效率:

.ALIGN alignment  ; alignment 為 2 的冪(如 2、4、8)
  • 示例:

; 按 4 字節對齊(地址為 4 的倍數)
.ALIGN 4
my_table: DCD 1, 2, 3, 4  ; 確保起始地址是 4 的倍數

3.2.3.設置起始地址 - ORG

  • 作用:指定后續代碼或數據在內存中的起始地址,用于定位特定區域:

ORG 0x10000         ; 從地址 0x10000 開始放置數據
config_data:DCB 0x01, 0x02  ; 配置數據將位于 0x10000

3.3.符號重定義與別名

3.3.1.定義常量 - EQU

  • 作用:為常量或表達式定義符號名,類似 C 語言的 #define:

symbol EQU expression
  • 示例:

; 定義數值常量
MAX_SIZE EQU 100
TIMEOUT EQU 5000; 定義寄存器別名
GPIO_BASE EQU 0x40020000
LED_PIN EQU 5; 使用表達式
DELAY_VAL EQU MAX_SIZE * 2

3.3.2.定義變量 - SET

  • 作用:定義可修改的符號值,類似變量,但在匯編時確定具體值:

symbol SET expression
  • 示例:

count SET 0        ; 初始值為 0
count SET count+1  ; 遞增(匯編時計算)

3.3.3.宏定義 - MACRO、MEND

  • 作用:定義可復用的代碼片段,類似函數但在匯編時展開:

MACRO
$label macro_name $param1, $param2...              ; 宏體(使用 $param1 等參數)
MEND
  • 示例:

MACRO
$label DELAY $countMOV r0, #$count
delay_loop:SUBS r0, r0, #1BNE delay_loop
MEND; 使用宏
DELAY 100            ; 插入 100 次循環的延遲代碼

3.4.代碼段與數據段控制

3.4.1.定義段 - AREA

  • 作用:將代碼或數據分組到不同的內存區域(如 .text、.data、.bss):

AREA name, attributes
  • 示例:

; 代碼段(只讀、可執行)
AREA my_code, CODE, READONLY
ENTRY             ; 程序入口點
MOV r0, #1        ; 代碼指令; 數據段(已初始化數據)
AREA my_data, DATA, READWRITE
my_variable DCD 100  ; 初始值為 100; BSS 段(未初始化數據,僅占位)
AREA my_bss, NOINIT, READWRITE
buffer SPACE 1024  ; 預留 1024 字節未初始化空間

3.5.外部符號引用

3.5.1.聲明外部符號 - IMPORT

  • 作用:聲明當前文件中使用的、但定義在其他文件中的符號(如函數、變量):

IMPORT printf        ; 聲明 printf 函數在其他文件中定義...LDR r0, =messageBL printf        ; 調用外部函數

3.5.2.導出符號 -?EXPORT

  • 作用:聲明當前文件中定義的符號可被其他文件引用(類似 C 語言的 extern):

EXPORT my_function   ; 導出函數供其他文件使用
my_function:...

3.6. 注意事項

  1. 符號作用域:在 AREA 內定義的符號僅在該區域可見,跨區域需使用全局聲明(如 .global)。

  2. 對齊要求:某些架構(如 ARM)要求特定類型的訪問(如 32 位數據)必須按 4 字節對齊,否則會觸發異常。

  3. 匯編時計算:EQU 和 SET 的值在匯編時確定,無法在運行時修改。

4.程序控制偽指令

4.1.程序入口 - ENTRY

偽指令 ENTRY 標記程序的起始執行地址,通常位于 .text 段:

AREA MyCode, CODE, READONLY
ENTRY                  ; 程序從此處開始執行B main             ; 跳轉到主函數

4.2.程序結束 - END

程序結束偽指令 END 標記匯編程序結束,告訴匯編器停止處理后續代碼:

END

5.條件編譯偽指令

IF、ELSE、ENDIF 使程序可以根據條件選擇性地包含或排除代碼段,類似 C 語言的 #ifdef:

IF :DEF: DEBUG   ; 如果定義了 DEBUG 符號MOV r0, #1   ; 執行這段代碼
ELSEMOV r0, #0   ; 若程序中未定義 DEBUG 符號則執行這段代碼
ENDIF

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

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

相關文章

如何使用遠程桌面控制電腦

目的&#xff1a; 通過路由器使用pc控制臺式機&#xff0c;實現了有線/無線pc與臺式機的雙向遠程桌面控制 最核心就兩條&#xff1a;get ip地址與被控制機器的賬戶與密碼。 現象挺神奇&#xff1a;被控制電腦的電腦桌面處于休眠模式&#xff0c;此時強行喚醒被控電腦會導致中斷…

Hive表JOIN性能問

在處理100TB的Hive表JOIN性能問題時&#xff0c;需采用分層優化策略&#xff0c;結合數據分布特征、存儲格式和計算引擎特性。以下是系統性優化方案&#xff1a; 1. 數據傾斜優化&#xff08;Skew Join&#xff09; 1.1 識別傾斜鍵 方法&#xff1a;統計JOIN鍵的分布頻率&…

MongoDB 的核心概念(文檔、集合、數據庫、BSON)是什么?

MongoDB 是一個面向文檔的數據庫&#xff0c;它的核心概念與傳統的關系型數據庫&#xff08;RDBMS&#xff09;有所不同。以下是它的四個主要核心概念&#xff1a; 文檔 (Document) 定義&#xff1a; 文檔是 MongoDB 中的基本數據單元。它類似于關系型數據庫中的一行記錄&#…

AI智慧公園管理方案:用科技重塑市民的“夜游體驗”

AI智慧公園管理方案&#xff1a;多場景智能巡檢與安全防控 一、背景與痛點分析 夏季夜間&#xff0c;公園成為市民休閑娛樂的核心場所&#xff0c;但管理難度隨之激增&#xff1a; 寵物管理失控&#xff1a;未牽繩寵物進入園區&#xff0c;隨地排泄、驚擾游客&#xff0c;甚…

Spring Cloud Gateway 聚合 Swagger 文檔:一站式API管理解決方案

前言 在微服務架構中&#xff0c;隨著服務數量的增加&#xff0c;API文檔管理變得越來越復雜。每個微服務都有自己的Swagger文檔&#xff0c;開發人員需要記住每個服務的文檔地址&#xff0c;這無疑增加了開發難度。本文將介紹如何使用Spring Cloud Gateway聚合所有微服務的Sw…

尼康VR鏡頭防抖模式NORMAL和ACTIVE的區別(私人筆記)

1. NORMAL 模式&#xff08;常規模式&#xff09; 適用場景&#xff1a;一般手持拍攝&#xff0c;比如人像、靜物、風景或緩慢平移鏡頭&#xff08;如水平追拍&#xff09;等。工作特性&#xff1a; 補償手抖引起的小幅度震動&#xff08;比如手持時自然的不穩&#xff09;&am…

Babylon.js學習之路《四、Babylon.js 中的相機(Camera)與視角控制》

文章目錄 1. 引言&#xff1a;為什么相機是 3D 場景的“眼睛”&#xff1f;1.1 相機的核心作用1.2 常見相機類型概覽 2. 相機基礎參數解析2.1 通用屬性2.2 相機坐標系 3. 詳解常用相機類型3.1 自由相機&#xff08;FreeCamera&#xff09;3.2 弧形旋轉相機&#xff08;ArcRotat…

【Python】普通方法、類方法和靜態方法的區分

Python 中普通方法、類方法和靜態方法的區分 下面我將從多個維度對這三種方法進行詳細對比&#xff0c;并通過示例說明它們的使用場景和區別。 1. 核心區別總結 特性普通方法(實例方法)類方法(classmethod)靜態方法(staticmethod)定義裝飾器無classmethodstaticmethod第一個…

geoserver發布arcgis瓦片地圖服務(最新版本)

第一步&#xff1a;下載geoserver服務&#xff0c;進入bin目錄啟動 需要提前安裝好JDK環境&#xff0c;1.8及以上版本 安裝完成&#xff0c;頁面訪問端口&#xff0c;進入控制臺界面,默認用戶名密碼admin/geoserver 第二步&#xff1a;下載地圖 破解版全能電子地圖下載器&…

Linux服務之lvs集群與dr模式部署

目錄 一.lvs相關概述 1.lvs集群的工作模式 2.lvs調度算法 3.ipvsadm工具 二.DR模式部署 一.lvs相關概述 1.lvs集群的工作模式 lvs-nat&#xff1a;修改請求報文的目標IP,多目標IP的DNAT lvs-dr&#xff1a;操縱封裝新的MAC地址&#xff08;直接路由&#xff09;lvs-tu…

OFCMS代碼審計-freemaker注入sql注入xxexss文件上傳

環境搭建 下載地址&#xff1a;https://gitee.com/oufu/ofcms/repository/archive/V1.1.2?formatzip SSTI模板注入&#xff08;freemaker) FreeMarker模板注入實現遠程命令執行 - Eleven_Liu - 博客園 在admin中找到這個 發現請求的是這個 找到他 <#assign value"f…

一鍵部署NSFW檢測模型:快速識別并過濾敏感圖片內容

以下是對nsfw_detector的簡單介紹&#xff1a; nsfw_detector是一個 NSFW 內容檢測器&#xff0c;支持快速docker私有部署&#xff0c;提供API服務低資源消耗&#xff0c;2GB內存即可運行該模型&#xff0c;多核CPU自動調度加速推理 - 可以識別多種文件類型&#xff1a;圖片、…

【Redis】緩存穿透、緩存雪崩、緩存擊穿

1.緩存穿透 是指客戶端請求的數據在緩存中和數據庫中都不存在&#xff0c;這樣緩存永遠不會生效&#xff0c;導致請求直接穿透緩存到達數據庫&#xff0c;給數據庫帶來壓力的情況。 常見的解決方案有兩種&#xff1a; 緩存空對象&#xff1a;實現簡單&#xff0c;維護方便&am…

【C】初階數據結構15 -- 計數排序與穩定性分析

本文主要講解七大排序算法之外的另一種排序算法 -- 計數排序 目錄 1 計數排序 1&#xff09; 算法思想 2&#xff09; 代碼 3&#xff09; 時間復雜度與空間復雜度分析 &#xff08;1&#xff09; 時間復雜度 &#xff08;2&#xff09; 空間復雜度 4&#xff09; 計…

mysql的一個缺點

最近再移植一個從oracle轉mysql的項目&#xff0c;喜提一個報錯&#xff1a; You cant specify target table A016 for update in FROM clause 對應的程序代碼&#xff1a; public void setCurrent(String setId, String pk, String userId) throws SysException {String[]…

Ubuntu 上安裝 FTP 服務、開放指定端口并創建用戶

一、安裝 FTP 服務&#xff08;vsftpd&#xff09; sudo apt update sudo apt install vsftpd -y二、修改 vsftpd 配置&#xff0c;使用 21000 端口 編輯配置文件&#xff1a; sudo nano /etc/vsftpd.conf修改或添加以下配置&#xff1a; 使用以下配置文件需要修改的地方:l…

用自寫的jQuery庫+Ajax實現了省市聯動

1. 省市聯動&#xff1a;在網頁上&#xff0c;選擇對應的省份之后&#xff0c;動態的關聯出該省份對應的市。選擇對應的市之后&#xff0c;動態地關聯出城市對應的區。 2. 設計數據庫表 t_area &#xff08;區域表&#xff09; id(PK-自增) code name pcode ------------…

【行為型之迭代器模式】游戲開發實戰——Unity高效集合遍歷與場景管理的架構精髓

文章目錄 &#x1f504; 迭代器模式&#xff08;Iterator Pattern&#xff09;深度解析一、模式本質與核心價值二、經典UML結構三、Unity實戰代碼&#xff08;背包系統遍歷&#xff09;1. 定義迭代器與聚合接口2. 實現具體聚合類&#xff08;背包物品集合&#xff09;3. 實現具…

18前端項目----Vue項目收尾優化|重要知識

收尾/知識點匯總 項目收尾二級路由未登錄全局路由守衛路由獨享守衛圖片懶加載路由懶加載打包上線 重要知識點匯總組件通信方式1. props2. 自定義事件3. 全局事件總線4. 訂閱與發布pubsub5. Vuex6. 插槽 sync修飾符attrs和listeners屬性children和parent屬性mixin混入作用域插槽…

【Linux】基礎指令(Ⅱ)

目錄 1. mv指令 2. cat指令 3.echo指令 補&#xff1a;輸出重定向 4. more指令 5. less指令 6. head指令和tail指令 7.date指令 時間戳&#xff1a; 8. cal指令 9. alias指令 10.grep指令 1. mv指令 語法&#xff1a;mv [選項]... 源文件/目錄 目標文件/目錄 …