RosettaCodeData/Task/Ackermann-function/ARM-Assembly/ackermann-function.arm

120 lines
3.4 KiB
Plaintext

/* ARM assembly Raspberry PI or android 32 bits */
/* program ackermann.s */
/* REMARK 1 : this program use routines in a include file
see task Include a file language arm assembly
for the routine affichageMess conversion10
see at end of this program the instruction include */
/* for constantes see task include a file in arm assembly */
/************************************/
/* Constantes */
/************************************/
.include "../constantes.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 r3,#0
mov r4,#0
1:
mov r0,r3
mov r1,r4
bl ackermann
mov r5,r0
mov r0,r3
ldr r1,iAdrsZoneConv @ else display odd message
bl conversion10 @ call decimal conversion
ldr r0,iAdrsMessResult
ldr r1,iAdrsZoneConv @ insert value conversion in message
bl strInsertAtCharInc
mov r6,r0
mov r0,r4
ldr r1,iAdrsZoneConv @ else display odd message
bl conversion10 @ call decimal conversion
mov r0,r6
ldr r1,iAdrsZoneConv @ insert value conversion in message
bl strInsertAtCharInc
mov r6,r0
mov r0,r5
ldr r1,iAdrsZoneConv @ else display odd message
bl conversion10 @ call decimal conversion
mov r0,r6
ldr r1,iAdrsZoneConv @ insert value conversion in message
bl strInsertAtCharInc
bl affichageMess
add r4,#1
cmp r4,#NMAXI
blt 1b
mov r4,#0
add r3,#1
cmp r3,#MMAXI
blt 1b
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc #0 @ perform the system call
iAdrszCarriageReturn: .int szCarriageReturn
iAdrsMessResult: .int sMessResult
iAdrsZoneConv: .int sZoneConv
/***************************************************/
/* fonction ackermann */
/***************************************************/
// r0 contains a number m
// r1 contains a number n
// r0 return résult
ackermann:
push {r1-r2,lr} @ save registers
cmp r0,#0
beq 5f
movlt r0,#-1 @ error
blt 100f
cmp r1,#0
movlt r0,#-1 @ error
blt 100f
bgt 1f
sub r0,r0,#1
mov r1,#1
bl ackermann
b 100f
1:
mov r2,r0
sub r1,r1,#1
bl ackermann
mov r1,r0
sub r0,r2,#1
bl ackermann
b 100f
5:
adds r0,r1,#1
bcc 100f
ldr r0,iAdrszMessError
bl affichageMess
bkpt
100:
pop {r1-r2,lr} @ restaur registers
bx lr @ return
iAdrszMessError: .int szMessError
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
.include "../affichage.inc"