arm的gnu环境

本文介绍了在ARM平台上如何创建并编译汇编代码,包括编写启动文件start.S和配置makefile,利用arm-gcc进行汇编编译,生成exe和dll文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:
    初始条件
    环境建立
    arm-gcc汇编简介
    
初始条件:
    tq2440开发板
    
环境建立:
    打算使用eclipse+yagarto的方式建立win下的开发环境.
    
    1.需要下载的工具
    eclipse-platform-3.8-win32.zip  
    http://archive.eclipse.org/eclipse/downloads/drops/R-3.5-200906111540/eclipse-platform-3.5-win32.zip
    
    cdt-master-7.0.2.zip  
    http://ftp.neu.edu.cn/mirrors/eclipse/tools/cdt/releases/helios/dist/cdt-master-7.0.2.zip
    
    yagarto-tools-20100703-setup.exe
    http://www.yagarto.de/download/yagarto/yagarto-tools-20100703-setup.exe
    
    yagarto-bu-2.22_gcc-4.7.1-c-c++_nl-1.20.0_gdb-7.4.1_eabi_20120616.exe
    http://nchc.dl.sourceforge.net/project/yagarto/YAGARTO%20for%20Windows/20120616/yagarto-bu-2.22_gcc-4.7.1-c-c%2B%2B_nl-1.20.0_gdb-7.4.1_eabi_20120616.exe
    
    2.工具简介
    eclipse-platform是一个IDE工具的基础,在其上加上针对特定语言的插件,就可以弄成一个某种语言的IDE.
    cdt-master这个就是上面提到的插件.
    yagarto-tools这个东西是一个linux下编译基础工具集,其中包括了make,rm等小程序,要使用makefile进行工程管理,则这些小程序是基础.
    yagarto-gcc-eabi这个东西则是arm-gcc编译工具集.
    
    3.安装步骤
    可以参考yagarto帮助网页http://www.yagarto.de/howto.html.在具体的实现过程中,越过了其中的GDB的东西.一般调试中,习惯的是printf.
    1>eclipse及其插件安装
    eclipse-platform是绿色软件,直接解压到某个目录下即可.不过eclipse使用java开发的应用程序,需要在本机上安装jre先.
    打开eclipse,然后打开Help/Install New Software...,点击Add/Archive添加上面下载的cdt-master,然后将下面的全选即可(也可以按照yagarto网上介绍其中的选项进行).
    
    2>安装yagarto-tool和yagarto-gcc-gabi
    分别点击上面exe文件进行一半win程序安装即可.(安装目录中最后全是英文字母.同时安装之后最后重启一下).
    打开win的cmd,cd到任意目录下,在其中输入touch --version确认yagarto-tool成功安装,输入arm-none-eabi-gcc --version确认yagarto-gcc-eabi成功安装.
    可能会出现的问题是显示找不到这个命令,那么此时检测环境变量Path设置,如果是其它问题(在安装过程中,在使用touch命令时,出现Couldn't reserve space for cygwin's,这种情况可能是缺失某个dll造成的,针对此,直接安装了Cygwin,然后将其中相对应的exe文件和全部的dll都拷贝到yagarto-tool/bin安装目录下即可.这也许是网上介绍需先安装Cygwin的原因.).
    
    3>验证环境
    具体步骤如下:
        -打开eclipse/File/New/C Project,输入工程名Hello,在Project Type下面选择Makefile Project/Empty Project,右边的Toolchains选择--Other Toolchain--.

        -新建start.S文件,代码如下:

.text
.global _start
_start:
    ldr     r0, =0x56000010		@ GPBCON LED[0:3] Output
    mov     r1, #0x05500;
    str   	r1, [r0]

	adr		r0, halt_loop
	ldr		r0, =0x56000014		@ GPBDAT LED[0:1]-On LED[2:3]-Off
	mov		r1, #0x0c0
	str		r1, [r0]

halt_loop:
    b       halt_loop

        -新建makefile文件,代码如下:

# Tools
TGT	=	arm-none-eabi-
CC	=	$(TGT)gcc
AS	=	$(TGT)as
LD	=	$(TGT)ld
CP	=	$(TGT)objcopy

all: start.o

start.o: start.S
	AS start.S -o start.o
	
clean:
	-rm -f *.0
        -选择Project/Build Project.
    如果一切正常,在Hello工程目录下面会生成start.o文件.
    

arm-gcc汇编:

    gnu的arm汇编同ADS的汇编不同之处主要在于其伪指令.以下重点介绍其伪指令.
    
    _start是默认的入口标签,这个可以在lds脚本中自定义.
    .section SECTION_NAME
    系统默认的SECTION_NAME有如下:
    .text(代码段)
    .data(初始化值数据段)
    .bss(未初始化数据段)
    数据段需要定义在代码段之前.
    .global(导出标签)
    .extern(导入标签)
    .align(对齐)
    
    
    数据定义
    .byte(8bit)
    .short(16bit)
    .int(32bit)
    .flaot(32bit,浮点型)
    .ascii(ascii无0结尾字符串)
    .string(ascii以0结尾字符串)
    .rept NUM(后面定义的内容会重复NUM)
    .endr
    .space NUM VALUE(保留接下来的NUM空间)
    
    条件判断
    .if
    .else
    .endif
    .include
    .ifdef
    .ifndef
    .equ
    
    宏指令
    .macro(宏开始)
    .endm(宏块结束)
    .exitm(跳出宏块)
    例子:
        .macro MAX_A_B  a, b
        .if \a > \b
            mov r0, \a
        .else
            mov r0, \b
        .end
        .exitm
        .endm
    
    arm-gnu特有伪指令
    .arm(arm32位指令)
    .thumb(thumb16位指令)
    .itorg(伪指令ldr数据存放池)
    
    对于.data数据段,一般都是作为全局存储区来使用,这样全部程序都可以看的见,一般的在代码段中使用.byte之类伪指令定义的数据则属于私有数据,是一种临时的.
    
    操作码
    NOP(空指令)
    LDR r0, =0x111111
    ADR r0, pre
    ADRL r0, last
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值