(十一)GNU ARM汇编语言

本专栏总结王利涛《C语言嵌入式Linux高级编程》第二期课程

一、ARM与GNU编译器

1)常用ARM开发环境

  • IAR
  • ADS1.2/SDT :ARM software Development kit
  • RVDS:Realview Developer Suite
  • Keil MDK
  • Real View MDK
  • GNU ARM交叉编译器

2)ARM编译器

  • ARM编译器
  • GNU arm-linux-gcc bianyiqi

二、编译器是一套工具

arm编译器是一套工具,包含:

  • 编译器有:gcc、g++
  • 汇编器、链接器:as、ld
  • 二进制转换工具:objdump、objcopy-strip
  • 打包工具:ar
  • 调试工具:gdb
  • 库/头文件

三、ARM编译器与ARM GNU编译器区别(主要是汇编器)

1)编译器设计的参考标准

这两个编译设计都是参考 ARM指令集。

2)编译器设计实现

  • 标准指令:将高级程序翻译成ARM指令集规定的汇编指令。
  • 伪操作:将汇编指令组装成一个可运行的汇编程序。
    在这里插入图片描述
  • CPU内部的电路,决定了ARM的指令集。ARM编译器 和 ARM GNU编译器的设计参考了ARM指令集,并且各自的编译器都要属于自己的伪操作。编译器的作用是用来做翻译工作,将高级语言,转换成ARM指令集规定的汇编。

3)编译器之间的伪操作差异

ARM编译器ARM GNU编译器
AREA copy, CODE,….text
AREA dat, DATA,….data
使用 ;注释使用/* */或@ 注释
DCD.long / .word
EntryEntry:
END.end
CODE32.arm/.code32
SPACE.space
GBLL/GBLA.global
EXPORT.global
IMPORT.extern
EQU/SETL/SETA/equ/.set
labellabel:
:OR1
:SHL:<<
IF:DEF:ELSE ENDIF.ifdef .else .endif
MACRO.macro
MEND.endm
GET test.h.include “test.h”

四、ARM GNU编译常用伪操作

伪操作说明
ENTRY(_start)定义程序入口
@注释
.section .text/.data定义段
.align地址对齐方式
.quand / .long / .word整型数据定义
.byte/ .short整形数据定义
.string / .ascii / .asciz字符串定义
.float浮点数定义
.space 10 FF分配10个字节空间,填充为FF
.equ / .set赋值语句
.type func, @ function指定符号类型为函数
.type num, @boject指定符号类型为对象[object->常数、变量]
.include / .incbin展开头文件/二进制文件
tmp .reg / .unreg r12给寄存器取别名
.arm / .code32指定指令集格式
.thumb / .code16指定指令集格式
.poll / .ltory声明一个文字池
.comm buf ,20在BSS段申请一段buf(未初始化)
OUTPUT_ARCH(arm)指定可执行文件运行平台
OUT_FOR MAT (“elf32-littlearm”)指定输出可执行文件格式
; / \n\t汇编语句分隔符
# / $指定指令集版本
.arch指定指令集版本
.file汇编对应的C源文件
.fpu浮点类型

五、GNU汇编中的标号

1)使用规则

  • 由字幕、数字、下划线和 . 等字符组成;
  • 局部标号由数字 N 组成,引用 :NF或Nb,表示往前或往后搜索;

2)程序气短标号:_start

  • ARM GUN汇编默认使用 _start标号作为汇编程序的起点;
  • 如果希望该标号被其它文件引用,需要 .global _start 声明一下。

六、section伪操作

1)使用方法

  • 用户通过 .section伪操作定义一个段;
  • 格式:.section <section_name> {, "<flags>"}
  • .section , mysection(段名) “awx" @定义一个允许可写、可执行段
  • 每个段以段名开始,以下一个段名或文件结尾为结束
  • 系统预留的段名不可冲突:.text / .data / .bss /…

七、GNU-ARM 汇编中的常数

基本数据格式

  • 二进制以 0b/0B 开头,八进制以 0开头,十六进制以0x开头,十进制以非0常数开头;
  • 负数前加“-” ,取补用“~”, 不相等用“<>”, 其它符号: + - * % < << > >> | & ^;
  • 字符串常量用双引号 " " 括起来;
  • 当前地址可以用 . 表示, . 在汇编程序代表当前指令的地址;
  • 使用 .ascii "hello\0" 定义字符串要自行结尾加‘\0’,
    .string可以定义多个字符串:.string "hello", "world"
    ascize 可以定义一个以空字符结尾的字符串: .asciz "hello "
  • 使用 .rept 重复定义数据:.rept 3 .byte 0x10 .endr 连续定义3个.byte 0x10

八、数据定义

1)基本格式

  • 标签:命令

    f:
      .float 3.14
    
  • 符号赋值

    .eque f, 10
    

2)定义静态符号

  • .equ除了赋值外,使用.equ 可以把常数定义为可以在代码段中使用的符号,类似于C语言中的#define 宏定义

    .section .data
    .equ DELAY, 100
    .section .text
     mov R0, $DELAY
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值