GNU风格 ARM汇编语法5
生活随笔
收集整理的這篇文章主要介紹了
GNU风格 ARM汇编语法5
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
、 GNU匯編程序中的常數
<>十進制數以非0數字開頭,如:123和9876;
<>二進制數以0b開頭,其中字母也可以為大寫;
<>八進制數以0開始,如:,;
<>十六進制數以0x開頭,如:0xabcd,0X123f;
<>字符串常量需要用引號括起來,中間也可以使用轉義字符,如: “You are welcome!\n”;
<>當前地址以“.”表示,在GNU匯編程序中可以使用這個符號代表當前指令的地址;
<>表達式:在匯編程序中的表達式可以使用常數或者數值, “-”表示取負數, “~”表示取補,“<>”表示不相等,
其他的符號如:+、-、*、 /、%、<、<<、>、>>、|、&、^、!、==、>=、<=、&&、|| 跟C語言中的用法相似。 、GNU ARM匯編的常用偽操作
在前面已經提到過了一些為操作,還有下面一些為操作:
>數據定義偽操作: .byte,.short,.long,.quad,.float,.string/.asciz/.ascii,重復定義偽操作.rept,賦值語句.equ/.set ;
>函數的定義;
>對齊方式偽操作 .align;
>源文件結束偽操作.end;
>.include偽操作;
>if偽操作;
>.global/ .globl 偽操作 ;
>.type偽操作 ;
>列表控制語句 ; 別于GNU AS匯編的通用偽操作,下面是ARM特有的偽操作:
.reg ,.unreq ,.code ,.thumb ,.thumb_func ,.thumb_set, .ltorg ,.pool <1>數據定義偽操作
>.byte:單字節定義,如:.byte ,,0b01,0x34,,'s' ;
>.short:定義雙字節數據,如:.short 0x1234, ;
>.long:定義4字節數據,如:.long 0x12345678,
>.quad:定義8字節,如:.quad 0x1234567890abcd
>.float:定義浮點數,如:.float 0f-31415926535897932384626433832795028841971.693993751E-40 @ - pi
>.string/.asciz/.ascii:定義多個字符串,如:
.string "abcd", "efgh", "hello!"
>.asciz "qwer", "sun", "world!"
.ascii "welcome\0"
注意:ascii偽操作定義的字符串需要自行添加結尾字符'\0'。
>.rept:重復定義偽操作, 格式如下:
.rept 重復次數
數據定義
.endr @結束重復定義 例:
.rept
.byte 0x23
.endr >.equ/.set: 賦值語句, 格式如下:
.equ(.set) 變量名,表達式
例:
.equ abc, @讓abc= <2>函數的定義偽操作
>函數的定義,格式如下:
函數名:
函數體
返回語句
一般的,函數如果需要在其他文件中調用, 需要用到.global偽操作將函數聲明為全局函數。
為了不至于在其他程序在調用某個C函數時發生混亂,對寄存器的使用我們需要遵循APCS準則。
函數編譯器將處理函數代碼為一段.global的匯編碼。
>函數的編寫應當遵循如下規則:
a.a1-a4寄存器(參數、結果或暫存寄存器,r0到r3 的同義字)以及浮點寄存器f0-f3(如果存在浮點協處理器)在函數中是不必保存的;
b.如果函數返回一個不大于一個字大小的值,則在函數結束時應該把這個值送到 r0 中;
c.如果函數返回一個浮點數,則在函數結束時把它放入浮點寄存器f0中;
d.如果函數的過程改動了sp(堆棧指針,r13)、fp(框架指針,r11)、sl(堆棧限制,r10)、lr(連接寄存器,r14)、v1-v8(變量寄存器,r4 到 r11)
和 f4-f7,那么函數結束時這些寄存器應當被恢復為包含在進入函數時它所持有的值。 <3>.align .end .include .incbin偽操作
>.align:用來指定數據的對齊方式,格式如下:
.align [absexpr1, absexpr2]
以某種對齊方式,在未使用的存儲區域填充值. 第一個值表示對齊方式,, ,16或 . 第二個表達式值表示填充的值。
>.end:表明源文件的結束。
>.include:可以將指定的文件在使用.include 的地方展開,一般是頭文件,例如:
.include “myarmasm.h”
>.incbin偽操作可以將原封不動的一個二進制文件編譯到當前文件中,使用方法如下:
.incbin "file"[,skip[,count]]
skip表明是從文件開始跳過skip個字節開始讀取文件,count是讀取的字數. <4> .if偽操作
根據一個表達式的值來決定是否要編譯下面的代碼, 用.endif偽操作來表示條件判斷的結束, 中間可以使用.else來決定.if的條件不滿足的情況下應該編譯哪一部分代碼。
.if有多個變種:
.ifdef symbol @判斷symbol是否定義
.ifc string1,string2 @字符串string1和string2是否相等,字符串可以用單引號括起來
.ifeq expression @判斷expression的值是否為0
.ifeqs string1,string2 @判斷string1和string2是否相等,字符 串必須用雙引號括起來
.ifge expression @判斷expression的值是否大于等于0
.ifgt absolute expression @判斷expression的值是否大于0
.ifle expression @判斷expression的值是否小于等于0
.iflt absolute expression @判斷expression的值是否小于0
.ifnc string1,string2 @判斷string1和string2是否不相等, 其用法跟.ifc恰好相反。
.ifndef symbol, .ifnotdef symbol @判斷是否沒有定義symbol, 跟.ifdef恰好相反
.ifne expression @如果expression的值不是0, 那么編譯器將編譯下面的代碼
.ifnes string1,string2 @如果字符串string1和string2不相 等, 那么編譯器將編譯下面的代碼. <5>.global .type .title .list
>.global/ .globl :用來定義一個全局的符號,格式如下:
.global symbol 或者 .globl symbol
>.type:用來指定一個符號的類型是函數類型或者是對象類型, 對象類型一般是數據, 格式如下:
.type 符號, 類型描述
例:
.globl a
.data
.align
.type a, @object
.size a,
a:
.long 例:
.section .text
.type asmfunc, @function
.globl asmfunc
asmfunc:
mov pc, lr <6>列表控制語句:
.title:用來指定匯編列表的標題,例如:
.title “my program”
.list:用來輸出列表文件. <7>ARM特有的偽操作
>.reg: 用來給寄存器賦予別名,格式如下:
別名 .req 寄存器名
>.unreq: 用來取消一個寄存器的別名,格式如下:
.unreq 寄存器別名
注意被取消的別名必須事先定義過,否則編譯器就會報錯,這個偽操作也可以用來取消系統預制的別名, 例如r0, 但如果沒有必要的話不推薦那樣做。
>.code偽操作用來選擇ARM或者Thumb指令集,格式如下:
.code 表達式
如果表達式的值為16則表明下面的指令為Thumb指令,如果表達式的值為32則表明下面的指令為ARM指令.
>.thumb偽操作等同于.code , 表明使用Thumb指令, 類似的.arm等同于.code
>.force_thumb偽操作用來強制目標處理器選擇thumb的指令集而不管處理器是否支持
>.thumb_func偽操作用來指明一個函數是thumb指令集的函數
>.thumb_set偽操作的作用類似于.set, 可以用來給一個標志起一個別名, 比.set功能增加的一點是可以把一個標志標記為thumb函數的入口, 這點功能等同于.thumb_func
>.ltorg用于聲明一個數據緩沖池(literal pool)的開始,它可以分配很大的空間。
>.pool的作用等同.ltorg
>.space <number_of_bytes> {,<fill_byte>}
分配number_of_bytes字節的數據空間,并填充其值為fill_byte,若未指定該值,缺省填充0。(與armasm中的SPACE功能相同)
>.word <word1> {,<word2>} …
插入一個32-bit的數據隊列。(與armasm中的DCD功能相同)??梢允褂?word把標識符作為常量使用。
例:
Start:
valueOfStart:
.word Start
這樣程序的開頭Start便被存入了內存變量valueOfStart中。
>.hword <short1> {,<short2>} …
插入一個16-bit的數據隊列。(與armasm中的DCW相同) 、 GNU ARM匯編特殊字符和語法
<>代碼行中的注釋符號: ‘@’
<>整行注釋符號: ‘#’
<>語句分離符號: ‘;’
<>立即數前綴: ‘#’ 或 ‘$’
總結
以上是生活随笔為你收集整理的GNU风格 ARM汇编语法5的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js中使用对象变量的两种方式
- 下一篇: iOS - 实现语言本地化/国际化