Salut à tous.

J'ai un problème pourtant fort simple, mais je n'arrive pas à trouver la solution.
Je suis dans en train de tester, en Bare Metal ARM sur une raspberry Pi Zero W, le mode UART.
Le problème n'est pas dans la gestion de l'UART qui fonctionne parfaitement (enfin, je crois).
J'utilise pour l'assemblage : "arm-none-eabi-as".

Pour l'instant, je mets un caractère en hexadécimal (0x65 = A) dans un registre que j'envoi vers mon écran COM4 sous windows.
Ca fonctionne très bien, puisque j'ai à l'affichage le caractère en question à l'écran.

Oui mais voilà, je préfère gérer une chaîne de caractères. J'ai crée une zone dans la section .data, que voici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
        .section .data

mess:   .ascii  "Hello The World!\n\r"
        .equ    end,.
et voilà le résultat de l'assemblage de cette zone :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
Déassemblage de la section .data*:

00000000 <mess>:
   0:   6c6c6548        cfstr64vs       mvdx6, [ip], #-288      ; 0xfffffee0
   4:   6854206f        ldmdavs r4, {r0, r1, r2, r3, r5, r6, sp}^
   8:   6f572065        svcvs   0x00572065
   c:   21646c72        smccs   18114   ; 0x46c2
  10:   Adresse 0x00000010 hors intervalle.
On remarque que les caractères se lisent de droite à gauche : 0x48 (H), 0x54(e), 0xC6(l), ..., 0x64(d), 0x21(!).

Et le code assembleur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
@ ======================================================== @
@                                                          @
@ -------------------------------------------------------- @
@         Raspberry PI Zero / BCM2835 (Cortex-a7)          @
@ ======================================================== @

        .cpu    cortex-a7               @ RPi zero W
        .global _start

@ --------------- @
@ Storage Section @
@ --------------- @

        .section .data

mess:   .ascii  "Hello The World!\n\r"
        .equ    end,.

        .section .stack

        .include "init.asm"

@ -------------- @
@ Send a Message @
@ -------------- @

loop:   ldr     r2,=mess                @ Begin of Message
        ldr     r3,=end                 @ End   of Message

loop1:  ldrb    r1,[r2]                 @ Loading a Character
        bl      send                    @ send a character
        bl      delay

        add     r2,r2,#1
        cmp     r2,r3
        blt     loop1

        b       loop                    @ Infinite Loop

        .ltorg

@ ----------------- @
@ Subroutine : send @
@ ----------------- @

send:   push    {r2-r12,lr}

        str     r1,[r0,#0x40]
send1:  ldr     r2,[r0,#0x54]
        tst     r2,#0x20
        beq     send1

        pop     {r2-r12,lr}
        bx      lr

        .ltorg

@ ------------------ @
@ Subroutine : delay @
@ ------------------ @

delay:  push    {r0-r12,lr}

        ldr     r0,=0x00100000          @ Counter

delay1: sub     r0,r0,#1
        cmp     r0,#0
        bgt     delay1

        pop     {r0-r12,lr}
        bx      lr

        .ltorg
J'ai volontairement isolé dans un fichier include, le paramétrage de l'UART.
La seule information utile est contenu dans le registre 0.

La ligne qui me pose problème est celle où il y a le commentaire "@Loading a character".

A l'affichage, je n'obtiens pas la chaine de caractères, mais un caractère, genre pavé qui signifie que le code hexa > 0x7F.
C'est à ne rien y comprendre !!!

J'utilise maintenant l'assembleur "as" pour tester ce cas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@ -------- @
@ Messages @
@ -------- @

        .section .data
mess:   .ascii  "Hello the World!\n"
        .equ    end,.

        .section .stack
        .section .text

@ ---------- @
@ Initialize @
@ ---------- @

        .global main
main:   push    {r1-r12,lr}

        ldr     r0,=mess
        ldr     r1,=end

loop:   ldrb    r2,[r0]

        bl      reg

        add     r0,r0,#1
        cmp     r0,r1
        blt     loop

@ ---- @
@ Exit @
@ ---- @

        mov     r0,#0                   @ return code 0

        pop     {r1-r12,lr}
        bx      lr
A l'exécution, j'ai bien ce que je veux dans le registre 2, que voici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Reg 0  :  00021024   Reg 1  :  00021035   Reg 2  :  00000048   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  00021025   Reg 1  :  00021035   Reg 2  :  00000065   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  00021026   Reg 1  :  00021035   Reg 2  :  0000006C   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  00021027   Reg 1  :  00021035   Reg 2  :  0000006C   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  00021028   Reg 1  :  00021035   Reg 2  :  0000006F   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  00021029   Reg 1  :  00021035   Reg 2  :  00000020   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  0002102A   Reg 1  :  00021035   Reg 2  :  00000074   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  0002102B   Reg 1  :  00021035   Reg 2  :  00000068   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  0002102C   Reg 1  :  00021035   Reg 2  :  00000065   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  0002102D   Reg 1  :  00021035   Reg 2  :  00000020   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  0002102E   Reg 1  :  00021035   Reg 2  :  00000057   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  0002102F   Reg 1  :  00021035   Reg 2  :  0000006F   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  00021030   Reg 1  :  00021035   Reg 2  :  00000072   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  00021031   Reg 1  :  00021035   Reg 2  :  0000006C   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  00021032   Reg 1  :  00021035   Reg 2  :  00000064   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  00021033   Reg 1  :  00021035   Reg 2  :  00000021   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

Reg 0  :  00021034   Reg 1  :  00021035   Reg 2  :  0000000A   Reg 3  :  000103D0
Reg 4  :  00000000   Reg 5  :  000105F4   Reg 6  :  000102E0   Reg 7  :  00000000
Reg 8  :  00000000   Reg 9  :  00000000   Reg A  :  B6FAE000   Reg B  :  00000000
Reg C  :  BEF1DB30

>
Où se trouve mon problème ?

@+