ARM彙編程序設計之:ARM彙編器所支持的偽操作

2021-01-15 電子產品世界

本文引用地址:http://www.eepw.com.cn/article/257006.htm

ARM源程序文件(即源文件)有特定的文件格式和語法規則,可以使用任意文本編輯器編寫程序代碼。一般地,ARM源程序文件名的後綴如表10.1所示。

表10.1 ARM源程序文件名後綴

程序

文件名

彙編

*.S

引入文件

*.INC

C程序

*.C

頭文件

*.H

在一個項目中,至少要有一個彙編源文件,可以有多個彙編源文件或多個C程序,或者C程序文件和彙編文件兩者的組合。

ARM彙編語言語句格式如下所示。

{label}{instruction/directive/pseudo-instruction}{;comment}

注意

所有指令均不能頂格寫,要用空格(space)或TAB開頭。

其中instruction即ARM指令集中的彙編指令。Directive為ARM彙編器所支持的偽操作。pseudo-instruction為ARM彙編器所支持的偽操作。下面章節分別介紹偽操作和偽指令。

10.1ARM彙編器所支持的偽操作

在ARM彙編語言程序裡,有一些特殊指令助記符,這些助記符與指令系統的助記符不同,沒有相對應的操作碼,通常稱這些特殊指令助記符為偽操作標識符(directive),它們所完成的操作稱為偽操作。偽操作在源程序中的作用是為完成彙編程序作各種準備工作的,這些偽操作僅在彙編過程中起作用,一旦彙編結束,偽操作的使命就完成。

在ARM的彙編程序中,偽操作主要有符號定義偽操作、數據定義偽操作、彙編控制偽操作、宏指令等。

10.1.1符號定義(SymbolDefinition)偽操作

符號定義偽操作用於定義ARM彙編程序中的變量、對變量賦值以及定義寄存器的別名等操作。常見的符號定義偽操作有如下幾種。

·用於定義全局變量的GBLA、GBLL和GBLS。

·用於定義局部變量的LCLA、LCLL和LCLS。

·用於對變量賦值的SETA、SETL、SETS。

·為通用寄存器列表定義名稱的RLIST。

·為協處理器寄存器定義別名的CN。

·為協處理器定義別名的CP。

·為VFP寄存器定義名稱的DN和SN。

·為FPA浮點指針寄存器定義名稱的FPA。

1.全局變量定義偽操作GBLA、GBLL和GBLS

(1)語法格式

GBLA、GBLL和GBLS偽操作用於定義一個ARM程序中的全局變量並將其初始化。其中:

GBLA偽操作用於定義一個全局的數字變量並初始化為0。

GBLL偽操作用於定義一個全局的邏輯變量並初始化為F(假)。

GBLS偽操作用於定義一個全局的字符串變量並初始化為空。

由於以上3條偽指令用於定義全局變量,因此在整個程序範圍內變量名必須惟一。

語法格式如下。

gblx>variable>

①gblx>

取值為GBLA、GBLL、GBLS之一。

②variable>

定義的全局變量名,在其作用範圍內必須惟一。全局變量的作用範圍為包含該變量的源程序。

(2)使用說明

如果用這些偽操作重新聲明已經聲明過的變量,變量的值將被初始化成後一次聲明語句中的值。

(3)示例

①使用偽操作聲明全局變量。

GBLATest1 ;定義一個全局的數字變量,變量名為Test1

Test1SETA0xaa ;將該變量賦值為0xaa

GBLLTest2 ;定義一個全局的邏輯變量,變量名為Test2

Test2SETL{TRUE} ;將該變量賦值為真

GBLSTest3 ;定義一個全局的字符串變量,變量名為Test3

Test3SETSTesting ;將該變量賦值為「Testing」

②聲明變量objectsize並設置其值為0xff,為「SPACE」操作做準備。

GBLAobjectsize

ObjectsizeSETAoxff

SPACEobjectsize

③下面的例子顯示如何使用彙編命令設置變量的值。具體做法是使用「-pd」選項。

Armasm-pdobjectsizeSETAoxff-oobjectfilesourcefile

相關焦點

  • ARM彙編程序設計之:彙編語言文件格式
    {symbol}{instruction|directive|pseudo-instruction}{;comment}①symbol程序符號。通常為地址標號(label)。在指令和偽指令中通常為標號;在一些偽操作中符號可能是變量或常數。詳見ARM偽操作一節。
  • ARM 彙編的mov操作立即數的疑問
    因為對arm彙編有些指令還不能理解,特別是一些相似功能指令間的區別。偶然在網上搜到「faq ARM assembly」,其中描述的幾個問題還是值得好好研究一下。2. 慢慢的發現自己也不再害怕英文的文檔了,耐心看至少也能懂個大概。
  • ARM彙編編程基礎之四-ARM彙編偽操作
    掌握了基本的ARM彙編指令後,要寫出簡單的ARM彙編程序,還必須要掌握基本的ARM彙編偽操作(directive)。現在我們來看一個簡單的彙編程序,該程序調用子程序完成了加法操作。第11、12行是子程序的代碼,完成了2個參數相加,並將結果放在r0後返回主程序。第6、8、10行的START、LOOP、ADD_SUB是標號,最經常用於跳轉指令B和BL,由於彙編語法要求的緣故,標號必須頂格寫(即:不能在行首有空格),否則編譯器會報錯。與之對應的是,彙編指令一定不能頂格寫。很明顯分號(;)在彙編程序中是注釋符號,相當於C語言的//號。
  • arm 微學術 架構_arm彙編 - CSDN
    3、學ARM彙編要學的內容    彙編指令    偽指令    偽操作 /** 代碼演示 - 最簡單的彙編程序 **/.text @代表接下來的內容放入代碼段.code 32 @代表接下來的內容翻譯成ARM指令集.global start @聲明全局start標號start:mov r0, #10 @
  • ARM指令學習筆記
    arm7TDMI(-S)指令系統有兩套指令集,分別是32位的Arm指令集和16位的thumb指令集。簡單點說:arm支持arm內核的所有特點,具有高效、快速的特點;而thumb指令集靈活、小巧。更加方便的是我們可以自由選擇變址前後指針的變化,例如塊拷貝尋址中就有四種:STMIA,STMIB,STMDA,STMDB.連遞減還是遞增,先變址還是先複製,Arm都給你預先設計好了,不能不說它周全,這些都是80x86裡沒有的,極大地方便了程式設計師的程序設計。順帶說一下其另一個便捷之處,加載/裝填數據時,可以在命令後加H/B來表示對半字/字節的數據操作,默認情況下是字。
  • ARM 一些特殊符號
    //表示程序進入死循環。.為location counter,可在源文件中指示當前地址。該符號可以被引用或賦值。 arm彙編程序中的符號 在arm彙編語言中,符號(symbols)可以代表地址(addresse)、變量(variables)和數字常量(numeric constants)。當符號代表地址時,又稱為標號(lable)。
  • ARM彙編程序基本知識
    1.彙編程序的基本組成本文引用地址:http://www.eepw.com.cn/article/201611/322725.htmARM彙編語言程序中,程序是以程序段為單位組織代碼的。段是相對獨立的指令或者代碼序列,擁有特定的名稱。
  • ARM彙編偽指令(1)
    ARM彙編程序由機器指令、偽指令和宏指令組成。本文引用地址:http://www.eepw.com.cn/article/201611/319390.htm1,符號定義偽指令符號定義偽指令用於定義ARM彙編程序的變量、對變量進行賦值、定義寄存器名稱。
  • ARM指令集和常用寄存器
    5)ARM雜項指令SWI immediately——24 軟中斷指令 處理器進入管理模式MRS Rd, psr 讀狀態寄存器指令MSR psr_fields, Rd/#immed_8r 寫狀態寄存器指令6)ARM偽指令ADR偽指令 小範圍的地址讀取偽指令,用於將PC相對偏移的地址值讀取到寄存器中。
  • ARM學習筆記--GPIO接口
    1、使用彙編代碼點亮一個LED先看源程序 led_on.S.text.global _start_start: LDR R0,=0x56000010 @ R0設為GPBCON寄存器 MOV R1,#0x00000400 @ 設置GPB5
  • 關於ARM彙編裡的特殊符號
    先前企圖全部靠自己寫一個bootloader,結果嘗試了下,花了4天時間查各種技術資料,寫了個startup.s文件出來,寫的過程中才發現,原來還有很多問題是我基本上不知道的,比如說如何進行ARM的位操作、如何將堆棧設置到RAM中、UART的波特率計算方法等問題。在邊寫邊查資料的過程中,我又發現了別人的一些程序我看不懂。。。
  • ARM 浮點運算詳解
    二:軟浮點技術:軟浮點支持是由交叉工具鏈提供的功能,與Linux內核無關。當使用軟浮點工具鏈編譯浮點操作時,編譯器會用內聯的浮點庫替換掉浮點操作,使得生成的機器碼完全不含浮點指令,但是又能夠完成正確的浮點操作。三:浮點協處理器:在較新版本的ARM中,可以添加協處理器。
  • ARM彙編特殊符號 彙編符號引用
    如果$後是數字變量(與串變量區分),在彙編時編譯器將該數字變量的數值轉換成十六進位的串,然後用該十六進位的串取代$後的數字變量。如果$後是邏輯變量,在彙編時編譯器將該邏輯變量替換成它的取值(T或者F)。如果程序中需要$,則用$$來表示,編譯器將不進行變量替換。
  • ARM微處理器的uC/OS的移植設計
    大部分的μC/OS-II代碼是使用ANSI C語言書寫的,因此μC/OS-II的可移植性好,然而仍需要使用C和彙編語言寫一些處理器相關代碼。μC/OS-II的移植需要滿足以下要求:(1)處理器的C編譯器可以產生可重入代碼;(2)可以使用C調用進入和退出臨界區代碼;(3)處理器必須支持硬體中斷,並且需要一個定時中斷源;(4)處理器需要能夠容納一定數據的硬體堆棧;(5)處理器需要有能夠在CPU寄存器與內核和堆棧交換數據的指令。
  • openocd 命令行燒寫ARM裸機程序
    以前是用RVDS 的IDE來燒寫調試ARM程序的,不過RVDS雖然是集成化的調試工具調試起來方便,但是有的時候只知其一,不知其二,只知道按部就班的來點擊按鈕,忽略了一些本質性的東西
  • arm開發板與樹莓派有什麼區別
    ARM   ARM是英國的一個公司,主要設計ARM系列的處理器。硬體開發者主要是設計、改良硬體和為新老硬體編寫驅動程序等等,軟體開發者主要是在現有的硬體下開發軟體(通常不包括驅動程序),使用者使用現有硬體和軟體而不進行開發。   我之前使用的 arm11 開發板,主要的目標用戶是硬體開發者和軟體開發者(可以不嚴謹地統稱為嵌入式開發者),幾乎沒有使用者,因為對於沒有開發經驗的人,用戶體驗是很差的。
  • ARM開發教程之ARM體系的嵌入式系統BSP的程序設計
    BSP( Board Support Package )板級支持包介於主板硬體和作業系統之間,其功能與PC機上的BIOS 相類似,主要完成硬體初始化並切換到相應的作業系統。BSP是相對於作業系統而言的,不同的作業系統對應於不同定義形式的BSP,例如VxWorks 的BSP和Linux 的BSP相對於某一CPU來說, 儘管實現的功能一樣, 可是寫法和接口定義是完全不同的。
  • net-snmp移植到arm
    關於net-snmp的移植,是基於靜態編譯的,動態的沒有做成功,在arm上的移植過程大致如下:如果沒有涉及到擴展agent,則藍色字體不需要理會。tar -xzvf net-snmp-5.4.1.tar.gz,若想擴展agent,則可以將此模塊的.c和.h文件先放到net-snmp-5.4.4/agent/mibgroup下一起配置編譯;例如我這裡想用代理讀寫encoder模塊,那麼先將寫好的encoder源文件複製到net-snmp-5.4.4/agent/mibgroup路徑下;2.CC=arm-linux-gcc
  • ARM處理器的程序與數據存儲(馮·諾依曼與哈佛結構)
    1、程序存儲 ARM處理器支持兩種指令,一種是ARM彙編指令,一種是Thumb彙編指令。ARM彙編指令是32位長,即每條ARM彙編指令都是由四個字節的存儲空間保存,所以ARM處理器在執行地址a的ARM彙編指令時,會從地址a + 4取下一條指令。
  • 第1天-ARM彙編指令LSL/LSR/ASL/ASR
    你還可以使用桶式移位器影響在 LDR/STR 操作中的變址值。譯註:移位操作在 ARM 指令集中不作為單獨的指令使用,它是指令格式中是一個欄位,在彙編語言中表示為指令中的選項。如果數據處理指令的第二個操作數或者單一數據傳送指令中的變址是寄存器,則可以對它進行各種移位操作。