全部博文(489)
分类:
2011-12-22 21:44:32
原文地址:ARM汇编编程 跳转表(老师写的) 作者:luozhiyong131
;
; 跳转表
;
FUNC_NUM EQU 4 ;功能数
AREA jmpData, DATA, READWRITE
str1 dcb "The first string.", 0
str2 dcb "The second string.", 0
str3 dcb "second", 0
buf space 64
AREA jmpCode, CODE, READONLY
ENTRY
start
mov r0, #0 ;功能号,求串长度
ldr r1, =str1
bl string
mov r0, #1 ;串拷贝
ldr r1, =str1
ldr r2, =buf
bl string
mov r0, #2 ;串比较
ldr r1, =str1
ldr r2, =str2
bl string
mov r0, #3 ;求子字符串
ldr r1, =str2
ldr r2, =str3
bl string
stop
mov r0, #0x18
ldr r1, =0x20026
swi 0x123456
;字符串处理跳转表函数
;string
;入口参数:r0 -> 功能号
; 其它参数依功能不同而不同
;出口参数:依功能不同而不同
string
cmp r0, #FUNC_NUM
bmi dostr
mov pc, lr ;出错返回
dostr
ldr v8, =strTable
ldr pc, [v8, r0, lsl#2] ;跳到功能函数执行
strTable DCD strLen
DCD strCpy
DCD strCmp
DCD strStr
;求串长度
;入口参数:r1 -> 串首地址
;出口参数:r0 -> 串长度
strLen
mov r0, #0
lenloop
ldrb v8, [r1, r0]
cmp v8, #0
moveq pc, lr ;返回
add r0, r0, #1
b lenloop
;串拷贝
;入口参数:r1 -> 源串,r2 -> 目的缓冲区
strCpy
ldrb v8, [r1], #1
strb v8, [r2], #1
cmp v8, #0
bne strCpy
mov pc, lr ;返回
;串比较
;入口参数:r1 -> 串1,r2 -> 串2
;出口参数:r0,>0 =0 <0
strCmp
ldrb v7, [r1], #1
ldrb v8, [r2], #1
subs r0, v7, v8
movne pc, lr ;返回
cmp v7, #0
moveq pc, lr ;返回
b strCmp
;求子字符串
;入口参数:r1 -> 源串,r2 -> 子串
;出口参数:r0 =0不存在,否则返回子串地址
strStr
mov v8, #0 ;源串回溯点
strloop
mov v7, #0 ;子串匹配位置
mov v6, v8 ;源串匹配位置
loopnext
ldrb v5, [r1, v6]
ldrb v4, [r2, v7]
cmp v4, v5
beq istail
cmp v4, #0
beq found ;子串到达尾部
cmp v5, #0
beq notfound ;源串到达尾部
;回溯查找
add v8, v8, #1
b strloop
istail ;是否同时到达尾部
cmp v4, #0
beq found
add v6, v6, #1
add v7, v7, #1
b loopnext
found
add r0, r1, v8
mov pc, lr
notfound
mov r0, #0
mov pc, lr
END