指令格式
标签: 指令 @ 注释
- 标签
代表该指令在内存中的地址,由字符、数字、_ 和 $ 组成。- 指令
ARM 指令- 注释
以 @ 开始的字符串均为注释
例1:
.text @ 汇编指令,表示 text 段
start: @ 标签,start
mov r0, #5 @ 初始化 r0 为 5
mov r1, #4 @ 初始化 r1 为 4
add r2, r0, r1 @ r2 = r0 + r1
stop: b stop @ 无限循环
常见的ARM指令
- .byte
label: .(n)byte exp1, exp2, ...
分配1字节的地址空间,类似: .4byte 表达式 - .align
地址对齐 - .asciz
分配内存空间存储字符串,字符串包含在双引号内,在字符串尾部加入结束字符 ‘\0’
不同的 .ascii ,在字符串结尾不会自动加入结束字符。 - .equ
.equ name, expression
分配个符号 name, 其值为 expression
例2:
.text
b start
str: .asciz "Hello World"
.equ nul, 0
.align
start: ldr r0, =str @ r0 = &str
mov r1, #0
loop: ldrb r2, [r0], #1 @ r2 = *(r0++)
add r1, r1, #1 @ r1 += 1
cmp r2, #nul @ if (r1 != nul)
bne loop @ goto loop
sub r1, r1, #1 @ r1 -= 1
stop: b stop
编译程序
- 汇编程序
arm-linux-as -o 目标文件 源文件
- 链接程序
arm-linxu-ld -T链接脚本 -o 目标文件 源文件
查看各个标签分配的地址命令
arm-linux-nm 目标文件
- 转换为 binary 格式文件
ld 输出的文件为 ELF 格式的文件,不能在裸机上运行。所以必须转换为 binary 格式文件。命令arm-linux-objcopy能实现这种转换。
arm-linux-objcopy -O 输出文件格式(binary) 输入文件 输出文
链接脚本
SECTIONS {
. = 0x00000000
.text : {
abc.o (.text);
def.o (.text);
}
}
SECTIONS: 该命令指明代码段如何合并和分布
. (点) 代表当前位置
.text 指明各个文件中的.text 段的分布
C语言代码运行环境建立
- 设置栈
C语言使用栈存储局部变量,传递参数,存储返回地址等内容。 全局变量
已初始化的全局变量
已初始化的全局变量分配在 .data 段,运行时,将该段拷贝的RAM中
未初始化的全局变量
所有未初始化的全局变量自动初始化为零,分配在 .bss 段
只读数据
只读数据由 const 标记,分配在 .rodata 段,字符串也是分配在该段。