How to resolve the algorithm Loops/Break step by step in the AArch64 Assembly programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Loops/Break step by step in the AArch64 Assembly programming language

Table of Contents

Problem Statement

Show a loop which prints random numbers (each number newly generated each loop) from 0 to 19 (inclusive). If a number is 10, stop the loop after printing it, and do not generate any further numbers.
Otherwise, generate and print a second random number before restarting the loop.
If the number 10 is never generated as the first number in a loop, loop forever.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Loops/Break step by step in the AArch64 Assembly programming language

Source code in the aarch64 programming language

/* ARM assembly AARCH64 Raspberry PI 3B */
/*  program loopbreak64.s   */
 
/*******************************************/
/* Constantes file                         */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"

/*********************************/
/* Initialized data              */
/*********************************/
.data
szMessEndLoop: .asciz "loop break with value : \n"
szMessResult:  .asciz "Resultat = @ \n"      // message result

.align 4
qGraine:  .quad 12345678
/*********************************/
/* UnInitialized data            */
/*********************************/
.bss 
sZoneConv:               .skip 24
/*********************************/
/*  code section                 */
/*********************************/
.text
.global main 
main:                          // entry of program 
1:                             // begin loop 
    mov x4,20
2:
    mov x0,19
    bl genereraleas            // generate number
    cmp x0,10                  // compar value
    beq 3f                     // break if equal
    ldr x1,qAdrsZoneConv       // display value
    bl conversion10            // call function with 2 parameter (x0,x1)
    ldr x0,qAdrszMessResult
    ldr x1,qAdrsZoneConv
    bl strInsertAtCharInc      // insert result at third @ character
    bl affichageMess           // display message final
    subs x4,x4,1                 // decrement counter
    bgt 2b                     // loop if greather
    b 1b                       // begin loop one
 
3:
    mov x2,x0                  // save value
    ldr x0,qAdrszMessEndLoop
    bl affichageMess           // display message
    mov x0,x2
    ldr x1,qAdrsZoneConv                
    bl conversion10            // call function with 2 parameter (x0,x1)
    ldr x0,qAdrszMessResult
    ldr x1,qAdrsZoneConv
    bl strInsertAtCharInc      // insert result at third @ character
    bl affichageMess           // display message
 
100:                           // standard end of the program 
    mov x0,0                   // return code
    mov x8,EXIT                // request to exit program
    svc 0                      // perform the system call
 
qAdrsZoneConv:            .quad sZoneConv
qAdrszMessResult:         .quad szMessResult
qAdrszMessEndLoop:        .quad szMessEndLoop
 
/***************************************************/
/*   Generation random number                  */
/***************************************************/
/* x0 contains limit  */
genereraleas:
    stp x1,lr,[sp,-16]!    // save  registers
    stp x2,x3,[sp,-16]!    // save  registers
    ldr x3,qAdrqGraine     // load graine
    ldr x2,[x3]
    lsr x1,x2,17           // see xorshift on wikipedia
    eor x2,x2,x1
    lsl x1,x2,31
    eor x2,x2,x1
    lsr x1,x2,8
    eor x1,x2,x1
    str x1,[x3]            // save graine for the next call 
    udiv x1,x2,x0          // divide by value maxi
    msub x0,x1,x0,x2       // résult = remainder
100:                       // end function
    ldp x2,x3,[sp],16      // restaur  2 registers
    ldp x1,lr,[sp],16      // restaur  2 registers
    ret                    // return to address lr x30
/********************************************************************/
qAdrqGraine: .quad qGraine
/********************************************************/
/*        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 Terminal control/Display an extended character step by step in the J programming language
You may also check:How to resolve the algorithm Modular inverse step by step in the Common Lisp programming language
You may also check:How to resolve the algorithm Bitwise operations step by step in the Sidef programming language
You may also check:How to resolve the algorithm Sierpinski pentagon step by step in the C++ programming language
You may also check:How to resolve the algorithm Knuth shuffle step by step in the M4 programming language