RosettaCodeData/Task/Van-Eck-sequence/AArch64-Assembly/van-eck-sequence.aarch64

101 lines
3.7 KiB
Plaintext

/* ARM assembly AARCH64 Raspberry PI 3B */
/* program vanEckSerie64.s */
/*******************************************/
/* Constantes file */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeConstantesARM64.inc"
.equ MAXI, 1000
/*********************************/
/* Initialized data */
/*********************************/
.data
sMessResultElement: .asciz " @ "
szCarriageReturn: .asciz "\n"
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
TableVanEck: .skip 8 * MAXI
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: // entry of program
mov x2,#0 // begin first element
mov x3,#0 // current counter
ldr x4,qAdrTableVanEck // table address
str x2,[x4,x3,lsl 3] // store first zéro
1: // begin loop
mov x5,x3 // init current indice
2:
sub x5,x5,1 // decrement
cmp x5,0 // end table ?
blt 3f
ldr x6,[x4,x5,lsl 3] // load element
cmp x6,x2 // and compare with the last element
bne 2b // not equal
sub x2,x3,x5 // else compute gap
b 4f
3:
mov x2,#0 // first, move zero to next element
4:
add x3,x3,#1 // increment counter
str x2,[x4,x3,lsl 3] // and store new element
cmp x3,MAXI
blt 1b
mov x2,0
5: // loop display ten elements
ldr x0,[x4,x2,lsl 3]
ldr x1,qAdrsZoneConv
bl conversion10 // call décimal conversion
ldr x0,qAdrsMessResultElement
ldr x1,qAdrsZoneConv // insert conversion in message
bl strInsertAtCharInc
mov x1,0 // final zéro
strb w1,[x0,5] //
bl affichageMess // display message
add x2,x2,1 // increment indice
cmp x2,10 // end ?
blt 5b // no -> loop
ldr x0,qAdrszCarriageReturn
bl affichageMess
mov x2,MAXI - 10
6: // loop display ten elements 990-999
ldr x0,[x4,x2,lsl 3]
ldr x1,qAdrsZoneConv
bl conversion10 // call décimal conversion
ldr x0,qAdrsMessResultElement
ldr x1,qAdrsZoneConv // insert conversion in message
bl strInsertAtCharInc
mov x1,0 // final zéro
strb w1,[x0,5] //
bl affichageMess // display message
add x2,x2,1 // increment indice
cmp x2,MAXI // end ?
blt 6b // no -> loop
ldr x0,qAdrszCarriageReturn
bl affichageMess
100: // standard end of the program
mov x0, 0 // return code
mov x8, EXIT // request to exit program
svc 0 // perform the system call
qAdrszCarriageReturn: .quad szCarriageReturn
qAdrsMessResultElement: .quad sMessResultElement
qAdrsZoneConv: .quad sZoneConv
qAdrTableVanEck: .quad TableVanEck
/********************************************************/
/* File Include fonctions */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"