微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM汇编语言源程序格式

ARM汇编语言源程序格式

时间:11-20 来源:互联网 点击:
Semihosting 在ADS的C语言函数库中,某些ANSIC的功能是由主机的调试环境来提供的,这套机制有一个专门术语叫Semihosting。

Semihosting通过一组软件中断(SWI)指令来实现。
当一个Semihosting软中断被执行时,调试系统先识别这个SWI请求,然后挂起正在运行的程序,调用Semihosting的服务,完成后再恢复原来的程序执行。
因此,主机执行的任务对于程序来说是透明的。
SWI传递的功能号
(例如: semi-hosting, 使用0x123456 (ARM) or 0xAB (Thumb)


在此例中,表格jumptable中存放地是子程序地入口地址,我们把这种表格称为跳转表格。
注意指令LDR PC,[R3,R0,LSL #2],执行地操作为PC=R3+R0×4,因为表格中存放地地址为4字节地址,所以要将R0乘以4得出偏移量,再加上表格首地址,得出子程序地入口地址赋值给PC。

字符串拷贝程序设计
下面的例子为用ARM指令编写的串拷贝的例子。
两个数据串都放在数据段中,且用DCB伪指令定义,DCB为定义1字节或多字节内存空间,双引号中的字符串在内存中是顺序存放的,因此取数/存数时需要使用LDRB和STRB指令;
若数据串是用DCD存放的,则应使用LDR和STR指令。
另外,例子中采用的LDRB/STRB 指令是后索引寻址方式,即寻址完成后更新地址。

字符串拷贝程序设计(用LDR和STR实现)
AREA StrCopy, CODE, READONLY
ENTRY ; 程序入口
start
LDR r1, =srcstr ; 初始串的指针
LDR r0, =dststr ; 结果串的指针
BL strcopy ; 调用子程序执行复制
stop
MOV r0, #0x18 ; 执行中止
LDR r1, =0x20026 ;
SWI 0x123456 ;

字符串拷贝程序设计(用LDR和STR实现)——续
strcopy
LDRB r2, [r1],#1 ; 加载并且更新源串指针
STRB r2, [r0],#1 ; 存储且更新目的串指针;
CMP r2, #0 ; 是否为0
BNE strcopy ;
MOV pc,lr ;
AREA Strings, DATA, READWRITE
srcstr DCB "First string - source",0
dststr DCB "Second string - destination",0
END

字符串拷贝程序设计
数据串拷贝时,若使用LDM和STM则可增加程序的效率。考虑到ARM的寄存器,一次采用8个寄存器进行传输比较合适,
通过指令: MOVS r3,r2, LSR #3 来计算需要几轮8位数据传送,剩余的数据个数可以通过指令ANDS r2, r2, #7 获得,再对其进行按字传输即可。

字符串拷贝程序设计(用LDM和STM实现)
AREA Block, CODE, READONLY ; 命名
num EQU 20 ; 设置被拷贝的字数
ENTRY ; 程序入口
start
LDR r0, =src ; r0 = 源串指针
LDR r1, =dst ; r1 = 目的串指针
MOV r2, #num ; r2 = 拷贝字数
MOV sp, #0x400 ; 设置堆栈指针 (r13)
blockcopy
MOVS r3,r2, LSR #3 ; 字数/8
BEQ copywords ; 少于8个字
STMFD sp!, {r4-r11} ; save some working registers
octcopy
LDMIA r0!, {r4-r11} ; 从源串加载8个字
STMIA r1!, {r4-r11} ; 放入目的串
SUBS r3, r3, #1 ; 控制变量减少
BNE octcopy ; ... 继续

字符串拷贝程序设计(用LDM和STM实现)——续
LDMFD sp!, {r4-r11} ;
copywords
ANDS r2, r2, #7 ; 奇数字被拷贝
BEQ stop ; No words left to copy ?
wordcopy
LDR r3, [r0], #4 ; 从源串加载一个字且指针自增
STR r3, [r1], #4 ; 存储到目的串
SUBS r2, r2, #1 ; 字控制变量减少
BNE wordcopy ; 继续
stop
MOV r0, #0x18 ; 执行中止
LDR r1, =0x20026 ;
SWI 0x123456 ;
AREA BlockData, DATA, READWRITE
src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
END

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top