【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

发布者:温馨生活最新更新时间:2024-10-18 来源: cnblogs关键字:ARM  汇编  伪指令  协处理器  访问指令 手机看文章 扫描二维码
随时随地手机看文章

   Num:    Value  Size Type    Bind   Vis      Ndx Name

     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 

     1: 50008000     0 SECTION LOCAL  DEFAULT    1 

     2: 50010004     0 SECTION LOCAL  DEFAULT    2 

     3: 00000000     0 SECTION LOCAL  DEFAULT    3 

     4: 00000000     0 SECTION LOCAL  DEFAULT    4 

     5: 00000000     0 SECTION LOCAL  DEFAULT    5 

     6: 00000000     0 SECTION LOCAL  DEFAULT    6 

     7: 00000000     0 SECTION LOCAL  DEFAULT    7 

     8: 50010004     0 NOTYPE  LOCAL  DEFAULT    2 hello

     9: 50010011     0 NOTYPE  LOCAL  DEFAULT    2 bh

    10: 50010011     0 NOTYPE  LOCAL  DEFAULT    2 $d

    11: 50010012     0 NOTYPE  LOCAL  DEFAULT    2 ADD

    12: 50008000     0 NOTYPE  LOCAL  DEFAULT    1 $a

    13: 50008004     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_end

    14: 50010016     0 NOTYPE  GLOBAL DEFAULT  ABS _bss_end__

    15: 50010016     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start__

    16: 50008004     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_start

    17: 50010016     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_end__

    18: 50008000     0 NOTYPE  GLOBAL DEFAULT    1 _start

    19: 50010016     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start

    20: 50010018     0 NOTYPE  GLOBAL DEFAULT  ABS __end__

    21: 50010016     0 NOTYPE  GLOBAL DEFAULT  ABS _edata

    22: 50010018     0 NOTYPE  GLOBAL DEFAULT  ABS _end

    23: 50010004     0 NOTYPE  GLOBAL DEFAULT    2 __data_start


No version information found in this file.

Attribute Section: aeabi

File Attributes

  Tag_CPU_arch: v4

  Tag_ARM_ISA_use: Yes


(3) equ 伪指令


equ 伪指令介绍 : 

-- 伪指令作用 : 该指定作用是定义常量;

-- 代码示例 : 


.text
.global _start
_start:

@定义一个宏变量
.equ DA, 0x68

@将 DA 值赋值给 r0 寄存器
mov r0, #DA


(4) align 伪指令

align 伪指令介绍 : 

-- 伪指令作用 : 标明数据对齐;


对齐代码示例 : 

-- 含有对齐的代码 : 


.data	@定义数据变量
hello:	@标明变量地址, 字符串变量
.ascii 'Hello World !'
bh:	@标明变量地址, byte 变量
.byte 0x1
ADD:	@标明变量地址, word 变量
.word 0xff

.text
.global _start
_start:

@定义一个宏变量
.equ DA, 0x68

@将 DA 值赋值给 r0 寄存器
mov r0, #DA


-- 不含对齐的代码 : 


.data	@定义数据变量
hello:	@标明变量地址, 字符串变量
.ascii 'Hello World !'
.align 4
bh:	@标明变量地址, byte 变量
.byte 0x1
ADD:	@标明变量地址, word 变量
.word 0xff

.text
.global _start
_start:

@定义一个宏变量
.equ DA, 0x68

@将 DA 值赋值给 r0 寄存器
mov r0, #DA


代码 elf 内容对比 : 这里省略大部分, 只给出内存对应地址, 查看对齐内容;

-- 没有对齐的代码 : 0x50010011 明显不能被 4 整除;


-- 对齐的代码 : 0x50010020 可以被4整除, 此时已经进行了对齐;


3. 操作类伪指令

(1) ldr 伪指令

机器码 shifter_operand 段解析 : 

-- 段解析 : 其中 4 位存放位移值, 8 位存放数值, 因此 立即数不能超过 8位, 最大 0xFF;

-- 缺陷 : 无法使用 大的数字;

-- 示例 : 


.text
.global _start
_start:

mov r0, #0xFFF

-- 编译错误 : 



octopus@octopus:~/arm/demo$ make
arm-linux-gcc -g -o start.o -c start.S
start.S: Assembler messages:
start.S:5: Error: invalid constant (fff) after fixup
make: *** [start.o] 错误 1


ldr 伪指令 : 

-- 作用 : 可以 向寄存器中赋值 大立即数;

-- 语法格式 : 'ldr r0, =0xFFF', 注意 不使用 # , 使用 = 后面加上立即数;

-- 代码示例 : 此时能编译成功, 0xfff 被赋值给 r0 寄存器;


.text
.global _start
_start:

ldr r0, =0xFFF

-- 反汇编 elf 代码 : 


octopus@octopus:~/arm/demo$ arm-linux-objdump -S -D start.elf 


start.elf:     file format elf32-littlearm


Disassembly of section .text:


50008000 <_start>:

.text

.global _start

_start:


ldr r0, =0xFFF

50008000: e51f0004 ldr r0, [pc, #-4] ; 50008004 <_start+0x4>

50008004: 00000fff .word 0x00000fff

Disassembly of section .debug_aranges:


... ...


-- 分析反汇编代码 : '50008000: e51f0004  ldr r0, [pc, #-4] ; 50008004 <_start+0x4>' 代码表明 ldr r0, =0xFFF 是使用 ldr 读取内存指令, 从 pc - 4 地址上读取该地址存储的值, '50008004: 00000fff  .word 0x00000fff'  表明 系统将 0xFFF 定义在了 pc -4 内存地址中;


(2) nop 伪指令

nop 伪指令 : 

-- 作用 : 进行延时, 在一些对时序要求较高的程序中, 使用该指令进行一个时钟的延时;

-- 代码示例 : 


.text
.global _start
_start:

nop

-- 反汇编 : nop 伪指令执行了 'mov r0, r0' 这个无意义的操作;


octopus@octopus:~/arm/demo$ arm-linux-objdump -S -D start.elf 

start.elf:     file format elf32-littlearm

Disassembly of section .text:

50008000 <_start>:
.text
.global _start
_start:

nop
50008000:	e1a00000 	nop			(mov r0,r0)
Disassembly of section .debug_aranges:

... ...


三. 协处理器访问指令

1. 协处理器简介


协处理器简介 : 

-- 作用 : 执行特定处理任务, 减轻处理器负担;

-- 数学协处理器 : 主要进行数字处理;

-- 协处理器支持 : ARM 芯片最多支持 16 个协处理器, 最重要的协处理器 是 CP15;


CP15 协处理器作用 : CP15 是系统控制寄存器, 通过这些寄存器, 配置与控制 缓存, MMU, 保护系统, 时钟模式 和 其它系统参数;

-- 如何访问 CP15 : 通过访问 CP15 中的寄存器控制上面的参数, CP15 提供了 16 组寄存器;

-- 文档 : 

2. 协处理器访问指令

mcr 指令解析 : 详情见 ARM11 文档, P145, 3.2;

-- 作用 : 将本地寄存器中的数据 赋值给 CP15 的寄存器;

-- 语法格式 : 'MCR{cond} P15,,,,,';

-- 语法解析 : CRn 表示 CP15 寄存器属于哪一组, CRm 也是组名;

-- 代码示例 : 


.text
.global _start
_start:

@'MCR{cond} P15,,,,,'
@读取 MainID 寄存器
mcr p15, 0, r0, c0, c0, 0


-- 文档截图 : 


-- CP15 寄存器访问 : 如果读取 MainID 寄存器, 就取前面的哪些 CRn Op1 CRm Op2 等参数;


[1] [2] [3]
关键字:ARM  汇编  伪指令  协处理器  访问指令 引用地址:【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

上一篇:基于WINCE6.0+S3C2443的camera驱动
下一篇:【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)

推荐阅读最新更新时间:2024-11-13 16:48

ARM汇编进阶
接触嵌入式以来,汇编来来回回学了好几遍,感觉还是有几个地方不清楚,所以在这里做一下总结,基本的非常简单的指令就不多余介绍了,主要分享一些个人觉得虽然微不足道,但是对于理解ARM汇编有帮助的一些知识 在这里一定要说一下,刚开始学的时候步入了一个大坑,我以为我学的是ARM汇编,后来了解到了,原来是GNU汇编,怪不得我有些问题去网上找的时候迷迷糊糊的,直到最近才纠正过来 所以首先就是介绍一下这两种汇编有什么区别 ARM汇编与GNU汇编区别 ARM汇编开发,有两种开发方式,一种是使用ARM汇编,一种是使用ARM GNU汇编。 两种汇编开发,使用的汇编指令是完全一样的。 区别是宏指令,伪指令,伪操作不一样。 有上述区
[单片机]
<font color='red'>ARM</font><font color='red'>汇编</font>进阶
Arm推出新一代旗舰CPU、GPU和NPU
Arm宣布推出用于旗舰型手机的新款处理器IP系列:Cortex-X1 CPU,Cortex-A78 CPU,Mali-G78 GPU和Ethos-N78神经网络处理器(NPU)。 Arm表示,作为Arm定制化项目的一部分,Cortex-X1是迄今为止功能最强大的Cortex处理器,其峰值性能比当前的Cortex-A77 CPU高出30%,与刚刚发布的Cortex-A78相比,单线程整数性能提高了22%。 Cortex-X1与Cortex-A78的差异 Arm-Cortex-X1“这种短的高性能爆发产品最适合设备的快速响应,为智能手机和大屏幕设备提供了迄今为止最高的性能,” Arm表示,“此外,Cortex-X1与Co
[手机便携]
<font color='red'>Arm</font>推出新一代旗舰CPU、GPU和NPU
高通采ARM架构64位AP量产需至下半年
安谋(ARM)公布处理器权利金营收仅成长3%,该公司指称,是受存货调整因素影响。据SeekingAlpha网站报导,高通(Qualcomm)采ARM架构的64位元移动应用处理器(AP)最快2014年下半量产,该期间将让推出新产品的英特尔(Intel)抢走一定市场。 安谋营收成长主要来自授权金(licensing fee),在2014年第1季,安谋新增6家授权公司共26项处理器授权,主要是采64位元ARM架构的苹果(Apple)A7处理器表现极佳,多数公司因而纷纷开始采用ARM架构。 另外,高通推出的多款64位元AP,也与过去32位元处理器不同,分别采用安谋Cortex A53或A57 64位元核心,凸显出处理器制造
[手机便携]
ARM的新CPU和GPU核能否冲击英特尔老巢?
集微网消息(文/艾檬)在连续创造惊人的数字之后,ARM的目光更为长远。据最新数据显示,截止2017年底基于Arm的芯片出货量已达1200亿片,约占整体市场四成份额。Arm资深市场营销总监Ian Smythe表示,到目前为止基于Arm的芯片出货量应已突破1300亿,未来将迈向2000亿。2035年预计将有一万亿的互联设备,而5G、AI、安全、全计算等技术将大行其道,以为用户提供更自由更互连的浸入式体验。基于此Arm IP产品线再添生力军,在CPU和GPU层面均实现跃升,除着力渲染可将智能手机实现PC性能之外,染指笔记本电脑市场的野心愈加明晰。 Cortex-A76的野心 去年Arm发布的Cortex-A75针对AI和ML能力进行了特
[手机便携]
CPU漏洞惊动美国政府:Intel/ARM/微软/谷歌集体遭质疑
   Intel 等厂家CPU处理器曝出的两大高危漏洞让整个行业风中凌乱,美国政府也对 Intel 、 ARM 、微软、Google、亚马逊等巨头的做法提出了质疑。下面就随嵌入式小编一起来了解一下相关内容吧。   其实早在2017年6月份, Intel 等行业巨头就被告知了漏洞的存在,然后按照行业惯例,波及的主要企业开始秘密联合起来,在暗中开始调查修复。   据说,巨头们原计划在今年1月9日正式向全球通告漏洞情况,但提前被媒体捅了出来,集体措手不及。   不过从目前的情况看,即便等到1月9日,漏洞也不可能及时修复,恐慌仍然不可避免。   对于将如此可怕漏洞隐瞒长达半年之久,最终导致行业一片混乱的状况,美国众议院也看不下去了,在一
[嵌入式]
ARM 浮点小知识
ARM浮点运算 一: ARM实现浮点运算的类型 有三种方法实现ARM的浮点运算,而且通常这三种方法在ARM与其编译器的发展时间 上是串行的. (1): Linux Kernel 的 Floating point emulation,即内核完成浮点模拟(用户模式代码通过系统调用由内核完成); (2): gcc 编译器带的libc实现软件浮点运算; (3): ARM硬件浮点运算,由ARM协处理器完成真正的硬件浮点运算(旧的ARM不支持). 二: GNU gcc 编译器浮点编译选项(加入CFLAGS变量中) (1): -mfloat-abi=soft == -msoft-float 由g
[单片机]
高通服务器芯片负责人离职:ARM难挑战Intel x86霸权
  上周,彭博社援引知情人消息称, 高通 准备放弃开发面向数据中心的企业级 服务器 芯片。下面就随嵌入式小编一起来了解一下相关内容吧。   来自Axios的最新报道称, 高通 服务器 芯片负责人Anand Chandrasekher已经从公司离职,虽然 高通 拒绝置评,但Anand的走人无形中证实了高通对 服务器 业务的调整非假。   目前,高通服务器芯片的的主打是Centriq 2400家族,系列含三款,最小40核,最大48核。Centriq 2400基于三星10nm工艺打造,采用ARM v8架构的自研Falkor CPU核心,最高设计为60MB三缓,旗舰2460单片的价格是1995美元。   高通称,Centriq 24
[嵌入式]
gd32的全系列芯片有哪些?
近年来,在嵌入式市场不断发展的背景下,越来越多的芯片公司开始进入嵌入式领域,并推出了一系列嵌入式芯片产品。而***厂商嘉应(Gray-Chip)的GD32系列芯片就是其中的一员,采用了ARM Cortex-M3内核,并且整个系列不断扩充中。 那么,GD32系列芯片究竟都有哪些呢?下面我们就来一一介绍。 1、GD32F107系列芯片 GD32F107系列芯片是嘉应的第一代Cortex-M3内核MCU,也是嘉应MCU家族中最基础的一款芯片。目前主要是应用在家用电器、医疗设备、工控仪器和仪表设备、车载娱乐等领域。 2、GD32F103系列芯片 GD32F103系列芯片和STM32F103系列芯片外形是一样的,但是嘉应的芯片在价格上相对更
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved