ARM装配项目 - 查找子串

时间:2014-04-10 03:55:00

标签: string pointers assembly arm substring

我正在为学校制作一个项目,以便在一系列字符中查找子字符串。汇编程序从c调用并传递三个参数:数组(a1),起始索引(a2)和结束索引(a3)。

我现有的解决方案如下:

 .global mysubstring

 mysubstring:
 stmfd sp!, {v1-v6, lr}
 mov v1, a1 @copy array into a register
 mov v2, a2 @copy starting index into a register
 sub a1, a3, a2
 add a1, a1, #1 @finds how many bytes to request from malloc
 bl malloc @call c library routine to create a pointer to allocated space in a1
 loop:
 ldrbt v5, [v1], v2 @load byte located in v1, indexed by v2, into register v5
 strbt a1, [v5] @store byte located in v5 into a1
 add v2, v2, #1 @increment index
 cmp v2, a3 @check if we've reached the end
 ble loop 
 bl printf 
 ldmfd sp!, {v1-v6,pc}
 .end

我承认我对集会的理解非常差,可能搞砸了某些事情的含义。

每当我运行c程序时,汇编程序返回(null)。我有一种感觉,因为我没有正确地将项目添加到a1(我应该是吗?)。我相信malloc正在为我的子字符串指定所需的空间,我觉得错误在循环子例程中。

如果有人愿意,请给我一些关于从哪里开始的见解,我们将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:0)

您似乎使用了错误的寻址模式:

ldrbt v5, [v1], v2 @load byte located in v1, indexed by v2, into register v5

这是“注册后索引”模式,有效地做到了:

address = v1
v1 += v2
v5 = *address

请注意,每次加载后都会修改v1,因为后递增寻址会隐式写回索引的地址。

你想要的是“注册预索引”寻址,它将写成:

ldrbt v5, [v1, v2]