# strcpy en assembleur Risc-V, d’après Patterson et Hennessy # .globl _start # adresse de démarrage du programme pour l’éditeur de liens _start: # Afficher avant la a1, destination # charger l’adresse jal ra, print # affichage de la chaîne la x10, origine la x11, destination jal ra, strcpy_fun # Afficher après la a1, destination # charger l’adresse jal ra, print # affichage de la chaîne addi a0, x0, 0 # code de retour 0 addi a7, x0, 93 # le code de commande 93 ecall # Appel Linux pour finir ###### # fonction strlen : calcule la longueur d’une chaîne # a1 : pointeur sur le début de la chaîne # a2 : renvoyé avec la longueur strlen: mv t1, a1 # copie de a1 pour utilisation addi a2, zero, -1 # a2 <- -1 loop: lbu t2, 0(t1) # caractère courant addi a2, a2, 1 # un caractère de plus addi t1, t1, 1 # pointer sur le caractère suivant bne t2, zero,loop # encore ? ret ###### # fonction print : affiche une chaîne # a1 : pointeur sur la chaîne print: addi sp, sp, -4 # sauvegarde ra sur la pile sw ra, 0(sp) jal ra, strlen # fonction de calcul de la longueur addi a0, x0, 1 # 1 = StdOut addi a7, x0, 64 # appel système Linux write ecall # appel Linux écriture de la chaîne lw ra, 0(sp) # restauration de ra depuis la pile addi sp, sp,4 # pour l’adresse de retour ret ###### strcpy_fun: mv x12, x10 # p2 = adresse de origine[0] mv x13, x11 # p1 = adresse de destination[0] L1: lbu x28, 0(x12) # x28 <- origine[i] sb x28, 0(x13) # destination[i] <- x28 beq x28, x0, L2 # si octet nul -> fin addi x12, x12, 1 addi x13, x13, 1 jal x0, L1 L2: ret ###### .data destination: .string "destination\n" origine: .string "initiations\n"