ARM工具介绍

 第9章 ARM汇编语言程序设计基础 章 汇编语言程序设计基础

ADS IDE(集成开发环境)
ARM应用软件的开发工具根据功能的不 同,可以分为编辑软件、编译软件、汇 编软件、链接软件、调试软件、嵌入式 实时操作系统、函数库、评估板,JTAG 仿真器以及在线仿真器等。目前有多家 公司可以提供以上不同类型的开发工具, 用户采用ARM处理器进行嵌入式系统开 发时,选择合适的开发工具可以加快开 发进度,节省开发成本。

ADS工具包的组成
ADS是ARM公司推出的集成开发工具包,是专 门用于ARM相关应用开发和调试的综合性软件。 目前常用的版本是1.2,在功能和易用性上比 早期的SDT都有提高,是一款功能强大又易于 使用的开发工具。ARM ADS包含有编译器、链 接器、CodeWarrior IDE、调试器、指令集模 拟器、ARM开发包和应用库等部分,可以用 ADS来开发、编译、调试采用包括C、C++和 ARM汇编语言编写的程序。

ADS工具包的组成
1. 编译器 ADS提供多种编译器,以支持ARM和Thumb指 令的编译。 2. 链接器 Armlink(ARM链接器)可以将编译得到的一个 或多个目标文件和相关的一个或多个库文件进 行链接,生成一个可执行文件,也可以将多个 目标文件部分链接成一个目标文件,以供进一 步的链接。

ADS工具包的组成
3. CodeWarrior IDE CodeWarrior IDE(集成开发环境)包括工程 管理器、代码生成接口、语法敏感编辑器、源 文件和类浏览器、源代码版本控制系统接口以 及文本搜索引擎等。ADS仅在其PC机版本中集 成了该IDE。 CodeWarrior IDE为管理和开发项目提供了简 单多样化的图形用户界面,用户可以使用ADS 的CodeWarrior IDE为ARM和Thumb处理器开 发用C、C++或者ARM汇编语言编写的程序代 码。

ADS工具包的组成
(1)调试器类型 ADS中包含有3个调试器,分别是ARM扩 展调试器AXD(ARM eXtended Debugger. (2)调试方式 在ARM体系中,可以选择Multi-ICE (Multi-processor in-circuit emulator) ARMulator或Angel多种调试方式。

ADS工具包的组成
5. ARM开发包和函数库 开发包和函数库 ARM开发包由一些底层的例程和库组成, 可以帮助用户快速开发基于ARM的应用 程序和操作系统。 ADS的ARM应用库完善并增强了SDT中的 函数库,同时还包括一些非常有用的源 码例程。

ADS开发工具集
1.命令行开发工具 . (1)armcc armcc是 ARM C 编译器。在命令控制台环境下,输入 命令:C:> armcc –help可以查看 armcc 的语法格式以 及最常用的一些操作选项。 (2)armcpp armcpp 是 ARM C++ 编译器。它将 ISO C++ 或 EC++ 编译成 32 位 ARM 指令代码。 (3) tcc tcc 是 Thumb C 编译器。该编译器通过了 Plum Hall C Validation Suite 为 ANSI 一致性的测试。tcc 将 ANSI C 源代码编译成 16 位的 Thumb 指令代码。

ADS开发工具集
(4) tcpp tcpp 是 Thumb C++ 编译器。 它将 ISO C++ 和 EC++ 源码编译成 16 位 Thumb 指令代码。 (5) armsm armsm 是 ARM 和 Thumb 的汇编器 . 它对用 ARM 汇编语言和 Thumb 汇编语言写的源代码 进行汇编。 (6) armlink armlink是 ARM 连接器。 (7) armsd armsd是 ARM 和 Thumb 的符号调试器。

ADS开发工具集
2.GUI 开发环境 . ADS GUI开发环境主要包含Code Warrior 和 AXD,其中Code Warrior是用于编译和链接的 集成开发工具,而AXD则是支持单步执行、断 点设置等功能的集成调试工具。 (1)Code Warrior Code Warrior for ARM是一套完整的集成开发 工具,充分发挥了 ARM RISC指令系统的优势, 使产品开发人员能够很好的应用尖端的片上系 统技术 . 该工具是专为基于 ARM RISC 的处理 器而设计的 。

ADS开发工具集
(2)AXD AXD调试器本身是一个软件,用户通过这个软 件可以对包含有调试信息的、正在运行的可执 行代码进行变量的查看、断点的设置、单步执 行等调试操作。在ARM体系中,它有Multi-ICE、 ARMulator和Angel等几种方式。AXD可以在 Windows和UNIX下进行程序的调试,它为用C、 C++和汇编语言的源代码提供了一个全面的 Windows和UNIX环境。

ADS开发工具集
3、 实用程序 、 ADS 提供以下的实用工具来配合前面介 绍的命令行开发工具的使用。 fromELF是 ARM 映像文件转换工具。 armar是ARM库函数生成器。 Flash downloader用于把二进制映像文件 下载到ARM嵌入式设备上的 Flash 存储 器中。

ARM汇编伪指令
在 ARM 汇编语言程序里,有一些特殊指令助记符,这 些助记符与指令系统的助记符不同,没有相对应的操 作码,也就是不会生成机器码,仅仅是在编译器软件 中起着格式化的作用,通常称这些特殊指令助记符为 伪指令。伪指令在源程序中的作用是为完成汇编程序 作各种准备工作的,这些伪指令仅在汇编过程中起作 用,一旦汇编结束,伪指令的使命就完成。 在 ARM 的汇编程序中,有如下几种伪指令:数据 常量定义伪指令、数据变量定义伪指令、内存分配伪 指令及其他伪指令。

1 数据常量定义伪指令
数据常量定义伪指令EQU用于为程序中的常量、 标号等定义一个等效的字符名称,类似于 C 语 言中的#define 。 EQU语法格式 : 名称 EQU 表达式 { , 类型 } ;其中 EQU 可用 “ * ” 代替。 名称为 EQU 伪指令定义的字符名称,当表 达式为 32 位的常量时,可以指定表达式的数 据类型,可以有以下三种类型: CODE16 、 CODE32 和 DATA 。

2 数据变量定义伪指令(Cont.)
数据变量定义伪指令用于定义ARM汇编程序中的变量、 对变量赋值以及定义寄存器的别名等操作。常见的数 据变量定义伪指令有如下几种: (1)GBLA、GBLL 和GBLS 语法格式:GBLA ( GBLL 或 GBLS ) 全局变量 名 GBLA 、 GBLL 和 GBLS 伪指令用于定义全局变量, 并将其初始化。其中: ① GBLA用于定义一个全局的数字变量,并初始化 为0; ② GBLL用于定义一个全局的逻辑变量,并初始化F (假); ③ GBLS用于定义一个全局的字符串变量,并初始化 为空;

2 数据变量定义伪指令(Cont.)
(2)LCLA、LCLL 和LCLS 语法格式: LCLA ( LCLL 或 LCLS ) 局部变量 名 LCLA 、 LCLL 和 LCLS 伪指令用于定义一个 ARM 程 序中的局部变量,并将其初始化。其中: ① LCLA伪指令用于定义一个局部的数字变量,并初 始化为 0 ; ② LCLL伪指令用于定义一个局部的逻辑变量,并初 始化为 F(假); ③ LCLS 伪指令用于定义一个局部的字符串变量,并 初始化为空;

2 数据变量定义伪指令(Cont.)
(3)SETA、SETL 和SETS 语法格式:变量名 SETA ( SETL 或 SETS ) 表达式 伪指令 SETA 、 SETL 、 SETS 用于给一个 已经定义的全局变量或局部变量赋值。 ① SETA 伪指令用于给一个数学变量赋值; ② SETL 伪指令用于给一个逻辑变量赋值; ③ SETS 伪指令用于给一个字符串变量赋值;

2 数据变量定义伪指令(Cont.)
(4)RLIST 语法格式:名称 RLIST { 寄存器列表 } RLIST 伪指令可用于对一个通用寄存器列表 定义名称,使用该伪指令定义的名称可在 ARM 指令 LDM/STM 中使用。在 LDM/STM 指令中, 列表中的寄存器访问次序为根据寄存器的编号 由低到高,而与列表中的寄存器排列次序无关。

3 内存分配伪指令
内存分配伪指令一般用于为特定的数据分配存 储单元,同时可完成已分配存储单元的初始化。 常见的数据定义伪指令有如下几种: (1)DCB 1 DCB 语法格式: 标号 DCB 表达式 (2) DCW(或DCWU) 语法格式: 标号 DCW (或 DCWU ) 表 达式

3 内存分配伪指令 内存分配伪指令(Cont.)
(3)DCD(或DCDU) 语法格式: 标号 DCD (或 DCDU ) 表 达式 (4)DCFD(或DCFDU) 4 DCFD DCFDU 语法格式: 标号 DCFD (或 DCFDU ) 表 达式 (5)DCFS(或DCFSU) 语法格式: 标号 DCFS (或 DCFSU ) 表 达式

3 内存分配伪指令 内存分配伪指令(Cont.)
(6)DCQ(或DCQU) 语法格式: 标号 DCQ (或 DCQU ) 表达 式 (7) SPACE 语法格式: 标号 SPACE 表达式 (8)MAP 语法格式: MAP 表达式 { ,基址寄存器 } (9)FILED 语法格式:标号 FIELD 表达式

4 汇编控制伪指令
汇编控制伪指令用于控制汇编程序的执行流程, 常用的汇编控制伪指令包括以下几条: (1) IF、ELSE、ENDIF ) 、 、 语法格式: IF 逻辑表达式 指令序列 1 ELSE 指令序列 2 ENDIF

4 汇编控制伪指令 汇编控制伪指令(Cont.)
(2) WHILE、WEND ) 、 语法格式: WHILE 逻辑表达式 指令序列 WEND (3) MEXIT ) 语法格式: MEXIT MEXIT 用于从宏定义中跳转出去。

4 汇编控制伪指令 汇编控制伪指令(Cont.)
(4) MACRO、MEND ) 、 语法格式: MACRO $ 标号 宏名 $ 参数 1 , $ 参数 2 ,…… …… 指令序列 MEND MACRO、MEND伪指令可以将一段代 码定义为一个整体,然后就可以在程序 中通过宏指令多次调用该段代码。

5 其他常用的伪指令
还有一些其他的伪指令,在汇编程序中 经常会被使用,主要包括AREA、ALIGN、 CODE16、CODE32、ENTRY、END、 EXPOR(或 GLOBAL)IMPORT、 EXTERN、GET(或 INCLUDE )INCBIN、 RN、ROUT等。

5 其他常用的伪指令 其他常用的伪指令(Cont.)
(1)AREA 语法格式: AREA 段名 属性 1 , 属性 2 ,…… AREA 伪指令用于定义一个代码段或 数据段。其中,段名若以数字开头,则 该段名需用 “ | ” 括起来,如 |1_test| 。 属性字段表示该代码段(或数据段)的 相关属性,多个属性用逗号分隔。

5 其他常用的伪指令 其他常用的伪指令(Cont.)
(2) ALIGN 语法格式: ALIGN { 表达式 { , 偏移量 }} (3) CODE16、CODE32 语法格式: CODE16 (或 CODE32 ) (4) ENTRY 语法格式: ENTRY ……

5 其他常用的伪指令 其他常用的伪指令(Cont.)
(5) END 语法格式: END (6) EXPORT(或GLOBAL) 语法格式: EXPORT 标号 {[WEAK]} (7) IMPORT 语法格式: IMPORT 标号 {[WEAK]}

5 其他常用的伪指令 其他常用的伪指令(Cont.)
(8) EXTERN 语法格式: EXTERN 标号 {[WEAK]} (9) GET(或INCLUDE) 语法格式: GET 文件名 (10) INCBIN 语法格式:INCBIN 文件名 (11) RN 语法格式: 名称 RN 表达式

ARM的汇编语言结构
在ARM(Thumb)汇编语言程序中,以相对独立的指 令或数据序列的程序段为单位组织程序代码。段可以 分为代码段和数据段,代码段的内容为执行代码,数 据段存放代码运行时需要用到的数据。一个汇编程序 至少应该有一个代码段,也可以分割为多个代码段和 数据段,多个段在程序编译链接时最终形成一个可执 行的映象文件。可执行映象文件通常由以下几部分构 成: ① 一个或多个代码段,代码段的属性为只读。 ② 零个或多个包含初始化数据的数据段,数据段的 属性为可读写。 ③ 零个或多个不包含初始化数据的数据段,数据段 的属性为可读写。

ARM汇编语言的语句格式
1. 基本语句格式 ARM(Thumb)汇编语言的语句格式为: {标号} {指令或伪指令} {;注释} 规则: ① 如果一条语句太长,可将其分为若干行来 书写,在行的末用续行符“\”来标识下一行与 本行为同一条语句。 ② 每一条指令的助记符可以全部用大写、或 全部用小写,但不能在一条指令中大、小写混 用。

ARM汇编语言的语句格式 (Cont.)
2. 汇编语言程序中常用的符号 在汇编语言程序设计中,可以使用各种符 号代替地址、变量和常量等,以增加程序的可 读性。以下为符号命名的约定: ① 符号名不应与指令或伪指令同名 ② 符号在其作用范围内必须唯一。 ③ 符号区分大小写,同名的大、小写符号被 视为两个不同的符号。 ④ 自定义的符号名不能与系统保留字相同。

ARM汇编语言的语句格式 (Cont.)
3. 程序中的常量 程序中的常量是指其值在程序的运行过程中不 能被改变的量。ARM(Thumb)汇编程序所支 持的常量有逻辑常量、数字常量和字符串常量。 ① 数字常量一般为32位的整数,无符号常量 取值范围为0~232-1,有符号常量取值范围为 -231~231-1。 ② 逻辑常量只有两种取值:真或假。 ③ 字符串常量为一个固定的字符串,一般用 来提示程序运行时的信息。

ARM汇编语言的语句格式 (Cont.)
4. 汇编语言程序中的变量 程序中的变量是指其值在程序的运行过程中可以改变 的量。 ① 逻辑变量用于在程序的运行中保存逻辑值(真/ 假)。 ② 数字变量用于在程序的运行中保存数字值,但数 字值的大小不应超出数字变量所能表示的范围。 ③ 字符串变量用于在程序的运行中保存一个字符串, 但字符串的长度不应超出字符串变量所能表示的范围。

ARM汇编语言的语句格式 (Cont.)
5. 程序中的变量代换 程序中的变量可通过代换操作取得一个 常量。代换操作符为“$”。如果“$”在数 字变量前面,编译器会将该数字变量的 值转换为十六进制的字符串,并将该十 六进制的字符串代换“$”后的数字变量。

基于Windows下ADS的汇编语言程序结构
ADS环境下的ARM汇编语言程序结构与其它环 境下的汇编语言程序结构大体相同,整个程序 也是以段为单元来组织代码。其语法规则总结 如下: ① 所有标号必须在一行的顶格书写,其后不 要添加“:”号; ② 所有的指令均不能顶格写; ③ 大小写敏感(可以全部大写或全部小写, 但不能大小写混合使用); ④ 注释使用分号“;” 。

基于Linux下GCC的汇编语言程序结构 下 基于 的汇编语言程序结构
Linux下GCC的汇编语言结构与其它环境下的汇编语言 结构相似,整个程序都是以程序段为单位来组织代码, 但是在语言规则上与ADS环境下的ARM汇编语言规则 有明显的区别。现将Linux下GCC的汇编语言规则总结 如下: : ① 所有标号必须在一行的顶格书写,并且其后必须 添加“:”号; ② 所有的指令均不能顶格写; ③ 大小写敏感(可以全部大写或全部小写,但不能 大小写混合使用); ④ 注释使用分号“@” (注释的内容由“@” 号起到 此行结束,注释可以在一行的顶格书写);

ARM汇编语言程序调试 汇编语言程序调试
无论进行嵌入式系统软件开发还是硬件 电路设计,调试永远是不可缺少的、非 常重要的一个环节。通常嵌入式系统的 调试方法和类型有很多种,最为常见的 包括软件模拟调试、硬件仿真器在线调 试、Wiggler线缆调试和Linux环境下的 gdb程序调试。

ADS软件模拟环境下的程序调试
ADS软件模拟调试是利用ARMUL.dll提供 的一个软ARM内核,调试工具和待调试 的嵌入式软件都在主机上运行,由主机 提供一个模拟的目标运行环境,可以进 行语法和逻辑上的调试。它的优点是简 单方便,不需要嵌入式目标板,软件的 调试功能较强;功能有限,不能进行实 时联机调试。

ADS硬件仿真器环境下的程序调试
在ADS环境下利用JTAG硬件仿真器可以 实现联机调试,即在线调试嵌入式设备 的Flash中的程序或者SDRAM中的程序。 由于仿真器自成体系,调试时既可以连 接目标板,也可以不连接目标板,当然 仿真器的价格也相对比较贵。一般在程 序的前期开发,通常让程序只在SDRAM 中调试运行,最后才下载到Flash中进行 调试运行。

ADS硬件仿真器环境下的程序调试 (Cont.)
ARM仿真器是通过内部硬件实现PC并口 协议到串行JTAG(Jiont Test Action Gruop)协议的转换。利用高速JTAG串 行扫描链,通过调试通信通道(Debug Communications Channel,DCC)连接 ARM核心内嵌的名为“Embedded-ICE” 的调试逻辑,调试逻辑实时监测ARM核 心的寄存器、数据总线和地址总线。

ADS硬件仿真器环境下的程序调试 (Cont.)
1. Multi-ICE server 软件的安装

ADS硬件仿真器环境下的程序调试 (Cont.)
2.运行Multi-ICE server .运行 保证硬件正确连接后,即可运行Multi-ICE server,默 认情况下,server 会用自动配置来连接目标器件。当 然,可以在settings 菜单下选择配置的方式,一般选择 Atuo-Configure即可。 如果正确连接到一个ARM内 核的嵌入式目标板,将显示 图。

ADS硬件仿真器环境下的程序调试 (Cont.)
3. 配置 . 配置ADS以支持 以支持JTAG仿真器 以支持 仿真器 启动ADS的调试器AXD后,从菜单“Option”中选择 “Configure Target”,在弹出的窗口中,选择MultiICE,如果没有此项,则需要将Multi-ICE驱动添加到对 话框中。如图所示。

ADS Wiggler调试电缆环境下的程序调试
Wiggler调试电缆实际上可以看出就是一个简易 的JTAG“仿真器”,它也支持ADS集成开发环 境和在线联机调试,支持单步、全速及断点等 调试功能。

ADS Wiggler调试电缆环境下的程序调试

(Cont.)
1. Wiggler JTAG 调试电缆的驱动安装 要使用Wiggler JTAG 调试电缆来调试ARM 处 理器,除了ADS1.2 集成开发环境外,还需要 安装一个ARM 调试代理,一般使用H-JTAG 软 件,H-JTAG 软件的特点如下: ① 支持ARM7/ARM9,支持自动检测和手动指 定内核; ② 使用RDI 接口,支持SDT2.51、ADS1.2、 REALVIEW 和IAR 集成开发环境; ③ 支持2 个硬件断点或数量不限的软件断点;

④ 支持ARM/Thumb 模式; ⑤ 支持Little Endian & BIG Endian 模式; ⑥ 支持Semihosting 调试; ⑦ 支持Wiggler、SDT JTAG 和自定义接口。 首先,用鼠标双击H-JTAG软件的安装文件HJTAG V0.2.exe,启动H-JTAG 安装界面,按照 提示操作完成安装。

ADS Wiggler调试电缆环境下的程序调试

(Cont.)
2. 运行 运行H-JATG软件 软件 接着,将Wiggler JTAG 调试电缆一头通 过并口延长线与PC机的并口连接,另一 头接到嵌入式目标板的JTAG插座上。然 后启动H-JTAG。H-JTAG会自动检测ARM 内核,如果JTAG 连接正确将会在HJTAG主窗口中显示处理器的型号.

ADS Wiggler调试电缆环境下的程序调试

(Cont.)
3. 配置 配置ADS以支持 以支持JTAG仿真器 以支持 仿真器 启动ADS的调试器AXD后,从菜单“Option”中 选择“Configure Target”,在弹出的窗口中,添 加或选择H-JTAG.dll(如图所示)。

Linux环境下的gdb程序调试
Linux下提供了一个叫 gdb的GNU调试程序,主 要用来调试C、C++等应用程序。它可以提供: ① 监视程序中变量的值; ② 设置断点以使程序在指定的代码行上暂 停执行; ③ 单步执行; 语法格式: gdb <fname>

gdb 基本命令

ARM汇编语言与C语言混合编程
ARM体系结构支持C/C++以及汇编语言的混合 编程,在一个完整的程序设计中,除了初始化 部分用汇编完成以外,其主要的编程任务一般 C/C++ 都用C/C++完成。 汇编语言和C/C++的混合编程通常有以下几 种方式: ① 汇编程序中调用C程序 ② C程序中调用汇编程序 ③ C程序中内嵌汇编语句 ④ 从汇编程序中访问C程序变量

基本的ATPCS
基本的ATPCS规定了在混合编程时子程序调用 的一些基本规则,主要包括寄存器的使用、堆 栈的使用、参数传递和子程序结果的返回等方 面的规则。 1. 寄存器的使用规则 ① 程序通过寄存器R0~R3来传递参数,这时这 些寄存器可以记作A0~A3,被调用的子程序在 返回前无需恢复寄存器R0~R3的内容。

基本的ATPCS (Cont.)
② 在子程序中,使用R4~R11来保存局 部变量,这时这些寄存器可以记作 V1~V8。 ③ 寄存器R12用作子程序间scratch寄存 器,记作IP,在子程序的连接代码段中 经常会有这种使用规则。

基本的ATPCS (Cont.)
④ 寄存器R13用作数据栈指针,记做SP,在子 程序中寄存器R13不能用做其他用途。 ⑤ 寄存器R14用作连接寄存器,记作LR,它用 R14 LR 于保存子程序的返回地址。 ⑥ 寄存器R15是程序计数器,记作PC,它不能 用作其他用途。 ⑦ ATPCS中的各寄存器在ARM编译器和汇编器 中都是预定义的。

基本的ATPCS (Cont.)
2. 堆栈的使用规则 栈指针通常可以指向不同的位置,当 栈指针指向栈顶元素时,称为FULL栈。 当栈指针指向与栈顶元素相邻的一个元 素时,称为Empty栈。 数据栈的增长方向 也可以不同,当数据栈向内存减小的地 址方向增长时,称为Descending栈;反 之称为Ascending栈。

基本的ATPCS (Cont.)
3. 参数的传递规则 根据参数个数是否固定,可以将子程序 分为参数个数固定的子程序和参数个数 可变的子程序,这两种子程序的参数传 递规则不同的。 ① 参数个数可变的子程序参数传递规则。 ② 参数个数固定的子程序参数传递规则。

基本的ATPCS (Cont.)
4. 子程序结果返回规则 ① 结果为一个32位的整数时,可通过寄存器R0返回。 ② 结果为一个64位整数时,可以通R0和R1返回,依此 类推。 ③ 结果为一个浮点数时,可以通过浮点运算部件的寄 存器f0,d0或者s0来返回。 ④ 结果为一个复合的浮点数时,可以通过寄存器f0-fN 或者d0~dN来返回。 ⑤ 对于位数更多的结果,则需要通过调用内存来传递。

汇编程序中调用C程序
2. C语言文件 /*C file, called by asmfile */ int cFun(int a, int b, int c) { return a + b + c; } 这里的参数传递是利用寄存器r0~r2。需要指 出的是当函数的参数个数大于4时就要借助堆 栈。

C程序中调用汇编程序
在汇编程序中使用EXPORT伪指令声明程 序,使得本程序可以被其他的程序调用; 在C语言中使用EXTERN关键词声明该汇 编程序,这样就可以在C中使用该函数了。 从C的角度,并不知道该函数的实现是用 C还是汇编。

C程序中内嵌汇编语句 程序中内嵌汇编语句
在C中内嵌的汇编指令支持大部分的ARM和Thumb指令, 不过其使用与汇编文件中的指令有些不同,存在一些 限制,主要有下面几个方面: ① 不能直接向PC寄存器赋值,程序跳转要使用B或者 BL指令; BL ② 在使用物理寄存器时,不要使用过于复杂的C表达 式,避免物理寄存器冲突; ③ R12和R13可能被编译器用来存放中间编译结果; ④ 一般不要直接指定物理寄存器,而让编译器进行分 配;

从汇编程序中访问C程序变量 从汇编程序中访问 程序变量
在C程序中声明的全局变量可以被汇编程序通 过地址间接访问,具体访问方法如下: ① 使用IMPORT伪指令声明该全局变量。 ② 使用LDR指令读取该全局变量的内存地址, 通常该全局变量的内存地址值存放在程序的数 据缓冲区中。 ③ 根据该数据的类型,使用相应的LDR指令读 取该全局变量的值,使用相应的STR指令修改 该全局变量的值。

从汇编程序中访问C程序变量 从汇编程序中访问 程序变量 (Cont.)
各数据类型及其对应的LDR/STR指令如下: ① 对于无符号的char类型的变量通过指令 LDRB/STRB来读写。 ② 对于无符号的short类型的变量通过指令 LDRH/STRH读写。 ③ 对于int类型的变量通过指令LDR/STR来读写。 ④ 对于有符号的char类型的变量通过指令 LDRSB来读取。 ⑤ 对于有符号的char类型的变量通过指令 STRB来写入。

⑥ 对于有符号的short类型的变量通过指令 LDRH来读取。 ⑦ 对于有符号的short类型的变量通过指令 LDRH来写入。 ⑧ 对于小于8个字的结构型变量,可以通过一 条LDM/STM指令来读/写整个变量。 ⑨ 对于结构型变量的数据成员,可以使用相应 的LDR/STR指令来访问,这时必须知道该数据 成员相对于结构型变量开始地址的偏移量。

从汇编程序中访问C程序变量 从汇编程序中访问 程序变量 (Cont.)
下面是一个在汇编程序中访问C程序全局变量的例子。 AREA global_exp, CODE, READONLY EXPORT asmsub IMPORT globv ;声明全局变量 asmsub LDR r1, = globv ;将内存地址读入到R1中 LDR r0, [r1] ;将数据读入到R0中 ADD r0, r0, #2 STR r0, [r1] ;修改 后再将值赋予变量 MOV pc, lr END

从汇编程序中访问C程序变量 从汇编程序中访问 程序变量 (Cont.)
程序中,变量globv1是在C程序中声明的 全局变量,在汇编程序中首先使用 IMPORT伪指令声明该变量,再将其内存 地址读入到寄存器R1中,将其值读入到 寄存器R0中,修改后再将寄存器R0的值 赋予变量globv。

 

ARM编译-调试工具介绍 作者 jackey 日期 2007-7-31 13:41:00
1
一、编辑编译工具:
1、ADS1.2
    ADS是ARM公司的集成开发环境软件,它的功能非常强大。他的前身是SDT,SDT是ARM公司几年前的开发环境软件,目前SDT早已经不再升级。ADS包括了四个模块分别是:SIMULATOR;C 编译器;实时调试器;应用函数库。特点:
     √ADS1.2提供完整的WINDOWS界面开发环境;
     √C编译器效率极高;支持C以及C++,使工程师可以很方便的使用C语言进行开发;
     √提供软件模拟仿真功能,使没有Emulators的学习者也能够熟悉ARM的指令系统;
     √配合FFT-ICE使用,ADS1.2提供强大的实时调试跟踪功能,片内运行情况尽在掌握;
     √ADS1.2需要硬件支持才能发挥强大功能,目前支持的硬件调试器有Multi-ICE以及兼容Multi-ICE的调试工具如FFT-ICE等;
     √简易下载电缆不能支持ADS1.2;
     √版本:ADS1.2    软件大小:130M
     √下载地址:
http://www.mcu123.com/down
2、ARM REALVIEW DEVELOPER SUITE
    RealView Developer Suite工具是ARM公司是推出的新一代ARM集成开发工具。支持所有ARM系列核,并与众多第三方实时操作系统及工具商合作简化开发流程。开发工具包含以下组件:
     · 完全优化的ISO C/C++编译器;
     · C++ 标准模板库;
     · 强大的宏编译器;
     · 支持代码和数据复杂存储器布局的连接器;
     · 可选 GUI调试器;
     · 基于命令行的符号调试器(armsd);
     · 指令集仿真器;
     · 生成无格式二进制工具、Intel 32位和Motorola 32位ROM映像代码的指令集模拟工具;
     · 库创建工具;
     · 内容丰富的在线文档;
     版本:ARM.RealView.Developer2.2    软件大小:500M
     下载地址:
http://www.mcu123.com/down
3、IAR EWARM
    Embedded Workbench for ARM 是IAR Systems公司为ARM微处理器开发的一个集成开发环境(下面简称IAR EWARM)。比较其他的ARM 开发环境,IAR EWARM 具有入门容易、使用方便和代码紧凑等特点。
    IAR Systems 公司目前推出的最新版本是IAR Embedded Workbench for ARM version 4.30。EWARM 中包含一个全软件的模拟程序(simulator),用户不需要任何硬件支持就可以模拟各种ARM内核、外部设备甚至中断的软件运行环境。从中可以了解和评估IAR EWARM的功能和使用方法。IAR EWARM的主要特点如下:
     1、高度优化的IAR ARM C/C++ Compiler
     2、IAR ARM Assembler
     3、一个通用的IAR XLINK Linker
     4、IAR XAR 和XLIB 建库程序和IAR DLIB C/C++运行库
     5、功能强大的编辑器
     6、项目管理器
     7、命令行实用程序
     8、IAR C-SPY 调试器(先进的高级语言调试器
     版本:IAR EWARM 4.40a    软件大小:93M
     下载地址:
http://www.mcu123.com/down
4、KEIL ARM-MDKARM
    Keil uVision调试器可以帮助用户准确地调试ARM器件的片内外围功能(I2C、CAN、UART、SPI、中断、I/O口、A/D转换器、D/A转换器和PWM模块等功能)。ULINK USB-JTAG转换器将PC机的USB端口与用户的目标硬件相连(通过JTAG或OCD),使用户可在目标硬件上调试代码。通过使用Keil uVision IDE/调试器和ULINK USB-JTAG转换器,用户可以很方便地编辑、下载和在实际的目标硬件上测试嵌入的程序。支持Philips、Samsung、 Atmel、 Analog Devices、 Sharp、 ST等众多厂商ARM7内核的ARM微控制器。主要特点:
     * 高效工程管理的uVision3集成开发环境
     * Project/Target/Group/File的重叠管理模式,并可逐级设置;
     * 高度智能彩色语法显示;
     * 支持编辑状态的断点设置,并在仿真状态下有效。
     * 高速ARM指令/外设模拟器
     * 高效模拟算法缩短大型软件的模拟时间;
     * 软件模拟进程中允许建立外部输入信号;
     * 独特的工具窗口,可快速查看寄存器和方便配置外设;
     * 支持C调试描述语言,可建立与实际硬件高度吻合的仿真平台;
     * 支持简单/条件/逻辑表达式/存储区读写/地址范围等断点。
     * 多种流行编译工具选择
     * Keil高效率C编译器;
     * ARM公司的ADS/RealView 编译器;
     * GNU GCC 编译器;
     * 后续厂商的编译器。
     官方网址:
www.keil.com    
     版本: MDKARM V3.10A    软件大小:53M
     下载地址:  
http://www.mcu123.com/down
5、WINARM (GCCARM)
    WINARM  是一个免费的开发工具,可以在
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/ 下载得到,里面除了包含 C/C++ 编译器——GCC,汇编、连接器——Binutils,调试器——GDB等工具,也包括了通过 GDB 使用 Wiggler JTAG 的软件——OCDRemote。所以,所需要的工具都包括在了这个 WinARM 发行版中,就可以比较省心了。
     官方发布网址:
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/
     软件大小:90M   
     下载地址:
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/WinARM-20060606.zip
     WINARM简易使用说明:http:/www.mcu123.com/product/lpc214x/winarm_user_cn.pdf
二、调试开发工具
1、H-JTAG调试代理:
    H-JTAG是一个免费的ARM调试代理,程序没有任何限制,作者BLOG:
http://twentyone.blogchina.com
     0) 支持ARM7/ARM9,支持自动检测和手动指定内核
     1) 使用RDI接口,支持SDT,ADS,REALVIEW和IAR
     2) 支持ADS1.2和SDT2.51和RREAL VIEW
     3) 支持个硬件断点或者数量不限的软件断点
     4) 支持ARM/THUMB模式
     5) 支持LITTLEENDIAN & BIGENDIAN
     6) 支持SEMIHOSTING
     7) 支持WIGGLER SDTJTAG和自定义接口
2、LPC2000系列ISP工具:
    可经由Philips官方网站下载。
3、Macraigor Systems Wiggler 调试工具:
4、J-LINK:
    IAR公司的J-LINK是一款小巧的ARM JTAG硬件调试器,它是通过USB口与PC机相连。IAR的J-LINK与该公司的嵌入式开发平台紧密结合,且完全支持即插即用。主要特征:
     1)?支持所有ARM7和ARM9
     2)?下载速度高达600KB/sec
     3)  无需电源供电,可直接通过USB取电
     4)?JTAG速度是8MHz
     5)?自动辨速
     6)?监控所有的JTAG管脚信号,测量电压
     7)?20pin标准JTAG连接器
     8)?配带USB口和20pin插槽
     9)  支持Windows 2000 和Windows XP
    更强的几点:
     1、支持ADS、KEIL、IAR、WINARM、RV等几乎所有开发环境,并且可以和IAR无缝连接;
     2、支持FLASH软件断点,可以设置2个以上断点(无限个断点),极大的提高调试效率;
     3、带J-Link TCP/IP server,允许通过TCP/ IP 网络使用J-Link;
     4、支持几乎所有ARM7,ARM9,暂时不支持XSCALE;
      * ARM7TDMI(Rev 1)
      * ARM7TDMI(Rev 3)
      * ARM7TDMI-S(Rev 4)
      * ARM720T
      * ARM920T
      * ARM926EJ-S
      * ARM946E-S
    官方网站:
http://www.segger.com/
5、U-LINK:
    ARM7 TDMI结构的Keil开发套件采用最新设计的超豪华uVision3集成开发环境,内嵌C编译器/汇编器/工程管理器/调试器等功能功能模块,是一款稳定可靠高效的开发工具,适用于不同层次的的用户,完全满足从专业的应用开发工程师到初学嵌入式软件开发的学生的所有使用要求。类似于8051的智能平台将大幅度缩短您的开发周期,各大半导体厂商的所有ARM型号将逐一得到全面支持。
    Keil uVision (for arm)调试器可以帮助用户准确地调试ARM器件的片内外围功能(I2C、CAN、UART、SPI、中断、I/O口、A/D转换器、D/A转换器和PWM模块等功能)。ULINK USB-JTAG转换器将PC机的USB端口与用户的目标硬件相连(通过JTAG或OCD),使用户可在目标硬件上调试代码。
    通过使用Keil uVision IDE/调试器和U-LINK USB-JTAG转换器,用户可以很方便地编辑、下载和在实际的目标硬件上测试嵌入的程序。支持Philips、Samsung、 Atmel、 Analog Devices、 Sharp、 ST等众多厂商ARM7内核的ARM微控制器。
    特点:
     * Keil高效率C编译器;
     * ARM公司的ADS/RealView编译器;
     * GNU GCC 编译器;
     * 后续厂商的编译器。
     * USB通讯接口高速下载用户代码;
     * 存储区域/寄存器查看;
     * 快速单步程序运行;
     * 多种程序断点;
     * 片内Flash编程 。
    官方网站:
http://www.keil.com/ulink

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值