如何让这个ARM程序停止seg faulting?

时间:2016-03-21 00:41:21

标签: assembly arm

我正在尝试创建一个程序来计算我必须扫描的字符串的字符串长度。这就是我所拥有的,但它在ldrb r1, [r1]处出现了错误。我正在尝试增加地址以达到字符串中的下一个字符。

.section .data

.balign 4
scan_pattern: .asciz "%s"

.balign 4
string: .word 50

.balign 4
null_char: .byte '\0'

.balign 4
result: .asciz "%d"

.section .text
.global main

main:
    ldr r0, =scan_pattern
    ldr r1, =string
    bl scanf

    mov r0, #0
    ldrb r1, [r1]
    ldr r2, =null_char
    ldrb r2, [r2]
    bl count
count:
    cmp r1, r2
    bne incr
    bl end_pro

incr:
    add r1, r1, #1
    add r0, r0, #1
    bl count

end_pro:
    ldr r1, [r0]
    ldr r0, =result
    ldr r1, [r1]
    bl printf

    mov r0, $0
    bl fflush

    nop             @no operation
    mov r7, $1      @exit syscall
    svc $0          @wake kernel
    .end

1 个答案:

答案 0 :(得分:2)

r1可以/将被sscanf打击;你需要在通话后恢复它。 E.g。

ldr r4, =string
mov r1, r4
bl sscanf
...
ldr r1, [r4]      ; formerly: ldr r1, [r1]

但是乍一看,程序中似乎存在更多问题(第二次ldr r1, [r1]崩溃可能也是如此,bl并没有直接错误,但是简单的b跳跃会是更常见的是,你不会迭代字符串,...)。

我建议用C语言编写你的算法,编译它并在二进制文件中使用'objdump -d'来查看如何解决它......

编辑:

简单且未经测试的strlen()实现可能看起来像

@ size_t xstrlen(char const *s)
xstrlen:
    mov  r3, r0           @ char const *orig = s
1:
    ldrb r1, [r0], #1     @ char c = *s++;
    cmp  r1, #0           @ if (c != 0)
    bne  1b               @       goto 1;

    sub  r0, r0, r3       @ return s - orig - 1
    sub  r0, #1
    bx   lr

称之为

main:
    ldr r0, =scan_pattern
    ldr r1, =string
    bl  scanf

    ldr r0, =string
    bl  xstrlen

    mov r1, r0
    ldr r0, =result
    bl  printf