J'ai réussi à faire le petit programme finalement très simple de prendre un message de la RAM pour la mettre sur le TTY.
Malheureusement, si tout compile bien, rien ne s'affiche.
J'ai trouvé pourquoi : au démarrage de la simulation, le SPARC (comme tous les ordinateurs il me semble) se met dans la position RESET et démarre.
Or, si j'ai bien touvé un code en MIPS (c'est sur cette machine que j'ai appris à faire de l'assembleur), je n'arrive pas à le transformer...
Enfin, presque pas : en particulier, j'ai lu la DOC du SPARC (presque) en entier (295 pages...) et je ne vois pas de registres utilisés pour l'OS (comme dans le MIPS les registres 27 et 28...
Voici donc mon code :
.extern _stack
.extern _gp
.text
.align 2
/* Modification de SR -> kernel avec IT */
sethi %hi(_edata), %o0
or %o0, %lo(_edata), %o0
sethi %hi(_edata), %o1
or %o1, %lo(_edata), %o1
/* mov 0, %l2 */
sethi %hi(_stack), %sp
or %sp, %lo(_stack), %sp
sub %sp, 4, %sp
sethi %hi(_gp), %g1
or %g1, %lo(_gp), %g1
J'ai donc remplacé le jmpl par le call (en commentaire sur cette version...) et ça compile... mais ça n'affiche rien ...
Voici donc mes questions :
1°) Pourquoi ce message d'erreur ?
2°) Comment faire pour le corriger car je pense que CALL n'est pas une bonne solution.
PS : Le principe de ce RESET est de mettre main0 en mémoire pour démarrer. Le main0 doit juste faire la commande d'affiche uputs que voici :
uputs_adr:
ldsb [ %o1 ], %o3 /*chargement du caractère pointé vers un registre local*/
addcc %o3, 0, %o3 /*Z=0 si le caractère est 0円*/
be end_uputs_adr /*si caractère = 0,円 fin de chaine*/
add %o1, 1, %o1 /* on incrémente le pointeur de caractère*/
loop: stb %o3, [ %o0 ] /*sinon, on écrit le caractère à l'adresse du TTY*/
ldsb [ %o1 ], %o3 /* on charge le caractère*/
addcc %o3, 0, %o3 /*Z=0 si le caractère est 0円*/
bne loop /*si caractère != 0,円 on recommence*/
add %o1, 1, %o1 /* on incrémente le pointeur de caractère*/
end_uputs_adr:
retl
nop
Et voici le main0 pour que, j'espère, ce soit plus clair :
/* #define TTY_BASE 0xC0000000 */
int main0(void)
{
uputs_adr(0xC0000000,"Salut les gens, c'est moi le SPARC\n"); /* 0xC0000000 est l'adresse de mon TTY suivant mon architecture.*/
return 0;
}
# Finalement, j'ai avancé !!!
Posté par Pierre Jacquier . En réponse au message Problème SPARC et assembleur. Évalué à 1.
Malheureusement, si tout compile bien, rien ne s'affiche.
J'ai trouvé pourquoi : au démarrage de la simulation, le SPARC (comme tous les ordinateurs il me semble) se met dans la position RESET et démarre.
Or, si j'ai bien touvé un code en MIPS (c'est sur cette machine que j'ai appris à faire de l'assembleur), je n'arrive pas à le transformer...
Enfin, presque pas : en particulier, j'ai lu la DOC du SPARC (presque) en entier (295 pages...) et je ne vois pas de registres utilisés pour l'OS (comme dans le MIPS les registres 27 et 28...
Voici donc mon code :
.extern _stack
.extern _gp
.text
.align 2
/* Modification de SR -> kernel avec IT */
sethi %hi(_edata), %o0
or %o0, %lo(_edata), %o0
sethi %hi(_edata), %o1
or %o1, %lo(_edata), %o1
/* mov 0, %l2 */
sethi %hi(_stack), %sp
or %sp, %lo(_stack), %sp
sub %sp, 4, %sp
sethi %hi(_gp), %g1
or %g1, %lo(_gp), %g1
sethi %hi(main0), %l0
or %l0, %lo(main0), %l0
/* ld [%l0 + %lo(main0)], %l0 */
jmpl main0, %l0
nop
/* call main0
nop */
Voici ce que gcc, en utilisant l'option du SPARC bien éidemment :) me répond :
/dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-gcc -c main.c
/dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-as reset.s -oreset.o
/dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-as uputs_sparc.s -o uputs_sparc.o
/dsk/l1/misc/Bench/soc/cxtools/gcc_sparc/obj/bin/sparc-soclib-elf-ld -T./ldscript -o sparc_soft.x main.o reset.o uputs_sparc.o
./reset.o(.text+0x2c): relocation truncated to fit: R_SPARC_13 main0
reset.o(.text+0x2c): relocation truncated to fit: R_SPARC_13 main0
make: *** [sparc_soft.x] Error 1
J'ai donc remplacé le jmpl par le call (en commentaire sur cette version...) et ça compile... mais ça n'affiche rien ...
Voici donc mes questions :
1°) Pourquoi ce message d'erreur ?
2°) Comment faire pour le corriger car je pense que CALL n'est pas une bonne solution.
PS : Le principe de ce RESET est de mettre main0 en mémoire pour démarrer. Le main0 doit juste faire la commande d'affiche uputs que voici :
.text
.global uputs_adr
.type uputs_adr, #function
/*; .set noreorder */
/* uputs_adr(adresses_physique, texte)*/
uputs_adr:
ldsb [ %o1 ], %o3 /*chargement du caractère pointé vers un registre local*/
addcc %o3, 0, %o3 /*Z=0 si le caractère est 0円*/
be end_uputs_adr /*si caractère = 0,円 fin de chaine*/
add %o1, 1, %o1 /* on incrémente le pointeur de caractère*/
loop: stb %o3, [ %o0 ] /*sinon, on écrit le caractère à l'adresse du TTY*/
ldsb [ %o1 ], %o3 /* on charge le caractère*/
addcc %o3, 0, %o3 /*Z=0 si le caractère est 0円*/
bne loop /*si caractère != 0,円 on recommence*/
add %o1, 1, %o1 /* on incrémente le pointeur de caractère*/
end_uputs_adr:
retl
nop
Et voici le main0 pour que, j'espère, ce soit plus clair :
/* #define TTY_BASE 0xC0000000 */
int main0(void)
{
uputs_adr(0xC0000000,"Salut les gens, c'est moi le SPARC\n"); /* 0xC0000000 est l'adresse de mon TTY suivant mon architecture.*/
return 0;
}