一: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 forARM编译器时,经常要做如下修改:
1、注释行以“@”或""代替“;”
2、伪操作符替换:
INCLUDE 替换成 .INCLUDE
TCLK2 EQU PB25 替换成 .equ TCLK2, PB25
EXPORT 替换成 .global
IMPORT 替换成 .extern
DCD 替换成 .long
IF EF: 替换成 .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
|
|