How to resolve the algorithm Abelian sandpile model step by step in the AArch64 Assembly programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Abelian sandpile model step by step in the AArch64 Assembly programming language

Table of Contents

Problem Statement

Implement the Abelian sandpile model also known as Bak–Tang–Wiesenfeld model. Its history, mathematical definition and properties can be found under its wikipedia article. The task requires the creation of a 2D grid of arbitrary size on which "piles of sand" can be placed. Any "pile" that has 4 or more sand particles on it collapses, resulting in four particles being subtracted from the pile and distributed among its neighbors. It is recommended to display the output in some kind of image format, as terminal emulators are usually too small to display images larger than a few dozen characters tall. As an example of how to accomplish this, see the Bitmap/Write a PPM file task. Examples up to 2^30, wow! javascript running on web Examples:

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Abelian sandpile model step by step in the AArch64 Assembly programming language

Source code in the aarch64 programming language

/* ARM assembly AARCH64 Raspberry PI 3B or android 64 bits */
/*  program abelian64.s   */ 

/* run : abelian 256 12 12  */

/*******************************************/
/* Constantes file                         */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
.equ MAXI, 25

/*********************************/
/* Initialized data              */
/*********************************/
.data
szMessValue:        .asciz "@ "
szMessErrParam:     .asciz "error : command line = abelian size posx posy  \n"
szMessFin:          .asciz "End display :\n"
szCarriageReturn:   .asciz "\n"
 
/*********************************/
/* UnInitialized data            */
/*********************************/
.bss
sZoneConv:        .skip 24
iSandPile:        .skip 8 * MAXI * MAXI
/*********************************/
/*  code section                 */
/*********************************/
.text
.global main 
main:                            // entry of program 
    mov fp,sp
    ldr x4,[fp]                  // load number of parameters command line
    cmp x4,#3                    // < 4 -> error
    ble 99f
    add x0,fp,#32                // load address param 4 = pos y
    ldr x0,[x0]
    bl conversionAtoD            // conversion ascii -> numeric
    mov x3,x0
    add x0,fp,#24                // load address param 3 = pos x
    ldr x0,[x0]
    bl conversionAtoD
    mov x2,x0
    add x0,fp,#16                 // load address param 2 = size begin pile
    ldr x0,[x0]
    bl conversionAtoD
    ldr x4,qAdriSandPile
    mov x5,#MAXI
    madd x5,x3,x5,x2              // compute offset = maxi * y + x
    str x0,[x4,x5,lsl #3]         // and store size in pos x,y
    //mov x0,x4                   // display start position
    //bl displaySandPile
    
    mov x0,x4                     // sandpile address
    mov x1,x2                     // pos x to start
    mov x2,x3                     // pos y to start
    bl addSand
    
    ldr x0,qAdrszMessFin
    bl affichageMess
    mov x0,x4
    bl displaySandPile
    b 100f
99:                               // line command error
   ldr x0,qAdrszMessErrParam
   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
qAdrsZoneConv:            .quad sZoneConv
qAdrszMessErrParam:       .quad szMessErrParam
qAdrszMessFin:            .quad szMessFin
qAdriSandPile:            .quad iSandPile
/***************************************************/
/*     display  sandpile               */
/***************************************************/
// x0 contains address to sandpile
displaySandPile:
    stp x1,lr,[sp,-16]!         // save  registres
    stp x2,x3,[sp,-16]!         // save  registres
    stp x4,x5,[sp,-16]!         // save  registres
    stp x6,x7,[sp,-16]!         // save  registres
    mov x6,x0
    mov x3,#0                   // indice y
    mov x4,#MAXI
1:
    mov x2,#0                   // indice x
2:
    madd x5,x3,x4,x2            // compute offset
    ldr x0,[x6,x5,lsl #3]       // load value at pos x,y
    ldr x1,qAdrsZoneConv
    bl conversion10             // call decimal conversion
    add x1,x1,1
    mov x7,#0
    strb w7,[x1,x0]
    ldr x0,qAdrszMessValue
    ldr x1,qAdrsZoneConv        // insert value conversion in message
    bl strInsertAtCharInc
    bl affichageMess
    add x2,x2,1
    cmp x2,MAXI
    blt 2b
    ldr x0,qAdrszCarriageReturn
    bl affichageMess
    add x3,x3,1
    cmp x3,MAXI
    blt 1b

100:
    ldp x6,x7,[sp],16         // restaur des  2 registres
    ldp x4,x5,[sp],16         // restaur des  2 registres
    ldp x2,x3,[sp],16         // restaur des  2 registres
    ldp x1,lr,[sp],16         // restaur des  2 registres
    ret
qAdrszMessValue:       .quad szMessValue
/***************************************************/
/*     display  sandpile               */
/***************************************************/
// x0 contains address to sanspile
// x1 contains position x
// x2 contains position y
addSand:
    stp x1,lr,[sp,-16]!         // save  registres
    stp x2,x3,[sp,-16]!         // save  registres
    stp x4,x5,[sp,-16]!         // save  registres
    mov x3,#MAXI
    madd x4,x3,x2,x1            // compute offset
    ldr x5,[x0,x4,lsl #3]
1:
    cmp x5,#4                   // 4 grains ?
    blt 100f
    sub x5,x5,4                 // yes sustract
    str x5,[x0,x4,lsl #3]
    cmp x1,MAXI-1               // right position ok ?
    beq 2f
    add x1,x1,1                 // yes
    bl add1Sand                 // add 1 grain
    bl addSand                  // and compute new pile
    sub x1,x1,1
2:
    cmp x1,0                    // left position ok ?
    beq 3f
    sub x1,x1,1
    bl add1Sand
    bl addSand
    add x1,x1,1
3:
    cmp x2,0                    // higt position ok ?
    beq 4f
    sub x2,x2,1
    bl add1Sand
    bl addSand
    add x2,x2,1
4:
    cmp x2,MAXI-1               // low position ok ?
    beq 5f
    add x2,x2,1
    bl add1Sand
    bl addSand
    sub x2,x2,1
5:
   ldr x5,[x0,x4,lsl #3]       // reload value
   b 1b                        // and loop
100:
    ldp x4,x5,[sp],16         // restaur des  2 registres
    ldp x2,x3,[sp],16         // restaur des  2 registres
    ldp x1,lr,[sp],16         // restaur des  2 registres
    ret
/***************************************************/
/*     add 1 grain of sand              */
/***************************************************/
// x0 contains address to sanspile
// x1 contains position x
// x2 contains position y
add1Sand:
    stp x3,lr,[sp,-16]!       // save  registres
    stp x4,x5,[sp,-16]!       // save  registres
    mov x3,#MAXI
    madd x4,x3,x2,x1          // compute offset
    ldr x5,[x0,x4,lsl #3]     // load value at pos x,y
    add x5,x5,1
    str x5,[x0,x4,lsl #3]     // and store 
100:
    ldp x4,x5,[sp],16         // restaur des  2 registres
    ldp x3,lr,[sp],16         // restaur des  2 registres
    ret
/********************************************************/
/*        File Include fonctions                        */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"

  

You may also check:How to resolve the algorithm Call an object method step by step in the FutureBasic programming language
You may also check:How to resolve the algorithm Happy numbers step by step in the Logo programming language
You may also check:How to resolve the algorithm Loops/Downward for step by step in the ERRE programming language
You may also check:How to resolve the algorithm Special characters step by step in the TXR programming language
You may also check:How to resolve the algorithm Boustrophedon transform step by step in the Nim programming language