Forum: Mikrocontroller und Digitale Elektronik Error: branch out of range


von Christoph K. (chriskuku)


Lesenswert?

Was mache ich bei diesem kleinen Assemblerprogramm falsch?
1
        .syntax unified
2
        .cpu    cortex-m4
3
        .fpu    fpv4-sp-d16
4
        .thumb
5
        .text
6
        .pool
7
        .global search,put
8
        .org 0x400
9
10
@@@@@@@@@@@@@@@@@@@@@@@@@
11
@ search list of WORDs in memory (2bytes), .asciz ... , .align 2
12
@        .word 0x1234 ; .asciz "apfel"  ; .align 2
13
@        .word 0x2345 ; .asciz "birne"  ; .align 2
14
@        .word 0xaaaa ; .asciz "banane" ; .align 2
15
@        .word 0
16
search: push {r0-r5,lr}
17
        ldr r4,= dict
18
1:      ldrh r1,[r4]   @ test next token word
19
        cbz r0,5f      @ not_found
20
        cmp r0,r1
21
        bne 3f
22
        mov r0,r4
23
        add r0,#2
24
        bl puts
25
        b 5f
26
2:      add r4,#2     @ advance word pointer to point to asciz
27
3:      ldrb r1,[r4],#1
28
        cbnz  r1,3b    @ skip until 0 >> diese Zeile macht den 28: Error: branch out of range
29
        mov r3,r4
30
        and r3,#1     @ is r4 odd?
31
        cbz r3,4f     @ r3/4 is even on branch
32
        add r4,#1
33
4:      b 1b
34
5:
35
        pop {r0-r5,pc}
36
37
        .pool
38
        .align 4
39
dict:   .hword 0x1234; .byte 'h','e','l','l',0 ; .align 2
40
        .hword 0x2345;  .byte 'w','o','r','l','d',0 ; .align 2
41
        .hword 0
42
        .end

Es gibt in Zeile 28 den Assemblerfehler Error: branch out of range.
Aber ich springe doch lediglich zu im Kontext nahen temporären Labels?
(Programmierfehler seien jetzt mal nicht betrachtet, habe das 
Progrämmchen noch nicht durchgetestet. Aber der Fehler hindert mich im 
Moment daran)

: Bearbeitet durch User
von Denis (Gast)


Lesenswert?

google sagt:
Restrictions

The branch destination must be within 4 to 130 bytes after the 
instruction and in the same execution state.

Das ist jedoch Prossesor abhänig...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Denis schrieb:
> The branch destination must be within 4 to 130 bytes after the
> instruction and in the same execution state.

Man kann also offenbar nur vorwärts springen.

Insofern haben sie entgegen der Doku halt noch mehr Unterschiede als ein 
explizites CMP+BNE.

von (prx) A. K. (prx)


Lesenswert?

Jörg W. schrieb:
> Insofern haben sie entgegen der Doku halt noch mehr Unterschiede als ein
> explizites CMP+BNE.

ARMv7-M Architecture Reference: "Compare and Branch on Non-Zero and 
Compare and Branch on Zero compares the value in a register with zero, 
and conditionally branches forward a constant value."

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Jo, aber bei Keil haben sie behauptet, es sei das gleiche wie CMP+BNE 
mit der Ausnahme, dass die Flags nicht gesetzt werden. Die andere 
Sprungweite ist halt noch eine zweite Ausnahme.

@Chris: musst du also so umschreiben:
1
3:      ldrb r1,[r4],#1
2
        cbz  r1,4f
3
        b    3b
4
4:

von Christoph K. (chriskuku)


Lesenswert?

Danke Euch allen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.