作者: Sam (甄峰) sam_code@hotmail.com
使用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变化等。
没有评论:
发表评论