AXD 例子详解ARMLinker
ARM实验指导

ADS 集成开发环境及EasyJTAG 仿真器应用ADS 集成开发环境是ARM 公司推出的ARM 核微控制器集成开发工具,英文全称为ARM Developer Suite,成熟版本为ADS1.2。
ADS1.2 支持ARM10 之前的所有ARM 系列微控制器,支持软件调试及JTAG 硬件仿真调试,支持汇编、C、C++源程序,具有编译效率高、系统库功能强等特点,可以在Windows98、Windows XP、Windows2000 以及RedHat Linux上运行。
这里将简单介绍使用ADS1.2 建立工程,编译连接设置,调试操作等等。
最后还介绍了基于LPC2100 系列ARM7 微控制器的工程模板的使用,EasyJTAG 仿真器的安装与使用。
一、ADS 1.2 集成开发环境的组成ADS 1.2 由6 个部分组成,如表1 所示。
表1 ADS 1.2 的组成部分由于用户一般直接操作的是CodeWarrior IDE 集成开发环境和AXD 调试器,所以这一章我们只介绍这两部分软件的使用,其它部分的详细说明参考ADS 1.2 的在线帮助文档或相关资料。
1. CodeWarrior IDE 简介ADS 1.2 使用了CodeWarrior IDE 集成开发环境,并集成了ARM 汇编器、ARM 的C/C++编译器、Thumb 的C/C++编译器、ARM 连接器,包含工程管理器、代码生成接口、语法敏感(对关键字以不同颜色显示)编辑器、源文件和类浏览器等等。
CodeWarrior IDE 主窗口如图1所示。
2. AXD 调试器简介AXD 调试器为ARM 扩展调试器(即ARM eXtended Debugger),包括ADW/ADU 的所有特性,支持硬件仿真和软件仿真(ARMulator)。
AXD 能够装载映像文件到目标内存,具有单步、全速和断点等调试功能,可以观察变量、寄存器和内存的数据等等。
AXD 调试器主窗口如图2 所示。
ARM知识点讲解详解(word文档物超所值)

ARM知识点讲解详解1、ARM处理器工作模式有几种?各种工作模式下分别有什么特点?ARM 处理器有7种工作模式,这7种模式及其特点是:快速断模式(fiq)支持高速数据传输或通道处理,外部断fiq信号有效且CPSR的F=0进入。
断模式(irq)用于通用断处理,外部断irq信号有效CPSR的I=0进入。
管理员模式(svc)- 操作系统的保护模式,复位、软件断进入。
主要用于SWI(软件断)和OS(操作系统)。
这个模式有额外的特权,允许你进一步控制计算机。
止模式(abt)- 支持虚拟内存和/或内存保护预取指令止/数据止进入未定义模式(und)-支持硬件协处理器的软件仿真(浮点、向量运算)未定义指令进入系统模式(sys)- 支持操作系统的特殊用户模式(运行操作系统任务)用户模式(usr)正常的程序执行模式,此模式应用程序不能访问受操作系统保护的资源,不能改变模式,除非异常发生。
2、ARM处理器总共有多少个寄存器,这些寄存器按其在用户编程的功能是如何划分的?这些寄存器在使用各有何特殊之处?答:ARM微处理器共有37个32位寄存器,其31个为通用寄存器,6个为状态寄存器。
31个通用寄存器根据其编程特点可分为如下几种类型:1、不分组寄存器R0-R7 为所有模式共享2、分组寄存器R8-R12R8_fiq-R12_fiq: FIQ模式下的寄存器R8-R12:其它模式共享3、分组寄存器R13-R14分为6组,用户、系统一组,其他每种模式一组。
R13_<mode>通常用作堆栈指针SP,R14_<mode>通常用作子程序链接寄存器,当进入子程序时,常用来保存PC的返回值其,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。
4、程序寄存器R15(PC)所有模式共享6个状态寄存器:一个CPSR当前程序状态寄存器,保存当前程序状态。
五个程序状态备份寄存器SPSR(svc,abt,und,irq,frq),只有在异常模式下,才能被访问;各异常模式都拥有属于自己的SPSR,当发生异常时, SPSR用来保存CPSR的值,从异常退出时则可由SPSR来恢复CPSR。
ARM 关于地址重映射

关于地址重映射1、通俗解释ARM芯片的地址重映射映射就是一一对应的意思。
重映射就是重新分配这种一一对应的关系。
我们可以把存储器看成一个具有输出和输入口的黑盒子。
如下图所示,输入量是地址,输出的是对应地址上存储的数据。
当然这个黑盒子是由很复杂的半导体电路具现的,具体的实现的方式我们现在不管。
存储单位一般是字节。
这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。
图1普通的单片机把可执行代码和数据存放到存储器中。
单片机中的CPU从储器中取指令代码和数据。
其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。
如下图,CPU读取0x00000000地址上存储单元的过程。
图 2ARM比较复杂。
ARM芯片与普通单片机在存储器地址方面的不同在于:ARM 芯片中有些物理存储单元的地址可以根据设置变换。
就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了。
图3是随意举了个例子(不要与ARM芯片对应),旨在说明地址重映射的过程。
图3表示把 0x00000000地址上的存储单元映射到新的地址0x00000007上。
CPU 存取0x00000007就是存取0x00000000上的物理存储单元。
图 3下面图4,图5是对ARM芯片的两种地址重映射方式的图示。
假设我们的应用程序存放在外扩 FLASH当中,那么应用程序的异常向量表就存放在0x80000000起始的64个(其中有32个存放异常向量)物理存储单元中。
但是ARM核发生异常(中断)后是从 0x00000000~0x0000003F地址范围取异常向量的。
所以要把0x80000000~0x8000003F范围内的存储单元重新映射到0x00000000~0x0000003F地址范围上。
以后CPU存取0x00000000~0x0000003F地址就是存取 0x80000000~0x8000003F范围内的存储单元。
AXD使用

step6. Load image from file: test.bin,加载要烧入的二进制文件,并在对话框中设好缓存address.
step7. 点run/step/Run to Cursor: 蓝色光标总是在Disassembly窗口中,而不是在我想要的.C文件中指示程序run的进度,并且遇到断点都没有停过。
整个过程就是这样子的,不知道step7的这些现象的原因是为什么啊?请高手们指教。。。。。。谢谢了
首先要谢谢一下twentyon不行。我现在把我的整个操作流程写下来,你看看有什么不对的地方?我写的是基于JTAG仿真器和ADS的flash烧写程序。
step1. 打开Multi-ICE Server : 探测到[X] ARM7TDMI
step2. 双击AXD Debugger: 出现‘Default-1-2-0-0.ses’could not be loaded, 我点确定;出现‘Load Session’,我点取消 (我一直都不太明白这个session的东西是用来做什么的?)
step4. 打开Command Line Interface: Debug> obey .../***.txt :配置特殊寄存器
step5. Load image: FlashProgram.axf,出来的是Disassembly窗口,我自己在file框中点开main.c文件,并在这个主程序中设置了几个断点。
ARM指令集解析

算术指令
实现两个32位数据的加法、减法操作 1.ADD——加法指令 ADD{<cond>}{S}Rd,Rn,operand2 功能:将寄存器Rn的值与operand2操作 数相加,并将结果存放在Rd寄存器中 ADD R0,R1,R2 ADD R0,R1,#5 ADD R0,R1,R2,LSL #2
算术指令
5.RSB——逆向减法指令 RSB{<cond>}{S}Rd,Rn,operand2 功能:将operand2操作数减去寄存器Rn 的值,并将结果存放在Rd寄存器中 RSB R0,R1,R2 RSB R0,R1,#5 RSB R0,R1,R2,LSL #2
算术指令
6.RSC——带借位的逆向减法指令 RSC{<cond>}{S}Rd,Rn,operand2 功能:将operand2操作数减去寄存器Rn 的值,再减去CPSR中的C条件标志位的 反码,并将结果存放在Rd寄存器中 RSC R0,R1,R2
数据传送指令
将一个寄存器中的数据传送到另一个寄存器, 或者将一个立即数传送寄存器 1.MOV指令 MOV {<cond>}{S} Rd,operand2 功能:将源操作数operand2传送到目的寄存器 Rd中 MOV R1,R0 MOV PC,R14 MOV R1,R0,LSL #3 MOV R0,#5
数据传送指令
2.MVN指令 MVN {<cond>}{S} Rd,operand2 功能:将源操作数operand2按位取反后 传送到目的寄存器Rd中 MVN R0,#5 MVN R1,R2
移位操作
将寄存器中的内容进行指定位数的左移 右移 1.LSL——逻辑左移 Rm,LSL<opl> 功能:将寄存器Rm中的内容进行逻辑左 移,左移位数为操作数opl,低位补零 MOV R0,R1,LSL #1
ARM指令集详解(超详细带实例)

ARM指令集详解(超详细带实例)算术和逻辑指令ADC : 带进位的加法(Addition with Carry)ADC{条件}{S} dest, op 1, op 2dest = op_1 + op_2 + carryADC 将把两个操作数加起来,并把结果放置到目的寄存器中。
它使用一个进位标志位,这样就可以做比32 位大的加法。
下列例子将加两个128 位的数。
128 位结果: 寄存器0、1、2、和3第一个128 位数: 寄存器4、5、6、和7第二个128 位数: 寄存器8、9、10、和11。
ADDS R0, R4, R8 ; 加低端的字ADCS R1, R5, R9 ; 加下一个字,带进位ADCS R2, R6, R10 ; 加第三个字,带进位ADCS R3, R7, R11 ; 加高端的字,带进位如果如果要做这样的加法,不要忘记设置S 后缀来更改进位标志。
ADD : 加法(Addition)ADD{条件}{S} dest, op 1, op 2dest = op_1 + op_2ADD 将把两个操作数加起来,把结果放置到目的寄存器中。
操作数1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值:ADD R0, R1, R2 ; R0 = R1 + R2ADD R0, R1, #256 ; R0 = R1 + 256ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 1)加法可以在有符号和无符号数上进行。
AND : 逻辑与(logical AND)AND{条件}{S} dest, op 1, op 2dest = op_1 AND op_2AND 将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。
操作数 1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值: AND R0, R0, #3 ; R0 = 保持R0 的位0和1,丢弃其余的位。
ARM ADS中的AXD 调试经验集锦(很实用的)

ARM ADS中的AXD 调试经验集锦1、如何设置AXD连接的Target。
在菜单的Configure Target…选项中可以设置。
一般选择MutiIce或者ARMUL两种。
ARMUL是一种ARM的模拟器。
一般的算法或者一些无需和硬件中断等设备打交道的程序都可以通过这个进行调试。
使用上非常简单。
我们一般上板子进行调试都是通过MutiICE来进行。
在刚刚安装了系统的时候,菜单中没有MutiICE,需要我们手动添加:点击ADD按钮,然后在弹出的文件浏览中,选择“C:\Program Files\ARM\Multi-ICE\Muti-ICE.dll”(默认安装的话)。
然后点击“确定”。
这样就把MutiICE的调试接口安装上了。
2、如何保存当前的调试现场。
我们在调试过程中,经常需要在不同的地方设置断点、设置Watchpoint或者打开很多source文件。
但是,一旦我们关闭了AXD,所有的工作都白费了。
当我们再次打开AXD后,我们得到的仍然是没有任何断点、只打开一个entry文件的调试环境。
这里介绍一种方法可以自动保存上一次的调试现场(寄存器的数据都是保存的)。
Options->General tab. 这里确认Save and load default sessions 选项是选中的。
然后打开Session File,确保Rselect Target和Reload images 选项是选中的。
在设置保存后,我们在关闭AXD后,再次启动,就会自动加载上次的image,恢复寄存器了。
如果需要保存多个现场,那么就在设置保存后,在File菜单中选择Save Session来进行保存。
不过注意,保存的路径中不能有空格和特殊字符。
最好保存在ClearCase上。
在需要恢复现场的时候,只需要Load Session就一切OK。
你以前辛辛苦苦设置的断点、 Watchpoint全都回来了。
3、不能设置断点,怎么办?不能设置断点时,我仅知有几种解决方案,这里列举一下:A:清空CPU的Vector Catch 。
arm汇编语言例子

arm汇编语言例子ARM汇编语言是一种低级语言,用于编写底层程序和嵌入式系统。
它是一种基于寄存器的体系结构,广泛应用于移动设备、嵌入式系统和嵌入式控制器等领域。
下面是十个符合要求的ARM汇编语言的例子。
1. 加法运算:```ADD R0, R1, R2 ; 将寄存器R1和R2的值相加,结果存放在R0中```2. 减法运算:```SUB R0, R1, R2 ; 将寄存器R2的值从R1中减去,结果存放在R0中```3. 乘法运算:```MUL R0, R1, R2 ; 将寄存器R1和R2的值相乘,结果存放在R0中```4. 除法运算:```SDIV R0, R1, R2 ; 将寄存器R1的值除以R2,结果存放在R0中```5. 位移运算:```LSL R0, R1, #3 ; 将寄存器R1的值左移3位,结果存放在R0中```6. 逻辑运算:```AND R0, R1, R2 ; 将寄存器R1和R2的值进行与运算,结果存放在R0中```7. 条件分支:```CMP R0, #10 ; 将寄存器R0的值与10进行比较BNE label ; 如果不相等,则跳转到label处执行```8. 循环结构:```MOV R0, #0 ; 将寄存器R0的值设为0LOOP: ADD R0, R0, #1 ; 将寄存器R0的值加1CMP R0, #10 ; 将寄存器R0的值与10进行比较BLT LOOP ; 如果小于10,则跳转到LOOP处继续执行```9. 函数调用:```PUSH {R0, R1, R2} ; 将寄存器R0、R1和R2的值压入栈中BL function ; 调用名为function的函数POP {R0, R1, R2} ; 将栈中的值弹出到寄存器R0、R1和R2中```10. 中断处理:```LDR R0, =ISR ; 将中断服务程序的地址加载到寄存器R0中LDR R1, =0x1234 ; 将待处理的中断号加载到寄存器R1中STR R0, [R1] ; 将中断服务程序的地址存储到中断向量表中```这些例子涵盖了ARM汇编语言的基本操作,包括算术运算、位移运算、逻辑运算、条件分支、循环结构、函数调用和中断处理等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用ADS1.2 IDE--Codewarrior创建一个ARM Executable Image工程。
并在工程中建立一个ASM文件如下:
汇编程序1:
AREA Example1, CODE, READONLY ;声明代码段Example1
ENTRY ; 表明程序入口
CODE32 ;声明32位ARM指令
START MOV R0, #15 ;R0寄存器赋值为15
MOV R1, #8 ;R1寄存器为8
ADDS R0,R0,R1 ;R0=R0+R1
B START ;跳到START去
END
这个ASM程序非常简单。
但我们可以从这个最简单的例子学会ARM Linker设置以及ARMulator软件仿真。
1.ARM Linker设置。
DebugRel Setting->ARM Linker页面中。
选中Output分页。
Linktype的意思是:以何种方式Link。
有3个选项:
Partia:
Simple: 使用简单的指定
Scattered:使用分散加载文件指定Image放置地点,栈,堆位置,程序从何处开始执行等
咱们首先讲Simple:
Simple Image中,
RO Base:表示程序放置的位置(或者是Read Only?)
RW Base:表示
Options: Image Entry Point:表示程序开始执行的位置。
注意,这个位置必须在RO范围内,并且4字节对奇的头位置。
例1:
RO Base:0x40000000
RW Base:0x40003000
Image Entry Point: 0x40000000
则表示,程序放在0x40000000,且从0x40000000处开始执行。
使用F5进入AXD。
则可以看到PC寄存器指向0x40000000(START处).可以一步步执行下去。
并看到Memory Start address: 0x40000000处有代码。
例2:
RO Base:0x40000000
RW Base:0x40003000
Image Entry Point: 0x40000004
则表示,程序放在0x40000000,且从0x40000004处开始执行。
进入AXD,则PC寄存器指向0x40000004(MOV R1, #8)处。
并看到Memory Start address: 0x40000000处有代码。
汇编程序2:
目的1:掌握LDR/STR读取和存储数据到Memory上。
目的2:继续深入掌握AXD.
COUNT EQU 0x40003100 ;定义一个变量,地址为0x40003100 AREA Example2,CODE,READONLY
ENTRY;程序入口
CODE32 ;表明32位ARM指令
START LDR R1, =COUNT ;LDR从COUNT处读取数据到R1 MOV R0, #0;R0设为0
STR R0,[R1] ;R0的内容放置到R1所带表的地址中去
LOOP LDR R1, =COUNT ;R1 读取COUNT中内容
LDR R0,[R1] ;R0 读取R1所表示的内存区内容
ADD R0,R0,#1 R0=R0+1
CMP R0,#10 ;比较R0 和10
MOVHS R0,#0 如果R0>10 则执行这指令:将R0设为0
STR R0,[R1] 将R0内容写入R1代表的内存中去。
B LOOP
END
可以在AXD下面看Memory变化。
R0,R1的Register变化等。