本帖最后由 nettui 于 2015-1-8 15:10 编辑
学习ARM已经两三年了,但是对于汇编这一块时钟感觉有些地方难以掌握,尤其是涉及到伪指令和协处理器指令,更是无从下手,今天决定抽时间来总结一下。
首先回忆下ARM汇编的相关基本知识,汇编语言在ARM中一般用在启动代码中,比如Bootloader 初始化时对 CPU 和 协处理器 等进行初始化, 此时没有建立起 C 语言运行环境, 这个时候使用汇编语言执行初始化操作;除此之外,汇编效率比较高, 在Linux 内核中对效率有特殊要求的地方也会使用汇编语言来编写。 汇编语言可以分为ARM标准汇编语言和GNU汇编语言两种,他们使用的地方是不同的,一般来说ARM标准汇编语言适用于ARM公司的汇编器, 适合在 Windows 平台使用, 如ADS;而GNU汇编语言适用于 Linux 平台交叉编译工具链的汇编器。 ARM汇编语言有个固定的模板:
- .section .data
- < 初始化的数据>
- .section .bss
- < 未初始化的数据>
- .section .text
- .global _start
- _start:
复制代码
程序入口 : "_start:" 是汇编程序的入口, 相当于 main();
标注入口 : 使用 ".global _start" 标注程序入口, 外部才可以识别这是程序入口; 标明代码段 : ".section .text" 标明这是一个代码段; 标明 bss 段 : 使用 ".section .bss" 标明bss段, 如果没有 bss 段 和 数据段, 直接从 .text 开始; 下面我们来搭建汇编开发调试环境
程序代码 : 定义代码段 : .text ; 定义程序入口 : .globl _start; 代码示例 :
- .text
- .globl _start
- _start:
- mov r1,#1
- mov r2,#2
- mov r3,#3
复制代码
Makefile 代码 : 链接 elf 格式文件 : 设置程序起始位置 6410板子是 0x50008000 地址; 在 arm-linux-ld 指定程序起始地址 : 在 -Ttext 50008000 即可; 如果使用链接器脚本指定地址 : 注意第三行指定程序起始地址; - SECTIONS
- {
- . = 0x50008000;
- . = ALIGN(4);
- .text :
- {
- led.o (.text)
- *(.text)
- }
- . = ALIGN(4);
- .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
- . = ALIGN(4);
- .data : { *(.data) }
- . = ALIGN(4);
- .bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
- }
复制代码
代码示例 :
- all:start.o
- arm-linux-ld -Ttext 0x50008000 -o start.elf $^
- [[[[%]]]].o:[[[[%]]]].S
- arm-linux-gcc -g -o $@ $^ -c
- clean:
- rm -rf *.o *.elf
复制代码
(2) 启动 jtag 调试
|