【ARM自学笔记】裸机汇编语言点灯

储备知识(部分)

GNU:

GNU编译器套装,指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。1985年由理查德·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。

原名为GNU C语言编译器(GNU CCompiler),因为它原本只能处理C语言。GCC在发布后很快地得到扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,Go与其他语言。许多操作系统,包括许多类Unix系统,如Linux及BSD家族都采用GCC作为标准编译器。

GCC原本用C开发,后来因为LLVM、Clang的崛起,它更快地将开发语言转换为 C++ 。许多C的爱好者在对 C++ 一知半解的情况下主观认定 C++ 的性能一定会输给C,但是Ian Lance Taylor给出了不同的意见,并表明C++不但性能不输给C,而且能设计出更好,更容易维护的程序。

基本语句:

label: instuction @ comment
  • label 标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意 label 后面的“:”,任何以“:”结尾的标识符都会被识别为一个标号。
  • instruction 指令,汇编指令或伪指令
  • @ 符号,表示后边的是注释
  • comment 是注释内容

指令、伪指令、伪操作等不能大小写混用

eg:

    add:
        MOVS R0,#0X12 @设置 R0 = 0X12

伪操作:
系统预定段名:

  • .text 代码段
  • .data 初始化的数据段
  • .bss 未初始化的数据段
  • .rodata 只读数据段

也可以使用.section伪操作来定义一个段

.section .testsection @定义一个 testsetcion 段

函数

函数名:
    函数体
    返回语句(非必须)

Cortex-A7 常用汇编指令

常用的指令有三个: MOV、MRS和MSR

指令目的描述
MOVR0R1将R1里面的数据复制到R0种
MRSR0CPSR将特殊寄存器CPSR里面的数据复制到R0里
MSRCPSRR1将R1里面的数据复制到特殊寄存器CPSR里

储存器访问指令

ARM不能直接访问储存器 一般先将要配置的值写入到 Rx(x=0~12)寄存器中,然后借助存储器访问指令将 Rx 中的数据写入到ARM寄存器种。取出过程则相反。

指令描述
LDR Rd,[Rn,#offset]从存储器Rn+offset的位置读取数据存放到Rd中
STR Rd,[Rn,#offset]将Rd中的数据写入到存储器中的Rn+offset位置

原理分析

原理图如下:
在这里插入图片描述
在这里插入图片描述

只要把GPIO 3的输出电平拉低就可以亮。

流程

  1. 使能GPIO1时钟
    将CCM_CCGR1的bit27、bit26两个控制位都置11。
  2. 设置GPIO1_IO03的服用功能。
    复用寄存器“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03”的地址为0X020E0068,设置此寄存器,将GPIO1_IO03这个IO复用为GPIO功能
  3. 配置GPIO1_IO03
    配置寄存器“IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03”
  4. 设置GPIO
    配置GPIO的工作模式
  5. 控制GPIO的输出电平
    (寄存器具体配置参考数据手册)

编写代码

在Ubuntu系统下进行编写(不用再从Windows传到Linux上)

/*
 * 裸机汇编电灯
 */

 .global _start

 // 从此函数开始执行此函数完成时钟使能、初始化等

 _start:

 // 1.使能所有时钟
 ldr r0, =0x020c4068
 ldr r1, =0xFFFFFFFF
 str r1, [r0]

 ldr r0, =0x020c406c
 str r1, [r0]

 ldr r0, =0x020c4070
 str r1, [r0]

 ldr r0, =0x020c4074
 str r1, [r0]

 ldr r0, =0x020c4078
 str r1, [r0]

 ldr r0, =0x020c407c
 str r1, [r0]

 ldr r0, =0x020c4080
 str r1, [r0]

 // 2.设置复用为GPIO1_IO03
 ldr r0, =0x02E0068
 ldr r1, =0x5
 str r1,[r0]

 // 3. 配置IO的属性
ldr r0, =0x020E02F4
ldr r1, =0x10B0
str r1, [r0]

// 4. 设置为输出
ldr r0, =0x0209C004
ldr r1, =0x0000008
str r1, [r0]

// 5. 打开LED0
ldr r0, =0x0209C000
ldr r1, =0
str r1, [r0]

// 死循环
loop:
    b loop
    

编译代码

  1. 编译文件

使用交叉编译器将 .s文件编译为 .o文件。命令如下:

arm-linux-gnueabihf-gcc -g -c led.s -o led.o
  1. 链接文件
    将工程所需的全部.o文件与地址链接起来生产 .elf文件。命令如下:
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
  1. 格式转换
    因为最终要烧录的文件格式为.bin文件(二进制文件),所以需要进行转换。 命令如下:
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
  1. 反汇编(检验)
    检查上述过程是否正确。命令如下:
arm-linux-gnueabihf-objdump -D led.elf > led.dis

当文件多时可以通过make进行完成上述过程。
在工程目录下创建“Makefile”文件,并写入代码:

led.bin:led.s
    arm-linux-gnueabihf-gcc -g -c led.s -o led.o
    arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
    arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
    arm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:

代码烧写(SD卡烧录启动)

采用imxdownload进行下载SD卡。
其中遇到这样一个问题:
当正常读卡器插入电脑时, /dev/ sd* 文件中应该含有 /dev/sdd , /dev/sdd1。
然而,我的读卡器插上去却多了 /dev/sdb /dev/sdb1
sda是系统的第一块磁盘空间,sdb是第二块,sdb1是第二块磁盘的第一分区,也就是Ubuntu将读卡器当作一个磁盘或者说是U盘。
但这个并不影响往SD卡里写入数据,大概率是读卡器的问题。

结果

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: ARM汇编语言官方手册是一本非常重要的资料,它涵盖了ARM处理器的指令集,以及如何使用这些指令来编写汇编程序的详细信息。这本手册编写精细,内容丰富,官方出版,准确性和权威性都得到了保证。 ARM汇编语言嵌入式系统和嵌入式软件领域被广泛应用,它的指令集非常丰富和灵活,能够满足各种不同的应用需求。这本手册将介绍ARM处理器的各种指令和指令集体系结构,包括数据处理、位操作、循环和分支等。 在手册中,读者可以找到有关寄存器、内存分配和异常处理等方面的详细信息。还会介绍如何使用汇编语言编写基本程序,例如打印字符串、读写数据等。此外,手册还提供了一些示例程序和实践建议,帮助读者更好地理解和运用ARM汇编语言。 对于嵌入式系统和软件开发从业人员来说,熟练掌握ARM汇编语言非常重要。手册可以为他们提供详细的指导和参考,帮助他们轻松掌握ARM汇编语言的基础知识和高级应用。尽管这本手册对初学者来说可能有点繁琐和复杂,但它对学习ARM汇编语言的人来说是必不可少的资料。 ### 回答2: ARM汇编语言官方手册是ARM公司提供的一份权威指南,旨在帮助开发者掌握ARM汇编语言的基本原理和使用方式。 该手册主要由两个部分组成:ARM体系结构参考手册和ARM汇编器参考手册。其中,ARM体系结构参考手册描述了ARM体系结构的基本概念、指令集和寄存器等重要组成部分,而ARM汇编器参考手册则详细介绍了如何使用ARM汇编语言编写程序,并提供了各种汇编指令的使用方法和参数说明。 使用该手册前,需要对计算机体系结构和汇编语言有一定的了解。对于初学者来说,可以通过阅读相关的教材和在线教程来提高自己的基础知识水平。 需要注意的是,由于ARM体系结构存在多个版本,部分指令的功能和使用方法可能会有所不同。因此,在编写程序时,需要根据所使用的ARM芯片和体系结构版本来选择合适的指令和参数。 总之,ARM汇编语言官方手册是ARM开发者必备的参考资料之一,它提供了大量的信息和指导,帮助开发者快速掌握ARM汇编语言的基本原理和技巧,从而更好地开发各种ARM芯片应用。 ### 回答3: ARM汇编语言官方手册(ARM Assembly Language Reference Manual)是ARM公司发布的一份权威指南,介绍了ARM汇编语言的语法、指令集和编程方法。该手册适用于所有的ARM处理器架构,包括ARMv7和ARMv8。 该手册主要分为以下几部分: 1. 汇编语言基础:介绍了ARM汇编语言的基本语法、数据类型、寄存器、寻址方式和指令格式等内容。 2. 指令集手册:列举了所有可用的ARM汇编指令和伪指令,并详细介绍了它们的作用、语法和操作符等信息。 3. 示例程序:提供了一些常见的ARM汇编语言程序示例,帮助读者更好地理解和应用手册中的知识。 4. 参考文献:包括了在手册中提到的参考资料和网址,方便读者进一步了解ARM处理器和汇编语言的相关知识。 总体来说,ARM汇编语言官方手册非常全面且易于理解,对想要学习和应用ARM汇编语言的开发者和研究人员都非常有用。但需要注意的是,ARM汇编语言相对于其他高级编程语言而言,学习难度较高,需要一定的计算机底层知识和代码经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ORI2333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值