Algorithm ARM ldrb正在将Wt设置为-1

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返回这样的错误,但是我没有找

我在ARM中创建了一个函数,如果相同的字符存在于前一个位置,则该函数将删除重复的字符。如果找到一个,它将删除重复的字符并将所有值移到另一个字符上

第一个参数(r0)是要检查重复字符的索引,第二个参数(r1)是要查看的数组。例如,如果r0为3,r1指向“hello”,它将查看字符串('l')中的第三个元素,运行后,r1指向的字符串将变为“helo”,r0将返回1,在r0中

当前的问题是,第一个
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作为参数的例子相同。