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 :
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 .section .data mess: .ascii "Hello The World!\n\r" .equ end,.
On remarque que les caractères se lisent de droite à gauche : 0x48 (H), 0x54(e), 0xC6(l), ..., 0x64(d), 0x21(!).
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.
Et le code assembleur :
J'ai volontairement isolé dans un fichier include, le paramétrage de l'UART.
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
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 :
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 @ -------- @ @ 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
Où se trouve mon problème ?
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 >
@+
Partager