c语言里的adr指令,从0学ARM-汇编伪指令、LDS详解

ef5baf2f98f661ecbf313f11ac9104a6.png

一、MDK和/GNU伪指令区别

我们在学习汇编代码的时候经过会看到以下两种风格的代码:

gnu代码开头是:

.global_start

_start:      @汇编入口

ldr sp,=0x41000000

.end@汇编程序结束

MDK代码开头是:

AREA Example,CODE,READONLY    ;声明代码段Example

ENTRY ;程序入口

Start

MOV R0,#0

OVER

END

这两种风格的代码是要使用不同的编译器,我们之前的实例代码都是MDK风格的。

那么多对于我们初学者来说要学习哪种风格呢?答案是肯定的,学习GNU风格的汇编代码,因为做Linux驱动开发必须掌握的linux内核、uboot,而这两个软件就是GNU风格的。

为了大家不要把过多精力浪费在暂时没用的知识上,下面我们只讲GNU风格汇编。

二、GNU汇编书写格式:

1. 代码行中的注释符号:

‘@’ 整行注释符号: ‘#’ 语句分离符号:

直接操作数前缀: ‘#’ 或 ‘$’

2. 全局标号:

标号只能由a~z,A~Z,0~9,“.”,_等(由点、字母、数字、下划线等组成,除局部标号外,不能以数字开头)字符组成,标号的后面加“:”。

段内标号的地址值在汇编时确定;段外标号的地址值在连接时确定。

3. 局部标号:

局部标号主要在局部范围内使用而且局部标号可以重复出现。它由两部组成开头是一个0-99直接的数字局部标号 后面加“:”

F:指示编译器只向前搜索,代码行数增加的方向 / 代码的下一句

B:指示编译器只向后搜索,代码行数减小的方向

注意局部标号的跳转,就近原则「举例:」

文件位置

arch/arm/kernel/entry-armv.S

b9397c691a532d38b7f9ad56a2e3b2f2.png

7cca52e44ba79f5c38cc20f310a8038d.png

三、伪操作:

1. 符号定义伪指令

4bb0317dbb367884de9b5af1a217a869.png

2. 数据定义(Data Definition)伪操作

数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪操作有如下几种:

f6b860c073085a76c8669a8504b33e59.png

【举例】

.word

val:   .word  0x11223344

mov r1,#val  ;将值0x11223344设置到寄存器r1中

.space

label: .spacesize,expr     ;expr可以是4字节以内的浮点数

a:  space8, 0x1

.rept

.rept cnt   ;cnt是重复次数

.endr

注意:

变量的定义放在,stop后,.end前

标号是地址的助记符,标号不占存储空间。位置在end前就可以,相对随意。

3.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值