RosettaCodeData/Task/Leonardo-numbers/ARM-Assembly/leonardo-numbers.arm
2024-10-16 18:07:41 -07:00

143 lines
4 KiB
Text

/* ARM assembly Raspberry PI */
/* program numvinci.s */
/* REMARK 1 : this program use routines in a include file
see task Include a file language arm assembly
for the routine affichageMess conversion10
see at end of this program the instruction include */
/*******************************************/
/* Constantes */
/*******************************************/
.include "../constantes.inc"
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessDebutPgm: .asciz "Program 32 bits start. \n"
szCarriageReturn: .asciz "\n"
szMessFinOK: .asciz "Program normal end. \n"
szMessErreur: .asciz "Error !!!\n"
szMessVinci: .asciz "Leonardo numbers :\n"
szMessFibo: .asciz "\nFibonaci numbers :\n"
.align 4
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
.align 4
/*********************************/
/* code section */
/*********************************/
.text
.global main
main:
ldr r0,iAdrszMessDebutPgm
bl affichageMess @ start message
ldr r0,iAdrszMessVinci
bl affichageMess
mov r0,#0 @ rank
mov r1,#1 @ L(0) or L(n-2)
mov r2,#1 @ L(1) or L(n-1)
mov r3,#1 @ addition
mov r4,#25 @ maxi
bl genererVinci
ldr r0,iAdrszMessFibo
bl affichageMess
mov r0,#0
mov r1,#0
mov r2,#1
mov r3,#0
mov r4,#25
bl genererVinci
ldr r0,iAdrszMessFinOK
bl affichageMess
b 100f
99:
ldr r0,iAdrszMessErreur @ error
bl affichageMess
mov r0, #1 @ return code error
b 100f
100:
mov r7,#EXIT @ program end
svc #0 @ system call
iAdrszMessDebutPgm: .int szMessDebutPgm
iAdrszMessFinOK: .int szMessFinOK
iAdrszMessErreur: .int szMessErreur
iAdrsZoneConv: .int sZoneConv
iAdrszMessVinci: .int szMessVinci
iAdrszMessFibo: .int szMessFibo
/***************************************************/
/* Generation random number */
/***************************************************/
/* r0 contains n */
/* r1 contains L(0) */
/* r2 contains L(1) */
/* r3 contains addition */
/* r4 contains limit number */
genererVinci:
push {r5,r6,lr} @ save registers
mov r6,r0
cmp r4,#0 @ end compute ?
ble 100f
cmp r0,#0 @ L(0) ?
bne 1f
mov r0,r1
bl displayNumber
add r0,r6,#1 @ increment rank
sub r4,r4,#1 @ decrement counter
bl genererVinci
b 100f
1:
cmp r0,#1 @ L(1) ?
bne 2f
mov r0,r2
bl displayNumber
add r0,r6,#1
sub r4,r4,#1
bl genererVinci
b 100f
2:
add r5,r2,r1 @ add L(n-2) L(n-1)
add r5,r3 @ add addition
mov r0,r5
bl displayNumber
add r0,r6,#1
sub r4,r4,#1
mov r1,r2 @ L(n-1) -> L(n-2)
mov r2,r5 @ number -> L(n-1)
bl genererVinci
b 100f
100: @ end function
pop {r5,r6,pc} @ restaur registers
/***************************************************/
/* display number */
/***************************************************/
/* r0 contains number */
displayNumber:
push {r1,lr} @ save registers
ldr r1,iAdrsZoneConv
bl conversion10
ldr r0,iAdrsZoneConv
bl affichageMess
ldr r0,iAdrszCarriageReturn
bl affichageMess
100:
pop {r1,pc} @ restaur registers
iAdrszCarriageReturn: .int szCarriageReturn
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
.include "../affichage.inc"