您的位置 首页 新品

ARM汇编语言源程序格局

Semihosting在ADS的C语言函数库中,某些ANSIC的功能是由主机的调试环境来提供的,这套机制有一个专门术语叫Semihosting。Semihosting通过…

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/264565.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部