GET通经常使用于包括定义常量的源文件。

比如:GET 2440addr.inc

用AREA定义一个段。ENTRY用于指定程序的入口点,END用于告诉汇编器源文件已经结束。

比如:

AREA init, CODE, READONLY

ENTRY

......

END

EQU用于定义常量,提醒:在每条ARM指令前必须有空格。可是用EQU定义常量时,必须顶格写,否则编译器报错。

LTORG用于声明一个文字池,所谓文字池就是一个数据缓存区。

ALIGN伪操作通过调整地址指针,使得当前地址满足一定的对齐方式。在ARM代码中要求地址标号是字对齐的。





MACRO和MEND伪操作用于宏定义。语法例如以下:

MACRO

{$label} MacroName {$parameter1} {$parameter2} ...

;这里加入自己的代码

MEND

当中:$label代表一个标号,在宏展开时。替换成对应的值。

MacroName用于指定宏名称。

$parameter代表要传递的參数。

{}中的项表示是可选的。

比如:

MACRO

$label HANDLER $HandleAddr

$label

sub sp, sp, #4

stmfd sp!, {r0}

ldr r0, =$HandleAddr

ldr r0, [r0]

str r0, [sp, #4]

ldmfd sp!, {r0, pc}

MEND

在程序中能够通过例如以下方式调用该宏:HandlerIRQ  HANDLER  HandleIRQ

宏展开结果例如以下:

HandlerIRQ

sub sp, sp, #4

stmfd sp!, {r0}

ldr r0, =HandleIRQ

ldr r0, [r0]

str r0, [sp, #4]

ldmfd sp!, {r0, pc}



MAP用于定义内存表的首地址,当中MAP能够用^表示。

FIELD用于定义一个内存表中的数据域,当中FIELD能够用#表示。用法例如以下所看到的:

_ISR_STARTADDRESS EQU0X33FFFF00

MAP   _ISR_STARTADDRESS

HandleReset  FIELD 4
;HandleReset的地址范围为0X33FFFF00~0X33FFFF03

HandleUndef FIELD4
;HandleUndef的地址范围为0X33FFFF04~0X33FFFF07

HandleSWI FIELD4
;HandleSWI的地址范围为0X33FFFF08~0X33FFFF0B

HandlePabrt FIELD4
;HandlePabrt的地址范围为0X33FFFF0C~0X33FFFF0F

HandleDabrt FIELD4
;HandleDabrt的地址范围为0X33FFFF10~0X33FFFF13

以上定义内存表的方式等价于例如以下方式:

_ISR_STARTADDRESS EQU 0X33FFFF00

^ _ISR_STARTADDRESS

HandleReset #4
;HandleReset的地址范围为0X33FFFF00~0X33FFFF03

HandleUndef #4
;HandleUndef的地址范围为0X33FFFF04~0X33FFFF07

HandleSWI #4
;HandleSWI的地址范围为0X33FFFF08~0X33FFFF0B

HandlePabrt #4
;HandlePabrt的地址范围为0X33FFFF0C~0X33FFFF0F

HandleDabrt #4
;HandleDabrt的地址范围为0X33FFFF10~0X33FFFF13

建立好上述内存表之后,能够从C源文件里通过例如以下方式訪问:

#define pISR_SWI (*(unsigned int*)(_ISR_STARTADDRESS+0x8))





ARM伪指令:中等范围的地址读取指令ADRL、大范围的地址读取指令LDR 比如:

ADRL R1, var1 ;表示把var1的地址读取到R1中去。

var1 DCD 5

LDR R1, =var1 ;表示把var1的地址读取到R1中去。

var1 DCD 5





DCD用于分配一块连续的内存单元,并用expr初始化:{label} DCD expr{,expr}...  
label代表所分配的内存单元的地址。

SPACE用于分配一块内存单元,并将其初始化为0:{label} SPACE expr
label代表内存块的起始地址,expr表示所要分配的内存字节数目

比如: zero SPACE 12    即分配12个字节长度的连续内存单元





ARM汇编程序的结构:

ARM源程序有下面几种类型:

*.s:汇编语言源文件

*.inc:被汇编源文件包括的文件

*.c:C语言源文件

*.h:头文件

编写汇编语言源文件的格式规范:

全部标号必须在一行的顶格书写

全部的指令均不能顶格书写。指令前应该有空格或Tab缩进

凝视内容由";"開始到此行结束

指令、寄存器能够所有为大写或者小写字母,但不能大写和小写字母混用

定义变量、常量时。其标志符必须在一行的顶格书写





经常使用汇编语言程序子模块实例:

<1>关闭看门狗定时器

WTCON EQU 0X53000000

LDR R0, =WTCON

MOV R1, #0

STR R1, [R0]

<2>内存数据复制:如果R1指向源数据块的起始地址,R2指向源数据块的结束地址。R3指向目的数据块的起始地址。

loop

LDR R0, [R1], #4

STR R0,[R3]. #4

CMP R1,R2

BCC loop

<3>批量载入与存储:初始化SDRAM。SMRDATA是在内存中定义的一个数据表。占领13个字(52字节)的空间;BWSCON是2440处理器的存储控制器寄存器的起始地址。

ADRL R0, SAMRDATA

LDMIA R0, {R1-R13}

LDR R0, = BWSCON

STMIA R0, {R1-R13}

<4>堆栈操作:堆栈初始化

FIQMODE EQU
0X11

IRQMODE EQU 0X12

SVCMODE EQU 0X13

MODEMASK EQU 0X1F

NOINT EQU 0XC0

_STACK_BASE_ADDRESS EQU 0X33FF8000





FIQStack EQU (_STACK_BASE_ADDRESS-0X0) ;0X33FF8000~

IRQStack EQU (_STACK_BASE_ADDRESS-0X1000) ;0X33FF7000~

SVCStack EQU (_STACK_BASE_ADDRESS-0X2800) ;0X33FF5800~





InitStacks

MRS R0, CPSR

BIC R0, R0, #MODEMASK

ORR R1, R0, #IRQMODE | NOINT

MSR CPSR_CXSF, R1;IRQMode

LDR SP, =IRQStack;IRQStack=0x33FF7000



ORR R1, R0, #FIQMODE | NOINT

MSR CPSR_C, R1;FIQMode

LDR SP, =FIQStack;FIQStack=0x33FF8000



BIC R0, R0, #MODEMASK | NOINT

ORR R1, R0, #SVCMODE

MSR CPSR_CXSF, R1;SVCMode

LDR SP, =SVCStack;SVCStack=0x33FF5800

MOV PC, LR

<5>实现查表功能:

MOV R9, #4

LDR R8, =DATATABLE

LDR R8, [R8,R9,LSL,#2]

DATATABLE DCD 0X10, 0X20, 0X30, 0X40, 0X50

DCD 0X60, 0X70, 0X80, 0X90, 0XA0

/**************************************************************/

在基于ARM处理器的裸机程序开发中,启动代码主要用于为执行用户程序准备主要的执行环境。

它主要实现下面功能:

<1>建立异常中断向量表

<2>初始化各种模式下的堆栈

<3>初始化硬件:包含

关闭看门狗

屏蔽全部中断

初始化时钟

初始化存储系统:NandFlash、NorFlash、SDRAM等

<4>初始化应用程序运行环境:代码的搬移和未初始化数据段ZI的清零。

一个ARM映像文件主要由RO、RW、ZI段构成。

<5>跳转到主程序(用户程序)运行。

ARM体系结构与编程-5的更多相关文章

  1. ARM体系结构与编程-3

    ARM存储系统:ARM中用于存储管理的系统控制协处理器CP15:包括16个32位寄存器,其编号为0到15.实际上对于某些编号的寄存器可能相应有多个物理寄存器. 訪问CP15寄存器的指令:MRC.MCR ...

  2. ARM体系结构与编程

    ARM处理器的7中执行模式:usr.fiq.irq.svc.abt.und.sys. ARM处理器共37个寄存器:31个通用寄存器(未备份寄存器R0-R7,在全部模式下指的都是同一个物理寄存器:备份寄 ...

  3. ARM体系结构与编程读书笔记——处理器的寄存器

    ARM处理器共有37个寄存器,其中包括: 31个通用寄存器,包括程序计数器(PC)在内,寄存器都是32位: 6个状态寄存器,这些寄存器都是32位的,目前只使用了其中12位: 通用寄存器 可以分为下面3 ...

  4. ARM体系结构与编程读书笔记——处理器的运行模式

    ARM处理器共有7种运行模式,如下表: 处理器模式 描述 用户模式(User, usr) 正常程序执行的模式 快速中断模式(FIQ, fiq) 用于高速数据传输和通道处理 外部中断模式(IRQ, ir ...

  5. ARM的体系结构与编程系列博客——ARM体系版本

    ARM体系版本前言 很多人都知道,ARM有许多版本,口中最长说的就是ARM7\ARM9\ARM11,诚然,这个的确是ARM处理器的版本,但绝对不是ARM的版本,其实ARM到迄今为止经历了6代版本,随着 ...

  6. ARM的体系结构与编程系列博客——ARM处理器系列介绍

    ARM处理器系列介绍 现在到了3月,过年过得过于舒服了.系列博客也停更了近半月,我果然是个慢(lan)性(gui)子,那么趁着到校的第一天晚上,就写一篇博客来继续我的系列博客了!众所周知,ARM处理器 ...

  7. ARM体系结构和汇编指令

    第一节 可编程器件的编程原理 1. 可编程器件的特点 1 . CPU在固定频率的时钟控制下节奏运行 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行 3 . 这些可以被CPU解 ...

  8. ARM体系结构简介

    ARM体系结构简介 新一代的ARM9处理器,能达到两倍ARM7的处理能力,它们的区别如下: ARM微处理器的工作状态(可切换): 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令 第二种为 ...

  9. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(2)- 寄存器

    1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加.异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AA ...

随机推荐

  1. 什么是WSDL

    WSDL定义 WSDL(Web Service Description Language) 指网络服务描述语言:是一种用来描述Web服务和说明Web服务通信的XML.WSDL用于描述WebServic ...

  2. google浏览器audits

    功能翻译 audits,审计 Audits help you identify and fix common problems that affect your site'sperformance,a ...

  3. DS博客作业——树

    DS博客作业--树 1.本周学习总结 1.思维导图 2.谈谈你对树结构的认识及学习体会. 在树这一章节,我们学习的是二叉树的算法. 树的构建:一种是直接给树的顺序存储结构的字符串,一种是通过先序遍历和 ...

  4. 简单使用jstl实现敏感字替换

    package com.ceshi; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; ...

  5. 【Luogu】P2221高速公路(线段树乱搞)

    题目链接 这题……我从一开始就想歪了qwq. 为了缅怀逝去的一小时我就把我的30分暴力思路放上来. 首先我们观察枚举的区间.假设我们要枚举的范围是1~5之间的四条路,为了方便我们把它们叫做abcd. ...

  6. LibreOJ2241 - 「CQOI2014」排序机械臂

    Portal Description 给出一个\(n(n\leq10^5)\)个数的序列\(\{a_n\}\),对该序列进行\(n\)次操作.若在第\(i\)次操作前第\(i\)小的数在\(p_i\) ...

  7. BZOJ1150 [CTSC2007]数据备份Backup 【堆 + 链表】

    题目 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的 ...

  8. bootstrap 事件shown.bs.modal用于监听并执行你自己的代码【写hostmanger关联部门遇到的问题及解决方法】

    背景:记录写hostmanger中用户下拉框关联部门遇到的问题及解决方法 问题:需求是展示页面展示用户所属的部门,点击修改按钮后,弹出对应的model,这个时候部门的select要默认选中用户所在的s ...

  9. hdu 2999 sg函数(简单博弈)

    Stone Game, Why are you always there? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/ ...

  10. 让旧浏览器支持HTML5新增标签

    首先我们使用JS进行标签创建,为HTML文件创建我们需要的这几个HTML5标签. 接下来,我们需要使用CSS进行这几个HTML5标签的样式控制,这是因为,通过这种方法创建的新标签,默认是行内元素.   ...