第2课:ARM汇编学习

发布者:平静宁静最新更新时间:2016-08-06 来源: eefocus关键字:ARM  汇编学习 手机看文章 扫描二维码
随时随地手机看文章
首先要明确这节课要学的是什么:

1通过学习ARM汇编语言从而了解ARM处理器的工作原理。

2用汇编写Bootloader

在这里汇编的基本语法在《ARM嵌入式系统开发》里面已经写过了。这里就写一点需要特别注意的地方

我们学汇编,并不是要求用汇编写很多复杂的程序。那样不切实际,那些可以用更高一层的C来写。

7种寻址方式:

1立即数寻址  ADD r0,r0,#1

2寄存器寻址  ADD r0,r0,r1

3寄存器间接寻址 LDR r0,[r1]

4寄存器变址寻址 :前变址,自动变址,后变址

LDR r0,[r1,#4]

LDR r0,[r1,#4]!

LDR r0,[r1],#4

5堆栈寻址 我们一般用FD 满递减 LDM {sp}!,{r1-r4}

只用于堆栈

6块拷贝寻址

LDMIA LDMIB LDMDA LDMDB

7相对寻址

BL label       相对地址的寻址

LDR pc,label 或 MOV pc,label 绝对地址的寻址

 

具体指令不再做介绍了。补充一些:

1在例如 LDMFD sp!{r1-r5,pc}^

在加了pc的情况下 再加^表示把spsr拷贝到cpsr中。

2乘法指令一般不太用,效率低。即使要用也用位移来代替。

3AND与 用来志零 ORR或用来志1 EOR异或用来取反 BIC用来清位(BIC是比较数的哪一位是1哪一位就变0与AND相反)

而TST是没有结果寄存器的AND 并且改变cpsr  TEQ是异或 CMP是减法。

 

接下来说本课的重点 armlinux的编译器gcc

在win下面用的是armcc,而我们的用gcc

1任何以冒号结尾的标识符都认为是一个标号,当标号为0到9的数字时是局部标号。在局部标号后加f表示引用标号的地方向前的标号

而加b则表示向后

例如: subs r0,r0,#1

            bne 1f

2  。section伪操作来定义一个段,后加段名

 汇编系统有预定义的段名 。text 代码段 。data初始化数据段 。bss未初始化数据段 (。bss要在text之前)

3定义入口点,默认下是start标号,也可以在连接脚本中用ENTRY(标志)来指示入口标志。连接脚本之后介绍。

.section .data

<...>

.section .bss

<...>

.section.text

.globl _start          _start是全局的

_start:                   代码从这开始执行。

4. .align 2(4,8,16)  对齐方式

    .end  结束符 不加也不报错

    .include 包含头文件

     .global 定义一个全局符号

 

编译器 5大工具

arm-linux-as

 arm-linux-gcc

 arm-linux-ld

 arm-linux-objcopy

arm-linux-objdump

介绍下一个ARM程序诞生的步骤。

1写程序

2编译成.o文件  用arm-linux-gcc -c link.s -o link.o

如果使用-S选项 对用C写的程序表示编译生成汇编文件

 

3编写连接脚本,编译成elf格式的文件:首先明确为什么要连接:有2点,1地址重定向。2写符号表。在gcc编译器中有内置的缺省的连接脚本,不过它是基于有操作系统的前提下的才能应用加载的。因为他是应用操作系统中内存的映射地址来连接的。而gnu编译器目标文件的个是是elf格式。它由若干的section组成。里面有。text段。data段。bss段。连接器的任务就是把多个目标文件的。text段。data段。bss段连接在一起。而连接脚本是告诉连接器从什么地址开始放至这些段。

如link。lds

ENTRY(begin)

SECTION

{

.=0x30000000;      表示目标代码开始的地址为0x30000000

.text   :{*(.text)}

.data   :{*(.data)}

.bss   :{*(.bss)}

}

然后通过arm-linux-ld -nostadlib -o link.elf -Tlink.lds link.o main.o 生成elf格式的文件。其中nostadlib表示不连接系统的库,-T表示采用连接脚本。也可以使用-Ttext address;address表示执行区地址。

4生成2进制文件。2进制文件才可以在内存中加载

arm-linux-objcopy -o link.bin link.elf

5反汇编

还可以用objdump来实现反汇编

arm-linux-objdump -D link.elf > a.dis

arm-linux-objdump -D -b binary -m arm link.bin >a.dis

关键字:ARM  汇编学习 引用地址:第2课:ARM汇编学习

上一篇:第1课:S3C2440的烧写
下一篇:第3课: 点亮开发板led灯

推荐阅读最新更新时间:2024-03-16 15:03

ARM发布有史以来功耗效率最高的应用处理器
2011年10月20日,中国上海——ARM 公司近日发布了有史以来功耗效率最高的应用处理器ARM® CortexTM-A7 MPCoreTM。同时发布的还有big.LITTLE processing,一个重新定义传统功耗-性能关系的灵活的解决方案。Cortex-A7处理器是在 Cortex-A8处理器所代表的低功耗领先工艺基础上进行开发的。当今大多数的智能手机都采用Cortex-A8为内核。相比Cortex-A8,单个Cortex-A7处理器能在同等功耗水平上,带来5倍的性能提升,而尺寸只是前者的五分之一。Cortex-A7处理器为售价不足100美元的入门级智能手机带来丰富的用户体验,从而帮助众多发展中市场用户进行互联。 当今
[单片机]
GNU ARM汇编--(十三)GNU ARM汇编下的linker script
在写GNU ARM汇编下的linker script之前,还是有必要看一下ldr指令,以及ldr和adr伪指令. ldr指令: LDR load word into a register Rd - mem32 ldr伪指令: LDR Rd, =constant LDR load constant pseudoinstruction Rd=32-bit constant adr伪指令: ADR Rd, label ADR load address pseudoinst
[单片机]
USB海量存储类设备功能在ARM系统中的应用
技术发展到今天的信息时代,数据的存储和传输在嵌入式系统有了越来越重要的地位。而USB是目前设计成熟、应用广泛且使用极为简捷的技术,USB传输是一种高效方便的数据传输方式。基于上述原因,本文重点论述基于USB的海量存储(USB Mass Storage)设备功能在ARM嵌入式系统中设计和应用。使用该设备功能,上位机可以像读写普通U盘一样对于系统采集并存储在FLASH中的数据进行读写。 1 硬件方案 l.1 器件简介 S3C44B0X 是SAMSUNG公司出品的基于ARM7TDMI内核的RISC型微处理器,8 kB指令和数据共享的缓存,主频可达66 MHz,可以运行16位的Thumb指令和32位的ARM指令,且接口丰富,具有通用
[缓冲存储]
基于ARM的消防监控方案
随着微电子技术和计算机技术的飞速发展,32位的高性能、低功耗的嵌入式微处理器逐渐取代了传统的8位单片机,采用多线程多任务的嵌入式操作系统依然成为发展的趋势。 当前,嵌入式技术已经广泛的应用到远程监控、数据采集、数据网络化管理当中,而消防监控作为一个与之戚戚相关的行业,与嵌入式技术紧密结合,具有良好的应用前景。 北京恒颐自主研发设计了集多项功能于一体的综合性消防监控网络系统,它利用先进的嵌入式技术手段,实现了集中维护、集中管理、无人值守的管理目标,为用户提供了一个功能强、投资少、技术先进的运行维护方式和科学的管理手段,以适应未来发展的要求。 概述 恒颐高科嵌入式消防监控系统,具有智能报警、
[单片机]
基于<font color='red'>ARM</font>的消防监控方案
多家芯片厂投入ARM服务器市场 然目标、策略各异
    DIGITIMES Research检视ARM架构伺服器晶片市场,了解已有9家业者表态投入或将投入发展ARM架构伺服器晶片,或已在发展中,或已经正式发表并推展晶片。 DIGITIMES Research同时发现,9家业者之所以投入ARM架构伺服器晶片市场,主要有4种策略动机,包含受安谋(ARM)资助而致力开发ARM架构伺服器晶片市场,或英特尔的宿敌为抗衡英特尔而发展ARM伺服器晶片,或网通设备晶片商在原有核心外寻求备案核心,或以执行力积极获取市场等。 除已表态或投入市场外,尚有部分业者未来有可能投入市场,这些业者已取得64位元ARMv8架构的技术授权,随时可能会发表以此架构为基础的晶片,进而跨入市场。不过,获授权者也可能将技
[手机便携]
RISC-V成功的研发,将给ARM带来冲击
RISC-V的成功,也就意味着软银旗下ARM受到严重影响。ARM正试图将智能手机领域的主导地位拓展至其他市场。ARM最近更是搬起石头,砸了自己的脚。不知出于什么考虑,ARM前段时间发布了一个网站,专门用来攻击他们的竞争对手、开源芯片架构RISC-V。 全球嵌入式领导企业ARM正在备受煎熬,这种煎熬来自于他的母体——RISC,可能正像RISC的读音一样,ARM即将risk(危险)了。近日华米科技发布的黄山1号芯片,号称全球智能穿戴领域中第一个人工智能芯片,它使用的正是RISC-V架构而非传统的ARM架构,因此也是全球第一款RISC-V开源指令穿戴处理器。RISC-V的成功,也就意味着软银旗下ARM受到严重影响。 黄山一号:具
[嵌入式]
RISC-V成功的研发,将给<font color='red'>ARM</font>带来冲击
ARM联合微软进军服务器市场 英特尔会哭晕?
  随着移动计算平台的崛起, ARM 和x86的楚河汉界逐渐被填平。两大阵营互挖墙脚,但始终突破不了对方的核心领域。正如 ARM 搞不定桌面端,Intel也在移动端铩羽而归。   不过情况似乎出现转机,Intel不再是 微软 唯一的小甜甜了。在WinHEC 2016硬件大会上, 微软 和高通实现Win10对于骁龙处理器的支持,以后连服务器都将采用 ARM 芯片,牙膏厂要哭晕了吗? ARM联合微软进军服务器市场 英特尔会哭晕?    复仇者AMD擦肩而过   一直以来,ARM处理器在移动端使用最为广泛。虽然性能远不及桌面x86平台,但功耗表现却十分优越,长期被Intel压着打的AMD便看中了这点。2012年AMD宣布与ARM
[网络通信]
ARM 汇编 LDR STR MOV
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:ldr
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved