当前位置:   article > 正文

ARM汇编常用指令汇总_dcd start

dcd start

ARM常见汇编指令的汇总

1.EQU

赋值

;将0x40013800 赋值给变量USART1_BASE(寄存器地址)
USART1_BASE         EQU    0x40013800 
  • 1
  • 2

2.AREA

用法:AREA sectionname{,attr}{,attr}…

sectionname:要指定的段名

attr:段属性

属性枚举

ALIGN=expression

默认情况下,ELF 段在四字节边界上对齐。expression 可以拥有 0 到 31 的任何整数。段在 2expression 字节边界上对齐。例如,如果 expression 是 10,则段是在 1KB 边界上对齐。这与 ALIGN 命令所指定的方式并不相同。

ASSOC=section

section 指定一个关联的 ELF 段。sectionname必须包含在含有 section 的任何链接中。

CODE

包含机器指令。READONLY 是默认值。

COMDEF

是一个公共段定义。这是包含代码或数据的 ELF 段。其必须等同于与其它源文件中拥有相同名称的任何其它段须是同一段。拥有相同名称的同一 ELF 段在存储器的相同段中被链接程序覆盖。如果有任何段不同,则链接程序产生一个警告,并且不覆盖这些段。请参阅RealView 编译工具 2.0 版链接程序和实用程序指南 中的链接程序 一章。

COMMON

是公共数据段。不能在其中定义任何代码或数据。其由
链接程序初始化为零。拥有相同名称的所有公共段在存
储器的相同段中被链接程序覆盖。它们并不都需要具有
相同的大小。链接程序按每个名称的最大公共段的需要
分配空间。

DATA

包含数据但不含指令。READWRITE 是默认值。

NOALLOC

表示在目标系统上没有为此 AREA 分配存储器。

NOINIT

表示数据段是未初始化的或初始化为零。其只包含零初始化的空间保留命令 SPACE 或 DCB、DCD、DCDU、DCQ、DCQU、DCW 或 DCWU。可以决定在链接时 AREA 是未初始化的还是零初始化的(请参阅RealView 编译工具 2.0 版链接程序和实用程序指南 中的链接程序 一章)。

READONLY

表示不能写到此段中。这是代码区域的默认情况。

READWRITE

表示可以读和写此段。这是数据区域的默认情况

3.DCD

为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。

    AREA RESET, DATA, READONLY 
    DCD    MSP_TOP            ;初始化主堆栈 
    DCD    Start              ;复位向量 
    DCD    NMI_Handler        ;NMI Handler 
    DCD    HardFault_Handler  ;Hard Fault Handler 
    DCD    0                   
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    0 
    DCD    SysTick_Handler    ;SysTick Handler 
    SPACE  20                 ;预留空间20字节
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

4. ENTRY

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

    AREA |.text|, CODE, READONLY 
    ;主程序开始 
    ENTRY                            
    ;指示程序从这里开始执行 
  • 1
  • 2
  • 3
  • 4

5. START

一个标号,标志程序的入口,程序加载到内存之后CS,IP会指向这个标号,从START指向的指令开始运行。

最后要配合END使用

6. LDR

格式:LDR{条件} 目的寄存器 <存储器地址>

1、 ldr pc, =label

即把label后的数据或者指令的运行地址赋值为pc。运行地址 = 链接地址 + 这些数据或指令相对于程序起始地址的偏移。

2、 ldr pc, label

把label后的数据或者指令内容赋值给pc。

    ldr    r0, =RCC_CR 
    ldr    r1, [r0] 
  • 1
  • 2

7. STR

一般跟LDR配合使用。用法:STR r1,[r2] ; 将r1中的值存到r2所指定的地址中

    ldr    r0, =RCC_CR 
    ldr    r1, [r0] 
    orr    r1, #Bit16 
    str    r1, [r0] 
  • 1
  • 2
  • 3
  • 4

8.BEQ

CPSR的Z标识位为1时,程序跳转到beq 后的标签处

;等待外部晶振就绪
ClkOk           
    ldr    r1, [r0] 
    ands   r1, #Bit17 
    beq    ClkOk 
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

9.MSR/MRS

MRS,状态寄存器传送至通用寄存器类指令,将状态寄存器的内容传送至通用寄存器。

格式:MRS{<条件码>}Rd,CPSR}SPSR

MSR,通用寄存器传送至状态寄存器传送指令,将通用寄存器的内容传送至状态寄存器。

格式:MSR{<条件码>CPSR_f|SPSR_f,<#immed_8r>

    ;切换成用户级线程序模式 
    ldr    r0, =PSP_TOP                   
    ;初始化线程堆栈 
    msr    psp, r0 
    mov    r0, #3 
    msr    control, r0 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

10.B/BL/BX

三者都是程序跳转,但B是纯跳转,不会返回,BL跳转执行完后会返回原位置,用于执行子程序。BX跳转的目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。

格式都为:B/BL/BX 目标地址

bx lr;表示子程序的返回
  • 1

11.PUSH/POP

将数据压入/弹出栈

;相当于将r0,r1, r2, r3寄存器作为参数传入子程序的堆栈
push   {r0 - r3} 
...
;清除子程序堆栈
pop    {r0 - r3} 
  • 1
  • 2
  • 3
  • 4
  • 5

逻辑运算符

ARM汇编:数据处理指令集

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/219899
推荐阅读
相关标签
  

闽ICP备14008679号