199 lines
6.7 KiB
Text
199 lines
6.7 KiB
Text
/* ARM assembly AARCH64 Raspberry PI 3B */
|
|
/* program loopnrange64.s */
|
|
|
|
/*******************************************/
|
|
/* Constantes file */
|
|
/*******************************************/
|
|
/* for this file see task include a file in language AArch64 assembly*/
|
|
.include "../includeConstantesARM64.inc"
|
|
|
|
/*********************************/
|
|
/* Initialized data */
|
|
/*********************************/
|
|
.data
|
|
szMessResult: .asciz "@ \n" // message result
|
|
szCarriageReturn: .asciz "\n"
|
|
/*********************************/
|
|
/* UnInitialized data */
|
|
/*********************************/
|
|
.bss
|
|
qSum: .skip 8 // this program store sum and product in memory
|
|
qProd: .skip 8 // it is possible to use registers x22 and x28
|
|
sZoneConv: .skip 24
|
|
/*********************************/
|
|
/* code section */
|
|
/*********************************/
|
|
.text
|
|
.global main
|
|
main: // entry of program
|
|
ldr x0,qAdrqProd
|
|
mov x1,1
|
|
str x1,[x0] // init product
|
|
ldr x0,qAdrqSum
|
|
mov x1,0
|
|
str x1,[x0] // init sum
|
|
|
|
mov x25,5 // x
|
|
mov x24,-5 // y
|
|
mov x26,-2 // z
|
|
mov x21,1 // one
|
|
mov x23,3 // three
|
|
mov x27,7 // seven
|
|
|
|
// loop one
|
|
mov x0,3
|
|
mov x1,3
|
|
bl computePow // compute 3 pow 3
|
|
mov x20,x0 // save result
|
|
mvn x9,x23 // x9 = - three
|
|
add x9,x9,1
|
|
1:
|
|
mov x0,x9
|
|
bl computeSumProd
|
|
add x9,x9,x23 // increment with three
|
|
cmp x9,x20
|
|
ble 1b
|
|
// loop two
|
|
mvn x9,x27 // x9 = - seven
|
|
add x9,x9,1
|
|
2:
|
|
mov x0,x9
|
|
bl computeSumProd
|
|
add x9,x9,x25 // increment with x
|
|
cmp x9,x27 // compare to seven
|
|
ble 2b
|
|
|
|
// loop three
|
|
mov x9,#550
|
|
sub x20,x9,x24 // x20 = 550 - y
|
|
mov x9,#555
|
|
3:
|
|
mov x0,x9
|
|
bl computeSumProd
|
|
add x9,x9,#1
|
|
cmp x9,x20
|
|
ble 3b
|
|
// loop four
|
|
mov x9,#22
|
|
4:
|
|
mov x0,x9
|
|
bl computeSumProd
|
|
sub x9,x9,x23 // decrement with three
|
|
cmp x9,#-28
|
|
bge 4b
|
|
// loop five
|
|
mov x9,1927
|
|
mov x20,1939
|
|
5:
|
|
mov x0,x9
|
|
bl computeSumProd
|
|
add x9,x9,1
|
|
cmp x9,x20
|
|
ble 5b
|
|
// loop six
|
|
mov x9,x25 // x9 = x
|
|
mvn x20,x26 // x20 = - z
|
|
add x20,x20,1
|
|
6:
|
|
mov x0,x9
|
|
bl computeSumProd
|
|
sub x9,x9,x20
|
|
cmp x9,x24
|
|
bge 6b
|
|
// loop seven
|
|
mov x0,x25
|
|
mov x1,11
|
|
bl computePow // compute 11 pow x
|
|
add x20,x0,x21 // + one
|
|
mov x9,x0
|
|
7:
|
|
mov x0,x9
|
|
bl computeSumProd
|
|
add x9,x9,1
|
|
cmp x9,x20
|
|
ble 7b
|
|
// display result
|
|
ldr x0,qAdrqSum
|
|
ldr x0,[x0]
|
|
ldr x1,qAdrsZoneConv // signed conversion value
|
|
bl conversion10S // decimal conversion
|
|
ldr x0,qAdrszMessResult
|
|
ldr x1,qAdrsZoneConv
|
|
bl strInsertAtCharInc // insert result at @ character
|
|
bl affichageMess // display message
|
|
ldr x0,qAdrszCarriageReturn
|
|
bl affichageMess // display return line
|
|
ldr x0,qAdrqProd
|
|
ldr x0,[x0]
|
|
ldr x1,qAdrsZoneConv // conversion value
|
|
bl conversion10S // signed decimal conversion
|
|
ldr x0,qAdrszMessResult
|
|
ldr x1,qAdrsZoneConv
|
|
bl strInsertAtCharInc // insert result at @ character
|
|
bl affichageMess // display message
|
|
ldr x0,qAdrszCarriageReturn
|
|
bl affichageMess // display return line
|
|
|
|
|
|
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
|
|
qAdrszCarriageReturn: .quad szCarriageReturn
|
|
/******************************************************************/
|
|
/* compute the sum and prod */
|
|
/******************************************************************/
|
|
/* x0 contains the number */
|
|
computeSumProd:
|
|
stp x1,lr,[sp,-16]! // save registers
|
|
asr x10,x0,#63
|
|
eor x12,x10,x0
|
|
sub x12,x12,x10 // compute absolue value
|
|
ldr x13,qAdrqSum // load sum
|
|
ldr x11,[x13]
|
|
add x11,x11,x12 // add sum
|
|
str x11,[x13] // store sum
|
|
cmp x0,#0 // j = 0 ?
|
|
beq 100f // yes
|
|
ldr x13,qAdrqProd
|
|
ldr x11,[x13]
|
|
asr x12,x11,#63 // compute absolute value of prod
|
|
eor x14,x11,x12
|
|
sub x12,x14,x12
|
|
ldr x10,qVal2P27
|
|
cmp x12,x10 // compare 2 puissance 27
|
|
bgt 100f
|
|
mul x11,x0,x11
|
|
str x11,[x13] // store prod
|
|
100:
|
|
ldp x1,lr,[sp],16 // restaur 2 registers
|
|
ret // return to address lr x230
|
|
qAdrqSum: .quad qSum
|
|
qAdrqProd: .quad qProd
|
|
qVal2P27: .quad 1<<27
|
|
/******************************************************************/
|
|
/* compute pow */
|
|
/******************************************************************/
|
|
/* x0 contains pow */
|
|
/* x1 contains number */
|
|
computePow:
|
|
stp x1,lr,[sp,-16]! // save registers
|
|
mov x12,x0
|
|
mov x0,#1
|
|
1:
|
|
cmp x12,#0
|
|
ble 100f
|
|
mul x0,x1,x0
|
|
sub x12,x12,#1
|
|
b 1b
|
|
100:
|
|
ldp x1,lr,[sp],16 // restaur 2 registers
|
|
ret // return to address lr x230
|
|
/********************************************************/
|
|
/* File Include fonctions */
|
|
/********************************************************/
|
|
/* for this file see task include a file in language AArch64 assembly */
|
|
.include "../includeARM64.inc"
|