ARM彙編偽指令

来源:http://www.cnblogs.com/xiaojiang1025/archive/2016/11/14/6063516.html
-Advertisement-
Play Games

GNU平臺無關 符號定義偽指令 ,`.local .set .equ` .global 使得符號對連接器可見,變為對整個工程可用的全局變數 .local 表示符號對外部不可見,只對本文件可見 .set 給一個全局變數或局部變數賦值,和 的功能一樣 .equ 和 一樣,只是格式不同 數據定義偽指令 , ...


GNU平臺無關

符號定義偽指令

.global,.local,.set,.equ

.global

使得符號對連接器可見,變為對整個工程可用的全局變數

.global symbol

.local

表示符號對外部不可見,只對本文件可見

.local symbol

.set

給一個全局變數或局部變數賦值,和.equ的功能一樣

.set symbol expr
.set start, 0x40
.set start, 0x50
mov r1, #start      ;r1裡面是0x50

.equ

.set一樣,只是格式不同

symbol .equ  expr
start  .equ, 0x40
start  .equ, 0x50
mov r1, #start      ;r1裡面是0x50

數據定義偽指令

.byte,.short,.long,.quad,.float,.string,.asciz,.ascii,.rept

.byte

在存儲器中分配1個位元組,用指定的數據對存儲單元進行初始化

label:  .byte   expr    ;label是程式標號,expr可以是-128~255的數字,也可是字元
a:  .byte   #1  ;等價於C中的char a=1;

.short

在存儲器中分配2個位元組,用指定的數據對存儲單元進行初始化

a: .short 0x1234

.word / .long

在存儲器中分配4個位元組,用指定的數據對存儲單元進行初始化

a: .word 0x12345678

.long

在存儲器中分配個位元組,用指定的數據對存儲單元進行初始化

.quad

在存儲器中分配8個位元組,用指定的數據對存儲單元進行初始化

a: .quad 0x12345678 ;等價於C中的long a=0x1234567812345678

.float

在存儲器中分配4個位元組,用指定的浮點數據對存儲單元進行初始化

a: .float 1.11

.space/.skip

用於分配一塊連續的存儲區域並初始化為指定的值,如果後面的填充值省略不寫則在後面填充為0;

label: .space size,expr     ;expr可以是4位元組以內的浮點數 
a:  space 8, 0x1

.string

定義一個字元串,預設是string8,還有string16,string32,string64

a: .space "hello world!"

.rept

重覆執行接下來的指令,以.rept開始,以.endr結束

.rept cnt   ;cnt是重覆次數
...
.endr

彙編控制偽操作

流程式控制制偽指令主要yy.if .else .endif .macro .endm .exitm

.if .else .endif

.if logical-expression
...
.elseif logical-expression2
...
.else
...
.endif

.macro .endm .exitm

該偽指令可以將一段代碼定義為一個整體,稱為巨集指令,然後就可以在程式中通過巨集指令多次調用該段代碼,而.exitm指令用來退出當前的巨集指令,巨集指令可以使用一個或多個參數,當巨集操作被展開時,這些參數被相應的值替換。
包含在.macro。endm之間的指令序列稱為巨集定義體。在巨集定義體的第一行應聲明巨集的原型,包含巨集名所需的參數,然後就可以在彙編程式中通過巨集名來調用該指令序列,在源程式被編譯時,彙編器將巨集調用展開,用巨集定義中的指令序列代替程式中的巨集調用,並將實際參數的值傳遞給巨集定義中的形式參數

.macro macroname macargs ...
;code
.endm

雜項

.align      用於使程式當前位置滿足一定的對齊方式
.section    用來定義一個段的偽指令
.data       用來定義一個數據段
.text       用來定義一個代碼段
.include    用來包含一個頭文件   
.arm        定義以下代碼使用arm指令集編譯
.code 32    同.arm
.code 16    同.thumb
.thumb      定義以下代碼使用thumb指令集編譯
.extern     用於聲明一個外部符號,用於相容性其他彙編
.weak       用於聲明一個弱符號,如果這個符號沒有定義,編譯就忽略,而不會報錯
.end        表示彙編結束

GNU平臺相關

ADR

把標簽所在的地址載入到寄存器中,這個指令將基於PC相對偏移的地址值或基於寄存器相對偏移的地址值讀取到寄存器中。當地址值是位元組對齊的時候,取值範圍是-255~255B;當地址值是字對齊的時候,取值範圍為-1020~1020B。當地址值是16位元組對齊時,取值範圍更大。 該指令等價於add <reg>, pc , offset

ADR <reg> <label>

ADRL

用於將中等範圍地址讀取到寄存器中

ADRL <reg> <label>

LDR

裝載一個32位的常數和一個地址寄存器

LDR reg, =expr

reg:目標寄存器
expr:32位常量表達式。彙編器根據expr的取值情況,對LDR偽指令做如下處理:

  1. 當expr表示的指令地址值沒有超過MOV指令或MVN指令的地址取值範圍時,彙編器用一對MOV和MVN代替LDR指令
  2. 當超過了的時候,彙編器將常數放入緩存吃,同時用一條基於PC的LDR讀取該常數
LDR R3,=0xff0
;將常熟0xff0讀到記憶體中相當於MOV R3, #0xff0

LDR R1,=0xfff   
;將常數0xfff讀到記憶體,
;相當於LDR R1,[pc, offset_to_litpool]  ... litpool DCD 0xfff

LDR R2, =place  
;將place標號的地址讀入到R1中
;相當於LDR R1,[pc, offset_to_litpool]  ... litpool DCD place

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1,定義新的屬性來擴展對象 新方法:defineProperty() 實例: var data = {}; Object.defineProperty(data,"type",{ value: "primary", //設置初始值,不能改變,刪除, enumerable: true //可枚舉 }) ...
  • 1.用AudioManager調聲音 1_得到當前音量和最大音量 2_拖動的時候改變音量 3_靜音和非靜音 2.手指在屏幕上下滑動實現聲音大小變化 3.監聽按手機聲音健改變聲音大小 ...
  • 開發完成的APP,我們當然要上傳到AppStore裡面了,這可是我們心血的結晶。 可是,就當我們興奮之餘,卻發現我們的App根本無法上傳到AppStore。我們百度、谷歌了N種方法,就像我這種逗逼,整整試了不下15次,還是不行。可是,一個偶然的操作,居然成功了,然後又連試幾發,真是百試不爽,趕緊拿出 ...
  • 一、修改字體 點擊左上角File選擇settings....進入界面選擇Editor-->Colors&Fonts-->Font點擊界面中Save As...在對話框中輸入名字點擊OK,選擇Soure Code Pro楷體設置字體大小我的設置17,和上下間隔我的設置1.1點擊右下角OK。 二、刪除項 ...
  • Hadoop概述 Apache lucene: 全球第一個開源的全文檢索引擎工具包 完整的查詢引擎和搜索引擎 部分文本分析引擎 開發人員在此基礎建立完整的全文檢索引擎 以下為轉載:http://www.cnblogs.com/xing901022/p/3933675.htm 首先呢,學習任何一門新的 ...
  • 語法: mount -t 類型 -o 掛接方式 源路徑 目標路徑 -t 詳細選項: 光碟或光碟鏡像:iso9660 DOS fat16文件系統:msdos Windows 9x fat32文件系統:vfat Windows NT ntfs文件系統:ntfs Mount Windows文件網路共用:s ...
  • crontab是一個用來設置、刪除或顯示供守護進程cron執行的定時任務的命令。每一個用戶都可以擁有屬於自己的定時任務,定時任務文件預設以用戶名命名,並放在/var/spool/cron目錄,該目錄普通用戶無訪問許可權。 可以通過cron.allow 和 cron.deny文件管理用戶使用cronta ...
  • ARM彙編程式結構 一個ARM程式可以被劃分為多個代碼段和數據段,在彙編的時候這些段會被形成一個可執行文件 子程式調用 ARM彙編中,子程式的調用一般通過 指令實現,在程式中,執行 即可完成子程式的調用。該指令在執行時完成如下操作: 1. 將子程式的返回地址保存在LR 2. 將PC指向子程式的入口 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...