• [^] # Finalement, j'ai avancé

    Posté par . En réponse au message Problème SPARC et assembleur. Évalué à 1.

    J'ai réussi à faire un petit programme en fait très simple pour charger un texte de la RAM et le mettre sur le TTY, le 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


    MAIS il n'affiche rien. Je me suis rendu compte qu'en fait, c'est parceque, dans ma simulation, je ne faisais pas de reset, c'est à dire que, lorsque le processeur demarre, il charge l'instruction reset en premier, et il fallait donc que je crée un programme assembleur pour lire le code de mon programme mis en mémoire.
    Voici donc mon code de RESET :

    .extern _stack
    .extern _gp

    .text
    .align 2

    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 */


    OR ceci ne marche pas, car gcc me renvoie ce message :

    /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+0x24): relocation truncated to fit: R_SPARC_13 main0
    reset.o(.text+0x24): relocation truncated to fit: R_SPARC_13 main0
    make: *** [sparc_soft.x] Error 1

    J'ai donc remplacé mon jmpl par le call en commentaire, et là ça compile, masi ça n'affiche toujours rien. Je précise que le main0 est le suivant :

    int main0(void)
    {
    uputs_adr(0xC0000000,"Salut les gens, c'est moi le SPARC\n");
    return 0;
    }

    Et là, je dois avouer que je ne vois plus du tout pourquoi ça plante...