Arithmetic/Integer: Difference between revisions
Content deleted Content added
No edit summary |
mNo edit summary |
||
Line 370: | Line 370: | ||
.global main |
.global main |
||
main: |
main: |
||
push {fp,lr} |
push {fp,lr} @ save des 2 registres |
||
add fp,sp,#8 |
add fp,sp,#8 @ fp <- adresse début |
||
ldr r0,[fp] @ recup number of parameter in command line |
ldr r0,[fp] @ recup number of parameter in command line |
||
cmp r0,#3 |
cmp r0,#3 |
||
blt error |
blt error |
||
ldr r0,[fp,#8] @ adresse of 1er number |
ldr r0,[fp,#8] @ adresse of 1er number |
||
bl conversionAtoD |
bl conversionAtoD |
||
mov r3,r0 |
mov r3,r0 |
||
ldr r0,[fp,#12] @ adresse of 2eme number |
ldr r0,[fp,#12] @ adresse of 2eme number |
||
bl conversionAtoD |
bl conversionAtoD |
||
mov r4,r0 |
mov r4,r0 |
||
@ addition |
@ addition |
||
add r0,r3,r4 |
add r0,r3,r4 |
||
ldr r1,iAdrsMessValeur |
ldr r1,iAdrsMessValeur @ result in r0 |
||
bl conversion10S @ call function with 2 parameter (r0,r1) |
bl conversion10S @ call function with 2 parameter (r0,r1) |
||
ldr r0,iAdrszMessResult |
ldr r0,iAdrszMessResult |
||
bl affichageMess @ display message |
bl affichageMess @ display message |
||
Line 394: | Line 394: | ||
sub r0,r3,r4 |
sub r0,r3,r4 |
||
ldr r1,=sMessValeur |
ldr r1,=sMessValeur |
||
bl conversion10S @ call function with 2 parameter (r0,r1) |
bl conversion10S @ call function with 2 parameter (r0,r1) |
||
ldr r0,iAdrszMessResult |
ldr r0,iAdrszMessResult |
||
bl affichageMess @ display message |
bl affichageMess @ display message |
||
Line 405: | Line 405: | ||
mul r0,r3,r4 |
mul r0,r3,r4 |
||
ldr r1,=sMessValeur |
ldr r1,=sMessValeur |
||
bl conversion10S @ call function with 2 parameter (r0,r1) |
bl conversion10S @ call function with 2 parameter (r0,r1) |
||
ldr r0,iAdrszMessResult |
ldr r0,iAdrszMessResult |
||
bl affichageMess @ display message |
bl affichageMess @ display message |
||
Line 417: | Line 417: | ||
mov r1,r4 |
mov r1,r4 |
||
bl division |
bl division |
||
mov r0,r2 @ quotient |
mov r0,r2 @ quotient |
||
ldr r1,=sMessValeur |
ldr r1,=sMessValeur |
||
bl conversion10S @ call function with 2 parameter (r0,r1) |
bl conversion10S @ call function with 2 parameter (r0,r1) |
||
ldr r0,iAdrszMessResult |
ldr r0,iAdrszMessResult |
||
bl affichageMess @ display message |
bl affichageMess @ display message |
||
Line 427: | Line 427: | ||
bl affichageMess @ display message |
bl affichageMess @ display message |
||
mov r0,r3 @ remainder |
mov r0,r3 @ remainder |
||
ldr r1,=sMessValeur |
ldr r1,=sMessValeur |
||
bl conversion10S @ call function with 2 parameter (r0,r1) |
bl conversion10S @ call function with 2 parameter (r0,r1) |
||
ldr r0,iAdrszMessResult |
ldr r0,iAdrszMessResult |
||
bl affichageMess @ display message |
bl affichageMess @ display message |
||
Line 444: | Line 444: | ||
mov r0, #1 @ return code |
mov r0, #1 @ return code |
||
100: /* end of program */ |
100: /* end of program */ |
||
mov r7, #EXIT @ request to exit program |
mov r7, #EXIT @ request to exit program |
||
swi 0 @ perform the system call |
swi 0 @ perform the system call |
||
iAdrsMessValeur: .int sMessValeur |
iAdrsMessValeur: .int sMessValeur |
||
Line 459: | Line 459: | ||
/* r0 contient l adresse du message */ |
/* r0 contient l adresse du message */ |
||
affichageMess: |
affichageMess: |
||
push {fp,lr} /* save des 2 registres */ |
push {fp,lr} /* save des 2 registres */ |
||
push {r0,r1,r2,r7} |
push {r0,r1,r2,r7} /* save des autres registres */ |
||
mov r2,#0 /* compteur longueur */ |
mov r2,#0 /* compteur longueur */ |
||
1: /*calcul de la longueur */ |
1: /*calcul de la longueur */ |
||
ldrb r1,[r0,r2] /* recup octet position debut + indice */ |
ldrb r1,[r0,r2] /* recup octet position debut + indice */ |
||
cmp r1,#0 /* si 0 c est fini */ |
cmp r1,#0 /* si 0 c est fini */ |
||
beq 1f |
beq 1f |
||
add r2,r2,#1 /* sinon on ajoute 1 */ |
add r2,r2,#1 /* sinon on ajoute 1 */ |
||
b 1b |
b 1b |
||
1: /* donc ici r2 contient la longueur du message */ |
1: /* donc ici r2 contient la longueur du message */ |
||
mov r1,r0 /* adresse du message en r1 */ |
mov r1,r0 /* adresse du message en r1 */ |
||
mov r0,#STDOUT /* code pour écrire sur la sortie standard Linux */ |
mov r0,#STDOUT /* code pour écrire sur la sortie standard Linux */ |
||
mov r7, #WRITE |
mov r7, #WRITE /* code de l appel systeme 'write' */ |
||
swi #0 |
swi #0 /* appel systeme */ |
||
pop {r0,r1,r2,r7} |
pop {r0,r1,r2,r7} /* restaur des autres registres */ |
||
pop {fp,lr} /* restaur des 2 registres */ |
pop {fp,lr} /* restaur des 2 registres */ |
||
bx lr /* retour procedure */ |
bx lr /* retour procedure */ |
||
/***************************************************/ |
/***************************************************/ |
||
Line 482: | Line 482: | ||
/* r1 contient l adresse de la zone de conversion */ |
/* r1 contient l adresse de la zone de conversion */ |
||
conversion10S: |
conversion10S: |
||
push {fp,lr} /* save des 2 registres frame et retour */ |
push {fp,lr} /* save des 2 registres frame et retour */ |
||
push {r0-r5} /* save autres registres */ |
push {r0-r5} /* save autres registres */ |
||
mov r2,r1 /* debut zone stockage */ |
mov r2,r1 /* debut zone stockage */ |
||
mov r5,#'+' /* par defaut le signe est + */ |
mov r5,#'+' /* par defaut le signe est + */ |
||
cmp r0,#0 /* nombre négatif ? */ |
cmp r0,#0 /* nombre négatif ? */ |
||
movlt r5,#'-' /* oui le signe est - */ |
movlt r5,#'-' /* oui le signe est - */ |
||
mvnlt r0,r0 /* et inversion en valeur positive */ |
mvnlt r0,r0 /* et inversion en valeur positive */ |
||
addlt r0,#1 |
addlt r0,#1 |
||
mov r4,#10 /* longueur de la zone */ |
mov r4,#10 /* longueur de la zone */ |
||
1: /* debut de boucle de conversion */ |
1: /* debut de boucle de conversion */ |
||
bl divisionpar10 /* division */ |
bl divisionpar10 /* division */ |
||
add r1,#48 |
add r1,#48 /* ajout de 48 au reste pour conversion ascii */ |
||
strb r1,[r2,r4] /* stockage du byte en début de zone r5 + la position r4 */ |
strb r1,[r2,r4] /* stockage du byte en début de zone r5 + la position r4 */ |
||
sub r4,r4,#1 |
sub r4,r4,#1 /* position précedente */ |
||
cmp r0,#0 |
cmp r0,#0 |
||
bne 1b |
bne 1b /* boucle si quotient different de zéro */ |
||
strb r5,[r2,r4] /* stockage du signe à la position courante */ |
strb r5,[r2,r4] /* stockage du signe à la position courante */ |
||
subs r4,r4,#1 /* position précedente */ |
subs r4,r4,#1 /* position précedente */ |
||
blt 100f |
blt 100f /* si r4 < 0 fin */ |
||
/* sinon il faut completer le debut de la zone avec des blancs */ |
/* sinon il faut completer le debut de la zone avec des blancs */ |
||
mov r3,#' ' /* caractere espace */ |
mov r3,#' ' /* caractere espace */ |
||
2: |
2: |
||
strb r3,[r2,r4] /* stockage du byte */ |
strb r3,[r2,r4] /* stockage du byte */ |
||
subs r4,r4,#1 /* position précedente */ |
subs r4,r4,#1 /* position précedente */ |
||
bge 2b /* boucle si r4 plus grand ou egal a zero */ |
bge 2b /* boucle si r4 plus grand ou egal a zero */ |
||
100: /* fin standard de la fonction */ |
100: /* fin standard de la fonction */ |
||
pop {r0-r5} /*restaur des autres registres */ |
pop {r0-r5} /*restaur des autres registres */ |
||
pop {fp,lr} /* restaur des 2 registres frame et retour */ |
pop {fp,lr} /* restaur des 2 registres frame et retour */ |
||
bx lr |
bx lr |
||
Line 540: | Line 540: | ||
/* r0 contient l adresse de la zone terminée par 0 ou 0A */ |
/* r0 contient l adresse de la zone terminée par 0 ou 0A */ |
||
conversionAtoD: |
conversionAtoD: |
||
push {fp,lr} /* save des 2 registres */ |
push {fp,lr} /* save des 2 registres */ |
||
push {r1-r7} /* save des autres registres */ |
push {r1-r7} /* save des autres registres */ |
||
mov r1,#0 |
mov r1,#0 |
||
mov r2,#10 /* facteur */ |
mov r2,#10 /* facteur */ |
||
mov r3,#0 /* compteur */ |
mov r3,#0 /* compteur */ |
||
mov r4,r0 /* save de l adresse dans r4 */ |
mov r4,r0 /* save de l adresse dans r4 */ |
||
mov r6,#0 /* signe positif par defaut */ |
mov r6,#0 /* signe positif par defaut */ |
||
mov r0,#0 /* initialisation à 0 */ |
mov r0,#0 /* initialisation à 0 */ |
||
1: /* boucle d élimination des blancs du debut */ |
1: /* boucle d élimination des blancs du debut */ |
||
ldrb r5,[r4,r3] /* chargement dans r5 de l octet situé au debut + la position */ |
ldrb r5,[r4,r3] /* chargement dans r5 de l octet situé au debut + la position */ |
||
cmp r5,#0 /* fin de chaine -> fin routine */ |
cmp r5,#0 /* fin de chaine -> fin routine */ |
||
beq 100f |
beq 100f |
||
cmp r5,#0x0A |
cmp r5,#0x0A /* fin de chaine -> fin routine */ |
||
beq 100f |
beq 100f |
||
cmp r5,#' ' |
cmp r5,#' ' /* blanc au début */ |
||
bne 1f /* non on continue */ |
bne 1f /* non on continue */ |
||
add r3,r3,#1 /* oui on boucle en avançant d un octet */ |
add r3,r3,#1 /* oui on boucle en avançant d un octet */ |
||
b 1b |
b 1b |
||
1: |
1: |
||
cmp r5,#'-' |
cmp r5,#'-' /* premier caracteres est - */ |
||
moveq r6,#1 /* maj du registre r6 avec 1 */ |
moveq r6,#1 /* maj du registre r6 avec 1 */ |
||
beq 3f /* puis on avance à la position suivante */ |
beq 3f /* puis on avance à la position suivante */ |
||
2: /* debut de boucle de traitement des chiffres */ |
2: /* debut de boucle de traitement des chiffres */ |
||
cmp r5,#'0' /* caractere n est pas un chiffre */ |
cmp r5,#'0' /* caractere n est pas un chiffre */ |
||
blt 3f |
blt 3f |
||
cmp r5,#'9' /* caractere n est pas un chiffre */ |
cmp r5,#'9' /* caractere n est pas un chiffre */ |
||
bgt 3f |
bgt 3f |
||
/* caractère est un chiffre */ |
/* caractère est un chiffre */ |
||
sub r5,#48 |
sub r5,#48 |
||
ldr r1,iMaxi /*verifier le dépassement du registre */ |
ldr r1,iMaxi /*verifier le dépassement du registre */ |
||
cmp r0,r1 |
cmp r0,r1 |
||
bgt 99f |
bgt 99f |
||
mul r0,r2,r0 |
mul r0,r2,r0 /* multiplier par facteur */ |
||
add r0,r5 /* ajout à r0 */ |
add r0,r5 /* ajout à r0 */ |
||
3: |
3: |
||
add r3,r3,#1 /* avance à la position suivante */ |
add r3,r3,#1 /* avance à la position suivante */ |
||
ldrb r5,[r4,r3] /* chargement de l octet */ |
ldrb r5,[r4,r3] /* chargement de l octet */ |
||
cmp r5,#0 /* fin de chaine -> fin routine */ |
cmp r5,#0 /* fin de chaine -> fin routine */ |
||
beq 4f |
beq 4f |
||
cmp r5,#10 /* fin de chaine -> fin routine */ |
cmp r5,#10 /* fin de chaine -> fin routine */ |
||
beq 4f |
beq 4f |
||
b 2b /* boucler */ |
b 2b /* boucler */ |
||
4: |
4: |
||
cmp r6,#1 /* test du registre r6 pour le signe */ |
cmp r6,#1 /* test du registre r6 pour le signe */ |
||
bne 100f |
bne 100f |
||
mov r1,#-1 |
mov r1,#-1 |
||
mul r0,r1,r0 /* si negatif, on multiplie par -1 */ |
mul r0,r1,r0 /* si negatif, on multiplie par -1 */ |
||
b 100f |
b 100f |
||
99: /* erreur de dépassement */ |
99: /* erreur de dépassement */ |
||
ldr r1,=szMessErrDep |
ldr r1,=szMessErrDep |
||
bl afficheerreur |
bl afficheerreur |
||
mov r0,#0 /* en cas d |
mov r0,#0 /* en cas d erreur on retourne toujours zero */ |
||
100: |
100: |
||
pop {r1-r7} /* restaur des autres registres */ |
pop {r1-r7} /* restaur des autres registres */ |
||
pop {fp,lr} /* restaur des 2 registres */ |
pop {fp,lr} /* restaur des 2 registres */ |
||
bx lr /* retour procedure */ |
bx lr /* retour procedure */ |
||
/* constante programme */ |
/* constante programme */ |
||
Line 609: | Line 609: | ||
/* r3 contains R */ |
/* r3 contains R */ |
||
push {r4, lr} |
push {r4, lr} |
||
mov r2, #0 |
mov r2, #0 /* r2 ? 0 */ |
||
mov r3, #0 |
mov r3, #0 /* r3 ? 0 */ |
||
mov r4, #32 |
mov r4, #32 /* r4 ? 32 */ |
||
b 2f |
b 2f |
||
1: |
1: |
||
Line 622: | Line 622: | ||
2: |
2: |
||
subs r4, r4, #1 /* r4 ? r4 - 1 */ |
subs r4, r4, #1 /* r4 ? r4 - 1 */ |
||
bpl 1b /* if r4 >= 0 (N=0) then branch to .Lloop1 */ |
bpl 1b /* if r4 >= 0 (N=0) then branch to .Lloop1 */ |
||
pop {r4, lr} |
pop {r4, lr} |