ARM汇编指令

发布者:MysticalGarden最新更新时间:2024-07-26 来源: cnblogs关键字:ARM  汇编指令  地址空间 手机看文章 扫描二维码
随时随地手机看文章

 

RegList RLIST   {R0-R5,R8,R10} ;将寄存器列表名称定义为RegList,可

 

在ARM指令LDM/STM中通过该名称访

 

问寄存器列表。

 

二、数据定义(Data Definition)伪指令

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

 

1、  DCB

 

语法格式:

 

标号     DCB 表达式

 

DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为0~255的数字或字符串。DCB也可用“=”代替。

 

使用示例:

 

Str DCB “This is a test!”  ;分配一片连续的字节存储单元并初始化。

 

2、  DCW(或DCWU)

 

语法格式:

 

标号     DCW(或DCWU)   表达式

 

DCW(或DCWU)伪指令用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。。

 

用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格半字对齐。

 

使用示例:

 

DataTest    DCW     1,2,3  ;分配一片连续的半字存储单元并初始化。

 

3、  DCD(或DCDU)

 

语法格式:

 

标号     DCD(或DCDU)   表达式

 

DCD(或DCDU)伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用“&”代替。

 

用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格字对齐。

 

使用示例:

 

           DataTest   DCD     4,5,6  ;分配一片连续的字存储单元并初始化。

 

4、  DCFD(或DCFDU)

 

语法格式:

 

标号     DCFD(或DCFDU) 表达式

 

DCFD(或DCFDU)伪指令用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个双精度的浮点数占据两个字单元。

 

用DCFD分配的字存储单元是字对齐的,而用DCFDU分配的字存储单元并不严格字对齐。

 

使用示例:

 

FDataTest   DCFD    2E115,-5E7 ;分配一片连续的字存储单元并初始化为指定的

 

双精度数。

 

5、  DCFS(或DCFSU)

 

语法格式:

 

标号     DCFS(或DCFSU) 表达式

 

DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据一个字单元。

 

用DCFS分配的字存储单元是字对齐的,而用DCFSU分配的字存储单元并不严格字对齐。

 

使用示例:

 

FDataTest   DCFS    2E5,-5E-7  ;分配一片连续的字存储单元并初始化为指定的

 

单精度数。

 

6、  DCQ(或DCQU)

 

语法格式:

 

标号     DCQ(或DCQU)   表达式

 

DCQ(或DCQU)伪指令用于分配一片以8个字节为单位的连续存储区域并用伪指令中指定的表达式初始化。

 

用DCQ分配的存储单元是字对齐的,而用DCQU分配的存储单元并不严格字对齐。

 

使用示例:

 

DataTest    DCQ     100          ;分配一片连续的存储单元并初始化为指定的值。

 

7、  SPACE

 

语法格式:

 

标号     SPACE   表达式

 

SPACE伪指令用于分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。SPACE也可用“%”代替。

 

使用示例:

 

DataSpace   SPACE   100          ;分配连续100字节的存储单元并初始化为0。

 

8、  MAP

 

语法格式:

 

MAP      表达式{,基址寄存器}

 

MAP伪指令用于定义一个结构化的内存表的首地址。MAP也可用“^”代替。

 

表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。

 

MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。

 

使用示例:

 

MAP 0x100,R0                    ;定义结构化内存表首地址的值为0x100+R0。

 

9、  FILED

 

语法格式:

 

标号     FIELD   表达式

 

FIELD伪指令用于定义一个结构化内存表中的数据域。FILED也可用“#”代替。

 

表达式的值为当前数据域在内存表中所占的字节数。

 

FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表。MAP伪指令定义内存表的首地址,FIELD伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。

 

注意MAP和FIELD伪指令仅用于定义数据结构,并不实际分配存储单元。

 

使用示例:

 

MAP     0x100                    ;定义结构化内存表首地址的值为0x100。

 

             A       FIELD   16      ;定义A的长度为16字节,位置为0x100

 

             B       FIELD   32      ;定义B的长度为32字节,位置为0x110

 

S       FIELD   256              ;定义S的长度为256字节,位置为0x130

 

三、 汇编控制(Assembly Control)伪指令

汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下4条:

 

1、  IF、ELSE、ENDIF

 

语法格式:

 

IF   逻辑表达式

 

     指令序列1

 

ELSE

 

     指令序列2

 

ENDIF

 

IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是否执行某个指令序列。当IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。其中,ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面的指令。

 

IF、ELSE、ENDIF伪指令可以嵌套使用。

 

使用示例:

 

GBLL    Test                    ;声明一个全局的逻辑变量,变量名为Test

 

……

 

IF  Test = TRUE

 

指令序列1

 

ELSE

 

指令序列2

 

ENDIF

 

2、  WHILE、WEND

 

语法格式:

 

WHILE    逻辑表达式

 

     指令序列

 

WEND

 

WHILE、WEND伪指令能根据条件的成立与否决定是否循环执行某个指令序列。当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。

 

WHILE、WEND伪指令可以嵌套使用。

 

使用示例:

 

GBLA    Counter                 ;声明一个全局的数学变量,变量名为Counter

 

Counter SETA        3           ;由变量Counter控制循环次数

 

……

 

WHILE   Counter < 10

 

指令序列

 

WEND

 

3、  MACRO、MEND

 

语法格式:

 

$标号    宏名    $参数1,$参数2,……  

 

指令序列

 

MEND

 

MACRO、MEND伪指令可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码。其中,$标号在宏指令被展开时,标号会被替换为用户定义的符号,

 

宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。

 

    宏指令的使用方式和功能与子程序有些相似,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现场,从而增加了系统的开销,因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序。

 

    包含在MACRO和MEND之间的指令序列称为宏定义体,在宏定义体的第一行应声明宏的原型(包含宏名、所需的参数),然后就可以在汇编程序中通过宏名来调用该指令序列。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数。

 

MACRO、MEND伪指令可以嵌套使用。

 

4、  MEXIT

 

语法格式:

 

MEXIT

 

MEXIT用于从宏定义中跳转出去。

 

四、其他常用的伪指令

还有一些其他的伪指令,在汇编程序中经常会被使用,包括以下13条:

 

1、  AREA

 

语法格式:

 

AREA 段名    属性1,属性2,……

 

AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“|”括起来,如|1_test|。

 

属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下:

 

●CODE属性:用于定义代码段,默认为READONLY。

 

●DATA属性:用于定义数据段,默认为READWRITE。

 

●READONLY属性:指定本段为只读,代码段默认为READONLY。

 

●READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。

 

●ALIGN属性:使用方式为ALIGN 表达式。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐方式为2表达式次方。

 

●COMMON属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。

 

一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。

 

使用示例:

 

AREA    Init,CODE,READONLY

 

指令序列

 

;该伪指令定义了一个代码段,段名为Init,属性为只读

 

2、  ALIGN

 

语法格式:

 

ALIGN    {表达式{,偏移量}} 

 

ALIGN伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式|。其中,表达式的值用于指定对齐方式,可能的取值为2的幂,如1、2、4、 8、16等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为:2的表达式次幂+偏移量。

 

使用示例:

 

AREA    Init,CODE,READONLY,ALIEN=3   ;指定后面的指令为8字节对齐。

 

指令序列

 

END

 

3、  CODE16、CODE32

 

语法格式:

 

CODE16(或CODE32)

 

CODE16伪指令通知编译器,其后的指令序列为16位的Thumb指令。

 

CODE32伪指令通知编译器,其后的指令序列为32位的ARM指令。

 

若在汇编源程序中同时包含ARM指令和Thumb指令时,可用CODE16伪指令通知编译器其后的指令序列为16位的Thumb指令,CODE32伪指令通知编译器其后的指令序列为32位的ARM指令。因此,在使用ARM指令和Thumb指令混合编程的代码里,可用这两条伪指令进行切换,但注意他们只通知编译器其后指令的类型,并不能对处理器进行状态的切换。

 

使用示例:

 

AREA    Init,CODE,READONLY

 

……

 

CODE32              ;通知编译器其后的指令为32位的ARM指令

 

LDR R0,=NEXT+1    ;将跳转地址放入寄存器R0

 

BX  R0              ;程序跳转到新的位置执行,并将处理器切换到Thumb工作状态

 

……

 

CODE16              ;通知编译器其后的指令为16位的Thumb指令

 

NEXT    LDR R3,=0x3FF 

 

……

 

END                 ;程序结束

 

4、  ENTRY

 

语法格式:

 

ENTRY

 

ENTRY伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。

 

使用示例:

 

AREA    Init,CODE,READONLY

 

ENTRY                                  ;指定应用程序的入口点

 

……

 

5、  END

 

语法格式:

 

END

 

END伪指令用于通知编译器已经到了源程序的结尾。

 

使用示例:

 

AREA    Init,CODE,READONLY

 

……

 

END                                    ;指定应用程序的结尾

 

6、  EQU

 

语法格式:

 

名称     EQU 表达式{,类型}

 

EQU伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define。其中EQU可用“*”代替。

 

名称为EQU伪指令定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有以下三种类型:

 

CODE16、CODE32和DATA

 

使用示例:

 

Test    EQU 50                        ;定义标号Test的值为50

 

Addr EQU 0x55,CODE32                ;定义Addr的值为0x55,且该处为32位的ARM

 

指令。

 

7、  EXPORT(或GLOBAL)

 

语法格式:

 

EXPORT       标号{[WEAK]}

 

EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。EXPORT可用GLOBAL代替。标号在程序中区分大小写,[WEAK]选项声明其他的同名标号优先于该标号被引用。

 

使用示例:

 

AREA    Init,CODE,READONLY

 

EXPORT      Stest               ;声明一个可全局引用的标号Stest

 

……

 

END                

 

8、  IMPORT

 

语法格式:

 

IMPORT       标号{[WEAK]}

 

IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。

 

标号在程序中区分大小写,[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0,若该标号为B或BL指令引用,则将B或BL指令置为NOP操作。

 

使用示例:

 

AREA    Init,CODE,READONLY

[1] [2] [3] [4] [5]
关键字:ARM  汇编指令  地址空间 引用地址:ARM汇编指令

上一篇:uboot 学习 Makefile分析
下一篇:u-boot-1.3.4 移植到S3C2440 (带有某些解析)

推荐阅读最新更新时间:2026-03-03 12:45

arm驱动linux设备地址映射到用户空间
linux设备地址映射到用户空间》涉及内核驱动函数二个,内核结构体二个,分析了内核驱动函数二个;可参考的相关应用程序模板或内核驱动模板二个,可参考的相关应用程序模板或内核驱动四个 一、问题描述:一般情况下,用户空间是不可能也不应该直接访问设备的,但是,设备驱动程序中可实现mmap()函数,这个函数可使用户空间直接访问设备的物理地址。 1、mmap()函数工作原理:mmap()实现了这样的一个映射过程,它将用户的内存空间的一般内存(准确来说是执行mmap进程的映射区域内存)与设备内存关联,当用户访问用户空间的这段地址范围时,实际上会转化为对设备的访问(linux上一切皆文件)。 文件内存映射原理图示 a 2、mmap优点:1、
[单片机]
<font color='red'>arm</font>驱动linux设备<font color='red'>地址</font>映射到用户<font color='red'>空间</font>
N76E003 Keil设置芯片使用FLASH的地址空间
这篇文章讲的是如何设置芯片使用FLASH的大小,比如新塘的芯片N76E003的FLASH大小只有18K,但是我需要一些空间存储一些别的信息,掉电不丢失,那么我就要把FLASH空间分成两部分,第一部分用作存储代码,第二部分用作存储信息。如果你不设置,默认工程FLASH全部空间都是存储代码的,擦除也是擦除整个芯片。如果要将FLASH分为两部分我这里提供两个思路。 第一:设置擦除使用扇区,计算程序代码大小,将所需要的数据放入代码占用空间之后(最好用最后的地址空间)。 首先设置只擦除使用扇区,如下图,设置Setttings选项时需要Nu-Link连接到目标板,勾选Erase Used Sectors。 之后是计算程序代码大小,
[单片机]
N76E003 Keil设置芯片使用FLASH的<font color='red'>地址</font><font color='red'>空间</font>
ARM 汇编指令集 特点5:ARM 多级指令流水线
1、为增加处理器指令流 的速度,ARM使用多级流水线。 就是举个例子: mov r1,#0 ,这条指令 分几个人做,一个人从存储器取指令,解码指令中用到的寄存器,寄存器运算。 这样三步 :如果一个人做,需要分三步,浪费时间,ARM 就是分开处理,这样就能节省时间,加快处理速度。S5PV210 就有13级流水线,STM32F103 就有3级流水线! 流水线:缺点 一旦被打断,就会影响处理速度! 流水线:中断处理,返回的时候,PC 需要+8 ,或者-8, 3级流水线是相差 8个字节! 详细请百度!
[单片机]
嵌入式开发学习(4)<ARM汇编指令集详解>
数据传送指令:   MOV 两个寄存器之间传递。例 MOV r1,r0,将寄存器r0中的内容赋值给r1。   MVN 同MOV用法一样,区别是MOV是原值传递,而MVN是按位取反后传递。 算数运算指令:   ADD SUB RSB ADC SBC RSC 逻辑指令:   AND ORR EOR BIC   BIC的用法:BIC r0,r1,#0x1f,将r1中的数的bit0到bit4清零后赋值给r0;为什么是bit0到bit4呢,这个是由#0x1f来决定,#0x1f有五个bit位是1。如写成#0xf,就有四个bit位是0。 比较指令:   CMP CMN TST TEQ 比较指令用来比较两个寄存器中的数。特点:比较指令不用后加S后
[单片机]
如何判断外设使用的地址空间
S3C2410/S3C2440的存储控制器有如下特性: 1.每个BANK的地址空间为128MB,总共1GB(8 BANKs); 2.可编程控制总线位宽(8/16/32-bit),不过BANK0只能选择两种位宽(16/32-bit); 3.总共8个BANK,BANK0~BANK5可以支持外接ROM、SRAM等,BANK6~BANK7除可以支持ROM、SRAM外,还支持SDRAM等。 4.BANK0~BANK6共7个BANK的起始地址是固定的。 5.BANK7的起始地址可编程选择。 S3C2410/S3C2440对外引出的27根地址线ADDR0~ADDR26的访问范围只有128MB,CPU还引出了8根片选信号n
[单片机]
如何判断外设使用的<font color='red'>地址</font><font color='red'>空间</font>
S3C2440地址空间的分配与启动
一、S3C2440地址空间的分配 1. s3c2440A 的存储器控制器有以下特性: 大小端(通过软件选择) 地址空间:每个bank有128M 的字节(总共1G字节/8个banks) 可编程的访问位宽,bank0(16/32 位),其他bank(8/16/32 位) 共8个存储器banks 6个是ROM,SRAM 等类型存储器bank 2个是可以作为ROM、SRAM、SDRAM 等存储器bank 7个固定的存储器bank起始地址 最后一个bank 的起始地址可调整 最后两个bank 大小可编程 所有存储器bank的访问周期可编程 总线访问周期可通过插入外部wait来延长 支持SDRAM 的自刷新和掉电模式 2. 寻
[单片机]
lpc1788的地址空间分配
lpc1788的地址空间分配 图 1 图2 参考 LPC177x_178x_UM_SimpCHN
[单片机]
lpc1788的<font color='red'>地址</font><font color='red'>空间</font>分配
汇编指令ARM体系机构)
常用汇编指令 1、ARM状态下的通用寄存器和程序计数器 (1)ARM状态下各工作模式使用的寄存器 (2)当前程序状态寄存器(CPSR) N:结果是否为负数 Z:运算结果是否为0 C:进位/借位/移位溢出 V:溢出标志(Overflow) I:中断禁止位 F:快中断禁止位 T:CPU状态位;置位时,CPU处于Thumb状态;否则处于ARM状态。 M4~M0:工作模式位 中断禁止位:I位和F位属于中断禁止位。它们被置位时,IRQ中断、FIQ中断分别被禁止。 2、ARM指令在机器中的表示格式是用32位的二进制数表示。 ARM中有一条指令为:ADDEQS R0,R1,#8; ARM指令分为5个域: 第1个域:4位 的条件码
[单片机]
<font color='red'>汇编指令</font>(<font color='red'>ARM</font>体系机构)
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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