Revenir au plan du site
Gestion des chaines de caractères en assembleur Z80
Conversion d'une chaine ASCII en entier 32 bits
; HL = chaine de caractères
; résultat dans DE:HL
atoi ; nom de cette fonction en langage C
exx
xor a ; on initialise le résultat à zéro
ld h,a : ld l,a : ld d,a : ld e,a
exx
ld a,(hl) : inc hl
sub 48 : jr c,.sortie
cp 10 : jr nc,.sortie
exx : ld l,a : exx ; on initialise la première unité
; itérations suivantes
.loop
ld a,(hl) : inc hl
sub 48 : jr c,.sortie
cp 10 : jr nc,.sortie
exx
; multiplication par 10 du nombre 32 bits DE:HL
add hl,hl : rl e : rl d ; multiplication par deux
push de,hl ; on sauvegarde notre nombre x 2
add hl,hl : rl e : rl d ; multiplication par quatre
add hl,hl : rl e : rl d ; multiplication par huit
; additionner la valeur x 2 à la valeur x 8 pour faire x 10
pop bc : add hl,bc
ex hl,de : pop bc : adc hl,bc : ex hl,de
ld b,0 : ld c,a : add hl,bc ; on ajoute la nouvelle unité au nombre
exx
jr .loop
.sortie
exx ; on active le jeu secondaire où est stocké notre résultat
ret
|
Recopie d'une chaine de caractères (terminateur à zéro)
; HL=chaine source
; DE=destination
strcpy
xor a
.loop
cp (hl)
ldi
jr nz,strcpy_loop
ret
|
Concaténer une chaine de caractères sur une autre
; HL=destination
; DE=chaine à concaténer
strcat
xor a
ld b,a
ld c,a
cpir
dec hl
ex hl,de
jp strcpy
|
Calculer la longueur d'une chaine de caractères
; HL=chaine source
; résultat dans HL
strlen
xor a
ld d,h : ld e,l ; copier le pointeur de la chaine
cpir
scf ; forcer la retenue pour créer un -1 supplémentaire à la soustraction
sbc hl,de ; soustraire le pointeur de fin moins un donne la longueur
ret
|
Comparer deux chaines de caractères
; HL=première chaine
; DE=deuxième chaine
; résultat dans le flag Z, Z=chaines identiques NZ=différentes
; en cas de chaines différentes, C=1 si la chaine en HL est plus forte, 0 sinon
strcmp
ld a,(de) ; lire le caractère de la première chaine
sub (hl) ; on réalise une soustraction avec celui de la deuxième
ret nz ; si les caractères sont différents, on quitte
add (hl) ; est-ce que les deux chaines sont terminées?
ret z
inc de
inc hl
jr strcmp
|