122 lines
3.4 KiB
Plaintext
122 lines
3.4 KiB
Plaintext
/* ARM assembly AARCH64 Raspberry PI 3B or android 64 bits */
|
|
/* program ackermann64.s */
|
|
|
|
/*******************************************/
|
|
/* Constantes file */
|
|
/*******************************************/
|
|
/* for this file see task include a file in language AArch64 assembly*/
|
|
.include "../includeConstantesARM64.inc"
|
|
.equ MMAXI, 4
|
|
.equ NMAXI, 10
|
|
|
|
/*********************************/
|
|
/* Initialized data */
|
|
/*********************************/
|
|
.data
|
|
sMessResult: .asciz "Result for @ @ : @ \n"
|
|
szMessError: .asciz "Overflow !!.\n"
|
|
szCarriageReturn: .asciz "\n"
|
|
|
|
/*********************************/
|
|
/* UnInitialized data */
|
|
/*********************************/
|
|
.bss
|
|
sZoneConv: .skip 24
|
|
/*********************************/
|
|
/* code section */
|
|
/*********************************/
|
|
.text
|
|
.global main
|
|
main: // entry of program
|
|
mov x3,#0
|
|
mov x4,#0
|
|
1:
|
|
mov x0,x3
|
|
mov x1,x4
|
|
bl ackermann
|
|
mov x5,x0
|
|
mov x0,x3
|
|
ldr x1,qAdrsZoneConv // else display odd message
|
|
bl conversion10 // call decimal conversion
|
|
ldr x0,qAdrsMessResult
|
|
ldr x1,qAdrsZoneConv // insert value conversion in message
|
|
bl strInsertAtCharInc
|
|
mov x6,x0
|
|
mov x0,x4
|
|
ldr x1,qAdrsZoneConv // else display odd message
|
|
bl conversion10 // call decimal conversion
|
|
mov x0,x6
|
|
ldr x1,qAdrsZoneConv // insert value conversion in message
|
|
bl strInsertAtCharInc
|
|
mov x6,x0
|
|
mov x0,x5
|
|
ldr x1,qAdrsZoneConv // else display odd message
|
|
bl conversion10 // call decimal conversion
|
|
mov x0,x6
|
|
ldr x1,qAdrsZoneConv // insert value conversion in message
|
|
bl strInsertAtCharInc
|
|
bl affichageMess
|
|
add x4,x4,#1
|
|
cmp x4,#NMAXI
|
|
blt 1b
|
|
mov x4,#0
|
|
add x3,x3,#1
|
|
cmp x3,#MMAXI
|
|
blt 1b
|
|
100: // standard end of the program
|
|
mov x0, #0 // return code
|
|
mov x8, #EXIT // request to exit program
|
|
svc #0 // perform the system call
|
|
|
|
qAdrszCarriageReturn: .quad szCarriageReturn
|
|
qAdrsMessResult: .quad sMessResult
|
|
qAdrsZoneConv: .quad sZoneConv
|
|
/***************************************************/
|
|
/* fonction ackermann */
|
|
/***************************************************/
|
|
// x0 contains a number m
|
|
// x1 contains a number n
|
|
// x0 return résult
|
|
ackermann:
|
|
stp x1,lr,[sp,-16]! // save registres
|
|
stp x2,x3,[sp,-16]! // save registres
|
|
cmp x0,0
|
|
beq 5f
|
|
mov x3,-1
|
|
csel x0,x3,x0,lt // error
|
|
blt 100f
|
|
cmp x1,#0
|
|
csel x0,x3,x0,lt // error
|
|
blt 100f
|
|
bgt 1f
|
|
sub x0,x0,#1
|
|
mov x1,#1
|
|
bl ackermann
|
|
b 100f
|
|
1:
|
|
mov x2,x0
|
|
sub x1,x1,#1
|
|
bl ackermann
|
|
mov x1,x0
|
|
sub x0,x2,#1
|
|
bl ackermann
|
|
b 100f
|
|
5:
|
|
adds x0,x1,#1
|
|
bcc 100f
|
|
ldr x0,qAdrszMessError
|
|
bl affichageMess
|
|
mov x0,-1
|
|
100:
|
|
|
|
ldp x2,x3,[sp],16 // restaur des 2 registres
|
|
ldp x1,lr,[sp],16 // restaur des 2 registres
|
|
ret
|
|
qAdrszMessError: .quad szMessError
|
|
|
|
/********************************************************/
|
|
/* File Include fonctions */
|
|
/********************************************************/
|
|
/* for this file see task include a file in language AArch64 assembly */
|
|
.include "../includeARM64.inc"
|