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