我正在为学校制作一个项目,以便在一系列字符中查找子字符串。汇编程序从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正在为我的子字符串指定所需的空间,我觉得错误在循环子例程中。
如果有人愿意,请给我一些关于从哪里开始的见解,我们将不胜感激!
谢谢!
答案 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]