arm开发入门与汇编基础(代码片段)

chorm590 chorm590     2023-05-04     117

关键词:

2019-12-12

关键字:汇编指令基础


 

首先 ARM 是一家公司,它成立于 1990 年。ARM 公司主要是设计 ARM 系列的 RISC 处理器内核,并将这些内核授权给合作伙伴进行生产与销售。ARM 公司是一家只负责设计内核而不生产芯片的公司。

 

ARM 芯片的产品线主要分为三种:

1、应用级

应用于高端产品的芯片,如智能手机等。其芯片代号为 A 系列,如 Cortex-A8 , Cortex-A9。

2、实时嵌入式

应用于一些对性能要求稍低一些的设备。其芯片代号为 R 系列,如 Cortext-R4。

3、MCU、FPGA

主要应用于对成本要求较高但性能要求较弱的产品。其芯片代号为 Cortext-M 系列。

 

ARM 的体系架构主要有以下四种:

1、ARMv4

2、ARMv5

3、ARMv6

4、ARMv7

不同体系架构拥有不同的指令集。

 

一个典型的 ARM 设备至少需要包含三个模块:1、FLASH;2、内存;3、CPU。

 

FLASH 负责存储程序,内存负责临时管理程序的运行状态而CPU则负责做计算处理。

 

CPU 中又有三个很重要的组成:1、控制器;2、运算器;3、寄存器。

 

控制器负责去 FLASH 中准确读取程序内容。运算器负责执行程序代码,或者说负责执行计算需求,而寄存器则负责存储需要计算的数据。

 

什么是交叉编译工具链?

交叉编译工具链是嵌入式行业常听的词汇。嵌入式设备的芯片通常都是 ARM 架构的,而我们用于开发嵌入式程序的电脑却通常都是 X86 架构的。两种芯片架构不同,所编译出来的程序自然也不能通用。那为了能在电脑上编译出嵌入式设备能用的程序来,就必须要用到这个交叉编译工具链了。它的作用就类似于一个“翻译官”,将在电脑上写的代码翻译成能在 ARM 架构的芯片上运行的程序出来。

 

ARM 的工作模式

ARM 主要有七种工作模式:

1、User

非特权模式,或者称为普通模式。大部分的任务执行都在这一模式下完成。

2、FIQ

中断模式(Fast)。当一个高优先级的中断发生时,就会进入这个模式。

3、IRQ

中断模式(normal)。当一个低优先级的中断发生时,就会进入这个模式。

4、Supervisor

超级用户模式。当复位或软中断指令执行时会进入这种模式。

5、Abort

当需要存取异常信息时会进入这个模式。

6、Undef

当执行未定义指令时会进入这个模式。

7、System

几乎与 User 模式一样,只是其权限会比 User 稍高一些。

 

ARM 有 37 个寄存器,其中 1 个是 PC 寄存器,1个是CPSR(Currnet program status register)寄存器,5个是SPSR(Saved program status register)寄存器以及30个通用寄存器。

 

汇编指令基础

MOV指令

MOV指令就是 move 的缩写。它表示移动寄存器的值的意思。

 

mov r1,#13

mov r2,#0xff

以上两条指令表示将十进制数值 13 寄存到 r1 寄存器中以及将十六进制数值 0xff 寄存到 r2 寄存器中。

 

mov r1,r2,LSL#2

这条指令表示将寄存器 r2 中的值向左移动两位以后再寄存到 r1 寄存器中。LSL 即 left shift logic 的缩写。 假设 r2 寄存器中的值是1,那么指执行了这条指令以后 r1 中的值将会是 4。与之相对应的还有 LSR#2,表示向右移动2位。

 

MRS 指令

MOV指令只能操作普通的寄存器,如果要操作特殊寄存器,就得使用 MRS 指令。

 

mrs r1,cpsr

mrs cpsr,r0

以上两条指令分别表示将 CPSR 寄存器中的值读取到普通寄存器 r1 中以及将普通寄存器 r0 中的值写入到 CPSR 寄存器中。

 

逻辑指令

and

逻辑与,例如 and r0,r1 #0xff 相当于 r0 = r1 & 0xff。

 

orr

逻辑或,例如 orr r3,r0,#0xf 相当于 r3 = r0 | 0xf。

 

cmp

比较。 例如 cmp r1,r0,比较 r1 与 r0 是否相等。

 

bic

清除指令。例如 bic r0,r0,#0x03。清除 r0 寄存器中的第 0 号位与第 3 号位。

 

tst

测试。例如 tst r0,#0x20。用于测试第 6 位的值是否为0,为0则Z标志位置1。

 

算术指令

add

加法指令。例如:add r0,r1,r2 表示将 r1 与 r2 两寄存器的值相加后保存在 r0 寄存器中。

 

sub

减法指令。例如:sub r0,r1,#3 表示将 r1 寄存器中的值减 3 后保存在 r0 寄存器中。

 

mul

乘法指令。例如: mul r0, r1, r2 表示将 r1 与 r2 中的值相乘后保存到 r0 寄存器中。

 

跳转指令

b

普通跳转指令。常见的用法为: b label。表示将程序指针跳转到标签为 label 的代码处。即 C 语言中的 goto 语句。

 

bl

记忆跳转指令。常见用法为: bl func。这条指令会将下一条指令的地址保存到 LR 寄存器,然后将程序指针跳到 func 标签处执行。待 func 标签处的代码全部执行完毕后可以通过 mov pc,lr 指令将程序指针跳回到先前跳转func前的位置继续执行。这就是单片机中的中断的概念,执行完以后还要回来的那种。

 

beq

bne

 

 以下是一个实例,将一段普通 C 语言程序翻译成汇编语言:

void main()

    int ret = 0;
    func1(2);
    while(1);


int func1(int a)

    if(a == 2)
        return func2(a);
    else
        return func3(a);


int func2(int a)

    return a+3;


int func3(int a)

    return a-1;

 

.text

main:
    mov r5,#0
    mov r0,#2
    b1 func1
main_end:
    b main_end


func1:
    mov r12,lr
    cmp r0,#2
    bleq func2
    blne func3
func_end:
    mov pc,r12


func2:
    add r0,#3
    mov pc,lr
func2_end:


func3:
    sub r0,r0,#1
    mov pc,lr
func3_end:


.end

 

Load/Store 指令

load/store 架构规定,存储器之间不能直接拷贝,必须通过CPU中的寄存器作中转。

load指令的汇编语句为: ldr。它的作用是将指定地址中的数据加载进CPU的寄存器中。

例如:

ldr r0,=buf

ldr r1,[r0]

第一句的意思是将 ‘buf‘ 标签的地址存到 r0 寄存器中。其中 buf 标签是定义在 .data 区段的 .byte 数组。

第二句的意思就是将 r0 寄存器中的值作为地址,将这个地址中的内容加载到 r1 寄存器中。

 

ldr r1,[r0,#8]  相当于C语言的 r0 = *(r0 + 8)

 

store指令的汇编语句为:str。与 ldr 相反,将CPU寄存器中的值写到指定地址中的内存中去。

例如:

mov r0,#9

mov r1,=dest_buf

str r0,[r1]

第一句先准备好一个寄存器中的数据。

第二句确定好内存中的数据段地址。

第三句将 r0 寄存器中的数据输出到 dest_buf 内存段中去。

 

GNU汇编伪指令

GNU汇编伪指令是辅助汇编程序编程用的指令,它不参与实际代码逻辑的构建,仅作辅助标识之用。

.text  将定义符开始的代码编译到代码段

.end  文件结束

.data  将定义符开始的代码编译到数据段

.equ  定义宏

.byte  定义1个字节的变量,定义字节数组的指令为: .byte 0x11,‘a‘,0

.word  定义word变量,长度为4个字节。

.string  定义字符串,如  .string "hello worl"

.global  声明全局符号,如 .global =start

 

批量操作指令

前面提到的 ldr 与 str 指令都是单寄存器操作的。如果想要一次性操作多个寄存器,则可以使用以下指令

ldmia 与 stmia。

例如:

ldmia r0!,r7 - r10。这条指令执行完毕后,会自动将 r7 ~ r10 寄存器中的数据加载到 r0 ~ r3 寄存器中。

stmia r0!,r7 - r10。与上一条指令相反。

 

堆栈操作指令

stmfd sp!,r0 - r12,lr  将寄存器 r0 ~ r12 lr中的值存入栈中,常用于中断保护现场,‘!‘ 号表示会自动偏移。

ldmfd sp1,r0-r12,pc^  与上一条指令相反,常用于中断恢复现场。

 

软中断

swi

该指令可以产生一个软中断,用法为:swi 0x02,表示产生一个中断号为 2 的软中断。

 

2



linux驱动开发:arm汇编基础(代码片段)

文章目录Linux驱动开发:ARM汇编基础一、GUN汇编语法1.1语句结构:1.2伪操作1.3GUN函数二、ARM的寻址方式2.1立即寻址2.2寄存器寻址2.3寄存器间接寻址2.4基址变址寻址2.5多寄存器寻址2.6相对寻址2.7堆栈寻址三、Cortex-A常用汇编... 查看详情

arm汇编语言基础(代码片段)

ARM与Thumb寄存器对应关系PC寄存器:ARM状态为R15,Thumb状态为PCLR寄存器:ARM状态为R14,Thumb状态为LRSP寄存器:ARM状态为R13,Thumb状态为SPIP寄存器:ARM状态为R12,Thumb状态为IPFP寄存器:ARM状态为R11,Thumb状态为FP其他对应关系一一相同ARM与Thumb指令... 查看详情

arm汇编基础详解(代码片段)

...5算术运算指令2.6逻辑运算指令前言我们在进行嵌入式Linux开发的时候是绝对要掌握基本的ARM汇编,因为Cortex-A芯片一上电SP指针还没初始化,C环境还没准备好,所以肯 查看详情

《嵌入式-嵌入式大杂烩》arm汇编入门(代码片段)

我们在学习ARM的时候,一般都不用看汇编启动代码,直接使用芯片厂商提供的汇编启动代码,但是要想深入了解ARM内部原理,就必须掌握一定的汇编知识。我们在前面总结了处理器架构与指令集,那么汇编和... 查看详情

android逆向基础之arm汇编语言知识总结(代码片段)

...用汇编指令2.4实例程序分析总结前言X86是英特尔Intel首先开发制造的一种微处理器体系结构的泛称,包括Intel8086、80186、80286、80386以及80486等以86结尾系列,英特尔统治整个CPU产业链长达数 查看详情

arm汇编基础--ads1.2安装与第一个arm汇编程序

...是与逆向相关,用到ARM汇编,以前在大学时学过x86汇编和ARM开发,自我感觉当时学的还挺好,很久没用也生疏了.正好趁着这个机会也复习一下ARM汇编.关于ARM的介绍和理论知识,此处就不再赘述.进入正题:安装ADS1.2安装过程很简单,没什... 查看详情

arm汇编基础上(代码片段)

...集处理器,其指令集的设计是定长的,也就是其汇编对应的机器码是定长的(2字节或者4字节)。那么对于定长而言,其优点就是更快的被执行,因为这样CPU取指令译码的速度相对x86的CPU会快一些,但... 查看详情

c与arm汇编结合实现mini2440串口uart简单程序(代码片段)

最近学完了ARM的一些基础知识,开始在mini2440上开发一些简单的程序,串口发送程序是一开始涉及多个寄存器的例子,稍有繁多的步骤应该是开发过程中要慢慢适应的境况下面的程序的目的是实现mini2440串口的发送功能,向超级... 查看详情

mips简单入门(代码片段)

What‘stheMIPS?汇编语言汇编语言是一类语言的总称,因处理器不同,而对应的不同机器的指令集也不同,产生了很多种汇编语言。目前最流行的是ARM,MIPS,x86。ARM用于大量的移动手机和嵌入式系统。MIPS流行于IBMCPUs。x86用在InterPCs。... 查看详情

android逆向基础之arm汇编语言知识总结(代码片段)

...用汇编指令2.4实例程序分析总结前言X86是英特尔Intel首先开发制造的一种微处理器体系结构的泛称,包括Intel8086、80186、80286、80386以及80486等以86结尾系列,英特尔统治整个CPU产业链长达数十年。ARM(AdvancedRISCMachines... 查看详情

arm汇编基础基于keil创建stm32汇编程序的编写(代码片段)

文章目录一、新建项目(1)工具介绍(2)创建项目:二、配置环境(1)配置芯片(2)配置运行环境三、调试代码(这里选择使用的是仿真调试)(1)源代码(2)仿真设... 查看详情

node.js入门01:基础使用与说明(代码片段)

...运行在浏览器中的网页上的脚本语言,以前这是前端开发人员才用的。实际工作中往往很难做到前后端完全分离,很多前端开发人员也要会写点后端代码,方便自己测试页面功能使用 查看详情

arm-linux程序开发入门(qt窗口应用程序编码交叉编译调试)(三机器和双机器搭建方法)(笔记)(代码片段)

Linux及Arm-Linux程序开发笔记(零基础入门篇)文章目录前言一、Arm-Linux程序开发平台简要介绍1.1程序开发所需系统及开发语言1.2系统平台搭建方式二、Linux开发平台搭建(略)2.1安装虚拟工作站2.2安装Linux虚拟机三... 查看详情

《嵌入式-嵌入式大杂烩》keil反编译入门(代码片段)

...存器的基础知识,请参看笔者以前的文章​。ARM汇编入门深入理解ARM寄存器4反汇编代码全解析进入debug模式,在View下选择disassemblywindow。这样就可将机器码和对应的代码对应起来。当程序运行起来了,也就从异常向量... 查看详情

springmvc入门系列-springmvc简介与入门(代码片段)

...ing的一个框架,实际上就是spring的一个模块。专门是做web开发的。理解是servlet的一个升级web开发底层是servlet,框架是在servlet基础上面加入一些功能,让你做veb开发方便。springMVC就是一一个spring,spring是容器,Ioc能够管理对象,... 查看详情

arm裸机开发:c语言点亮led(代码片段)

文章目录ARM裸机开发:C语言点亮LED一、硬件平台:二、汇编搭建C开发环境2.1STM32启动代码2.2I.MUX启动代码三、C语言驱动程序四、实验现象ARM裸机开发:C语言点亮LED一、硬件平台:正点原子I.MX6U阿尔法开发板二、... 查看详情

玩转spring——spring入门基础(代码片段)

什么是SpringSpring是一个开源的的轻量级的应用开发框架,其目的是用来简化企业级应用程序开发,减少代码之间的侵入性。Spring提供的IOC和AOP应用,可以将组件的耦合度将至最低,即我们常说的解耦,这样能便于日后系统的升级... 查看详情

一数据库开发与实战专栏导学及数据库基础概念入门(代码片段)

文章目录一、专栏导学1.1课程内容1.2学习安排1.3适合人群1.4学习方法二、认识数据库2.1生活中的数据库2.2数据管理技术的3个发展阶段2.3数据库、关系型数据库、非关系型数据库概念2.4为什么要使用数据库2.5数据库系统及其组成... 查看详情