Task

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.



Related tasks

   Loop over multiple arrays simultaneously
   Loops/Break
   Loops/Continue
   Loops/Do-while
   Loops/Downward for
   Loops/For
   Loops/For with a specified step
   Loops/Foreach
   Loops/Increment loop index within loop body
   Loops/Infinite
   Loops/N plus one half
   Loops/Nested
   Loops/While
   Loops/with multiple ranges


 
/* 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"
 