8、ARM 彙編程序格式和程序控制

8.1 彙編程序格式

  • 源程序中的語句能夠分爲兩種類型:指令性語句、指示性語句
  • 指示性語句就是一些僞操做,在 MDK 編譯環境下的僞操做有下面幾種:
    • 符號定義僞操做
    • 數據定義僞操做
    • 彙編控制僞操做
    • 其餘僞操做

8.1.1 符號定義僞操做

  • 符號定義僞操做用於定義 ARM 彙編程序中的 「變量」,此變量不會在內存上分配空間,只是用來輔助編譯器工做,幫助咱們用於循環控制、邏輯運算和條件判斷等等操做
    • 用於定義全局變量的 GBLA、GBLL 和 GBLS
    • 用於定義局部變量的 LCLA、LCLL 和 LCLS
    • 用於對變量賦值的 SETA、SETL、SETS
    • 爲一個通用寄存器列表定義別名:RLIST(List    RLIST {R0-R3})
    • 爲一個協處理器的寄存器定義名稱:CN  (Power    CN   6)
    • 爲一個協處理器定義名稱:CP
    • 爲一個雙精度的 VFP 寄存器定義名稱:DN
    • 爲一個單精度的 VFP 寄存器定義名稱:SN
    • 爲一個浮點寄存器定義名稱:FN
  • 注意:所有變量用於程序體中,而局部變量用於宏定義中,經常使用於循環控制,邏輯運算,條件判斷中,不會分配空間,這些變量是在編譯器的預處理階段進行的。

8.1.2 數據定義僞操做

  • 數據定義僞操做:用於爲特定的數據分配存儲單元, 同時可完成已配存儲單元的初始化
  • DCD DCW DCB:用於分配一片連續的字、半字、字節的存儲單元並用指定的數據初始化(初始化的全局數組)
  • SPACE:用於分配一片連續的存儲單元,並用 0 初始化(至關於 C 語言中的未初始化全局數組)
  • MAP:用於定義一個結構化的內存表首地址,與 FIELD 配合使用(至關於 C 語言中的結構體)
  • FIELD:用於定義一個結構化的內存表中的數據域
  • LTORG:用於聲明一個數據緩衝池(文字池) 的開始,若是沒有使用 LTORG 聲明文字池,則彙編器會在程序末尾自動聲明
1 Str DCB "This is Test!" Data DCD 1,2,3
2 DataSpace SPACE 10
3 MAP 0x40000000
4 A FIELD 4
5 B FIELD 4
6 符號描述: DCB(=) DCD(&) SPACE(%) MAP(^) FILED(#)

8.1.3 彙編控制僞操做

  • 彙編控制僞操做:用於控制彙編程序的執行流程,如: 條件彙編、 宏定義、 重複彙編控制等
  • IF 、 ELSE 、 ENDIF ([ | ])
  • WHILE 、 WEND
  • MACRO 、 MEND 、 MEXIT
1 CONFIG EQU 16 MACRO 2 IF {CONFIG}=16 MAX $data1,$data2 3 ADD R0,R0,R1 ...... 4 ELSE MEND 5 SUB R0,R0,R1 MAX 1,2
6 ENDIF

 

8.1.4 其餘僞操做

  • AREA--用於定義一個代碼段或數據段
  • ALIGN--經過添加填充字節的方式, 定義邊界對齊方式, 默認的狀況下, 代碼段和數據段是 4 字節對齊的
  • CODE1六、 CODE32--僞操做通知編譯器, 其後的指令序列經過 16 位的仍是 32 位來編譯
  • ENTRY --用於指定彙編程序的入口
  • END--用於通知編譯器已經到了源程序的結尾
  • EQU--用於爲程序中的數字常量、 標號等定義一個等效的字符名稱, 至關於 C 中的 define
  • EXPORT(或 GLOBAL ) --用於在程序中聲明一個全局的標號
  • IMPORT(EXTERN ) --用於通知編譯器要使用一個在其餘的源文件中定義的標號
  • GET (或 INCLUDE ) --用於將一個源文件包含到當前的源文件中
  • 例子:
  • AREA Buf,DATA,READWRITE ;符號 AREA 和 END 都不能頂格寫, 只有標號能夠並且必須頂格寫
  • 注意:
    • 僞操做不會產生機器指令, 它是輔助編譯器工做的, 在不一樣環境下僞代指令的描述是不同的(對比 GNU)符號能夠表明地址、 數值、 變量
    • 當符號表明地址時又稱爲標號,符號表明某個特定數值時又稱爲符號常量,符號表明變量時又稱爲變量名
    • 標號: 基於 PC, 基於寄存器(MAP R0), 絕對地址
    • 常量: 與 EQU 搭配使用
    • 變量: 變量名是一個符號地址, 系統會給每個變量名分配一個內存地址
    • 在 MDK 中的僞操做均可以經過 Help - uVision Help(ARM Development Tools) 查找

8.2 程序控制

  • 順序結構: 程序流程無分支, 無循環, 無轉移, 以直線方式一條指令接着一條指令順序執行
  • 選擇結構: 根據不一樣的條件, 分紅若干個分支路, 配合條件碼使用
  • 循環結構: 在順序和選擇控制中, 任一語句執行次數最多一次, 循環控制中能夠屢次。
  • 循環結構通常分紅四部分: 1, 初值 2, 循環體 3, 修改初值 4, 判斷條件
  • 在 MDK 中的僞操做均可以經過 Help - uVision Help(ARM Development Tools) 查找

  

相關文章
相關標籤/搜索