如何在redhat6中编写2440的汇编语言程序和Makefile文件

在当前各类应用程序开发中,使用汇编的场景越来越少,但是如果要学习硬件技术或者驱动底层的技术,不懂汇编,很多问题是搞不定的。其中有几个场景是必须用汇编的,一个是如果要做bootloader相关的工作,系统还没上电,此时根本就没有C语言运行环境,因此只能用汇编来设计相关程序。第二个是如果某些功能对效率的要求非常高,可以考虑将部分关键代码换成汇编代码。


汇编程序的麻烦在于兼容性比较差,在一个平台运行得好好的程序,可能换了地方就不行了。目前常用的ARM汇编指令大致有两种:一个是 ARM 标准汇编,适用于ARM公司的汇编器,适合在Windows平台下使用,如ADS中使用。另一个是 GNU 汇编:适用于GNU交叉编译工具链中的汇编器,适合于Linux开发平台。

     这里只给出了学习汇编语言配置环境的简单例子,如果要学习具体的cmp,add等指令,建议看《arm汇编手册(中文版).chm》,这个手册比较简单,也更加直接,这里不再赘述里面的内容。


在C语言中 ,我们都知道,程序的框架是头文件、一堆的功能函数,最后由main函数提供程序入口。汇编程序的结构稍微麻烦一些,大致结构为:
.section .data
<span style="white-space:pre">	</span><初始化的数据>
.section .bss
<span style="white-space:pre">	</span><未初始化的数据>
.section .text @表示代码段
.global _start @标记后,可以被外部访问
_start:
  <汇编代码>
不过,一般我们会使用简化后的结构:
.text@表示的是代码段
.global _start
_start:@程序的入口
<pre name="code" class="plain">  <汇编代码>

 
  

1编译第一个汇编程序

首先编写start.s文件

.text
.global _start
start:
	mov r1,#1
	mov r2,#2
	mov r3,#3
这个程序非常简单,就是将三个立即数1,2,3分别赋值给寄存器r1,r2,r3.

然后编写Makefie文件:

all:start.o
	arm-linux-ld -Ttext 0x20000000 -o start.elf $^
	arm-linux-objcopy -O binary start.elf start.bin
%.o:%.s
	arm-linux-gcc -g -o $@ $^ -c
	
.PHONY: clean
clean:
	rm *.o *.elf

一般情况下,要编译程序,可以单独写一个编译脚本, 但是这里为了简洁,我们使用-Ttext直接指定程序代码的地址0x20000000,这个地址是210的,如果是2440,则为0x300000800,若是ok6410,则为0x50008000,这里要根据具体的板子的型号来确定。





你可能感兴趣的:(linux,汇编,嵌入式,ARM)