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