97 lines
3.5 KiB
Plaintext
97 lines
3.5 KiB
Plaintext
/* 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"
|