Algorithm ARM ldrb正在将Wt设置为-1
我在ARM中创建了一个函数,如果相同的字符存在于前一个位置,则该函数将删除重复的字符。如果找到一个,它将删除重复的字符并将所有值移到另一个字符上 第一个参数(r0)是要检查重复字符的索引,第二个参数(r1)是要查看的数组。例如,如果r0为3,r1指向“hello”,它将查看字符串('l')中的第三个元素,运行后,r1指向的字符串将变为“helo”,r0将返回1,在r0中 当前的问题是,第一个Algorithm ARM ldrb正在将Wt设置为-1,algorithm,assembly,arm,Algorithm,Assembly,Arm,我在ARM中创建了一个函数,如果相同的字符存在于前一个位置,则该函数将删除重复的字符。如果找到一个,它将删除重复的字符并将所有值移到另一个字符上 第一个参数(r0)是要检查重复字符的索引,第二个参数(r1)是要查看的数组。例如,如果r0为3,r1指向“hello”,它将查看字符串('l')中的第三个元素,运行后,r1指向的字符串将变为“helo”,r0将返回1,在r0中 当前的问题是,第一个ldrbr2[r1,r0]将r2设置为-1。我已经检查了ARM手册中的ldrb返回这样的错误,但是我没有找
ldrbr2[r1,r0]
将r2设置为-1。我已经检查了ARM手册中的ldrb
返回这样的错误,但是我没有找到类似的错误。我想知道是否有人知道解决办法
谢谢
check_if_duplicate:
push {r4, r5, lr}
@ Get character at value i in r4
ldrb r2, [r1, r0]
mov r3, #0
duplicate_loop:
@ Check if the target index is greater than the current index
cmp r0, r3
ble duplicate_done
@ Check if current index is a duplicate
ldrb r4, [r1, r3]
cmp r4, r2
@ Increment iterator and repeat loop if they are not equal
addne r3, r3, #1
bne duplicate_loop
@ If they are equal, then shift all values over
duplicate_shift_loop:
@ Find next value
add r3, r3, #1
@ Load next value
ldrb r2, [r1, r3]
@ Check if new value is the end of the array
cmp r2, #0
beq duplicate_shift_done
@ Use previous index to store value
sub r5, r3, #1
@ Store vaue in previous address
strb r2, [r1, r5]
@ Do process again
b duplicate_shift_loop
duplicate_shift_done:
@ Store string ending byte
sub r3, r3, #1
mov r2, #0
strb r2, [r1, r3]
@ Set 1 as the return value
mov r0, #1
b d_done
duplicate_done:
mov r0, #0
d_done:
pop {r4, r5, pc}
ldrb
应为零扩展该值,因此-1
有点不可能,您100%确定吗?(符号扩展可能有ldrsb
,但源代码中有正确的ldrb
)。您是否在调试器中看到0xFFFFFF,或者您如何知道它是-1?@Ped7g调用r2后,我使用GDB打印r2的值。以下是我的GDB会话的图片:。我使用的例子与上面使用的“hello”和3作为参数的例子相同。