您的位置:首页 > 其它

ARM的ADS汇编器与GCC汇编器

2012-07-25 17:42 204 查看
ARM的ADS汇编器与GCC汇编器
2009-10-14 10:06

汇编器与指令集,不同的CPU对应不同的指令集;不同的汇编器对应不同的语法和伪指令集。

每种汇编器都可以有自己的伪指令集和自己的语法,但实际上,由于事实标准的原因,(所有的CPU厂商会提供指令使用手册,手册中的指令书写样式,实际上就是事实汇编语法,何况CPU厂商肯定会提供自己的汇编器的),现代大多数的汇编器都会在主流的汇编语法Intel型和AT&T型这两类语法中选择一种作为自己的语法(Intel型可能会越来越流行)。
ARM官方提供的汇编器/指令手册中使用的是Intel型语法,GNU的汇编器gas使用的是AT&T型语法。
然而,gas for arm版的开发者,为了避免混乱,实现了完全和ARM官方汇编语法是一致的语法。也就是说,当你使用ARM指令集的指令时,按ARM官方手册的语法书写,用gas for arm编译完全没有问题。主要要注意的是伪指令集。

ARM的ADS汇编器与GCC汇编器

一:ads下的一段汇编程序:
__main

EXPORT BootReset

BootReset

B resetvec_reqset

IMPORT BootEntry

IMPORT |Image$$RO$$Limit|

AREA BOOTROM,
CODE, READONLY

LDR r0,
=|Image$$RO$$Limit|

BEQ %1

ldr pc,
[pc,#-&F20]
转换到gcc下的汇编程序为:
__main

.global BootReset

BootReset:

B resetvec_reqset

.extern BootEntry

.extern Image_RO_Limit

# AREA BOOTROM,
CODE, READONLY

LDR r0,
=Image_RO_Limit

BEQ FUNC1

ldr pc,
[pc,#-0xF20]

二:将ARM SDT下的汇编码移植到GCC for ARM编译器时,经常要做如下修改:

1、注释行以“@”或""代替“;”

2、伪操作符替换:

INCLUDE 替换成 .INCLUDE

TCLK2 EQU PB25 替换成 .equ TCLK2, PB25

EXPORT 替换成 .global

IMPORT 替换成 .extern

DCD 替换成 .long

IF :DEF: 替换成 .IFDEF

ELSE 替换成 .ELSE

ENDIF 替换成 .ENDIF

:OR: 替换成 |

:SHL: 替换成 <<

END 替换成 .end

符号定义后加":"号

AREA Word, CODE, READONLY --> .text

AREA Block, DATA, READWRITE --> .data

CODE32 --> .arm

CODE16 --> .thumb

LTORG --> .ltorg

3、操作数及运算符号替换

ldr pc, [pc, #&18] 替换成 ldr pc, [pc, #+0x18]

“&”以“+0x”号替换

三:ARM GCC汇编中常量编译控制

编译定义符
说 明
语 法
例 子
.byte

字节定义 expr(8bit数值)

.byte expr {, …}

.byte 25, 0x11, 031, 'A

.hword

半字定义expr (16bit数值)

.hword expr {, …}

.hword 2, 0xFFE0

.short

作用同.hword

.short expr {, …}

.short 257

.word

字长定义expr (32bit数值)

.word expr {, …}

.word 144511, 0x11223

.int

作用同.word

.int expr {, …}

.int 21

.long

作用同.word

.long expr {, …}

.long 1923, 0b10010101

.ascii

定义字符串expr(非零结束符)

.ascii expr {, …}

.ascii "Ascii text is here"

.asciz

定义字符串expr(以0为结束符)

.asciz expr {, …}

.asciz "Zero Terminated Text"

.string

作用同 .asciz

.string expr {, …}

.string "My Cool String\n"

.quad

定义一个大的数expr (向上分成8bit的数存放)

.quad expr {, …}

.quad 0xDAFADAFA911

.octa

定义一个大的数expr(向上分成16bit的数存放)

.octa expr {, …}

.octa 0xFEDCBA987654321

.float

定义一个32bit IEEE 浮点数expr

.float expr {, …}

.float 0f3.14, 0f359.2e11

.single

作用同.float

.single expr {, …}

.single 0f12341243.14E2

.double

定义64bit IEEE浮点数expr(浮点数)

.double expr {, …}

.double 0f2E1

.fill

用size长度value填充repeat次。size缺省为1, value缺省为 0.

.fill repeat {, size}

{, value}

.fill 32, 4, 0xFFFFFFFF

http://hi.baidu.com/%B6%FB%B6%AB%BC%AA/blog/item/dd4be70867c05fdb62d98614.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: