2016-03-21 2 views
0

Я пытаюсь создать программу, которая вычисляет длину строки строки, которую я должен проверять. Это то, что у меня есть, но это seg ошибки на ldrb r1, [r1]. Я пытаюсь увеличить адрес, чтобы достигнуть следующего символа внутри строки.Как мне заставить эту программу ARM прекратить сегрегацию?

.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 
+0

Вы s Вы знаете, что означает директива '.word'? – EOF

+0

Это потому, что R1 не сохраняется вызовом 'scanf'. У вашего кода есть и ряд других ошибок. –

ответ

2

r1 может/будет затерт от sscanf; вам необходимо восстановить его после вызова. Например.

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

Но на первый взгляд, кажется, больше проблем в программе (второй ldr r1, [r1] аварии, вероятно, также, bl не прямо так, но простой b прыжок будет больше обычного, вы не перебирать Струна, ...).

Я предлагаю написать свой алгоритм в C, скомпилировать его и посмотреть с «objdump -d» в двоичном, чтобы получить представление о том, как решить эту проблему ...

EDIT:

Простой и непроверенные 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 
+0

Спасибо! Я не знаю, хотите ли вы помочь, но как мне сравнить, чтобы определить, находится ли она в конце строки? Потому что, что я только что застрял. –

Смежные вопросы