Chinaunix首页 | 论坛 | 博客
  • 博客访问: 806711
  • 博文数量: 489
  • 博客积分: 475
  • 博客等级: 下士
  • 技术积分: 3087
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 16:28
文章分类

全部博文(489)

文章存档

2013年(7)

2012年(301)

2011年(181)

分类:

2011-12-22 21:44:32

;

; 跳转表

;

 

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 -> 1r2 -> 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

阅读(625) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~