199 lines
6.4 KiB
Text
199 lines
6.4 KiB
Text
/* ARM assembly Raspberry PI */
|
|
/* program loopnrange.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 */
|
|
/*********************************/
|
|
/* Constantes */
|
|
/*********************************/
|
|
.equ STDOUT, 1 @ Linux output console
|
|
.equ EXIT, 1 @ Linux syscall
|
|
.equ WRITE, 4 @ Linux syscall
|
|
|
|
/*********************************/
|
|
/* Initialized data */
|
|
/*********************************/
|
|
.data
|
|
szMessResult: .ascii "" @ message result
|
|
sMessValeur: .fill 11, 1, ' '
|
|
szCarriageReturn: .asciz "\n"
|
|
/*********************************/
|
|
/* UnInitialized data */
|
|
/*********************************/
|
|
.bss
|
|
iSum: .skip 4 @ this program store sum and product in memory
|
|
iProd: .skip 4 @ it is possible to use registers r2 and r11
|
|
/*********************************/
|
|
/* code section */
|
|
/*********************************/
|
|
.text
|
|
.global main
|
|
main: @ entry of program
|
|
ldr r0,iAdriProd
|
|
mov r1,#1
|
|
str r1,[r0] @ init product
|
|
ldr r0,iAdriSum
|
|
mov r1,#0
|
|
str r1,[r0] @ init sum
|
|
|
|
mov r5,#5 @ x
|
|
mov r4,#-5 @ y
|
|
mov r6,#-2 @ z
|
|
mov r8,#1 @ one
|
|
mov r3,#3 @ three
|
|
mov r7,#7 @ seven
|
|
|
|
@ loop one
|
|
mov r0,#3
|
|
mov r1,#3
|
|
bl computePow @ compute 3 pow 3
|
|
mov r10,r0 @ save result
|
|
mvn r9,r3 @ r9 = - three
|
|
add r9,#1
|
|
1:
|
|
mov r0,r9
|
|
bl computeSumProd
|
|
add r9,r3 @ increment with three
|
|
cmp r9,r10
|
|
ble 1b
|
|
@ loop two
|
|
mvn r9,r7 @ r9 = - seven
|
|
add r9,#1
|
|
2:
|
|
mov r0,r9
|
|
bl computeSumProd
|
|
add r9,r5 @ increment with x
|
|
cmp r9,r7 @ compare to seven
|
|
ble 2b
|
|
|
|
@ loop three
|
|
mov r9,#550
|
|
sub r10,r9,r4 @ r10 = 550 - y
|
|
mov r9,#555
|
|
3:
|
|
mov r0,r9
|
|
bl computeSumProd
|
|
add r9,#1
|
|
cmp r9,r10
|
|
ble 3b
|
|
@ loop four
|
|
mov r9,#22
|
|
4:
|
|
mov r0,r9
|
|
bl computeSumProd
|
|
sub r9,r3 @ decrement with three
|
|
cmp r9,#-28
|
|
bge 4b
|
|
@ loop five
|
|
mov r9,#1927
|
|
ldr r10,iVal1939
|
|
5:
|
|
mov r0,r9
|
|
bl computeSumProd
|
|
add r9,#1
|
|
cmp r9,r10
|
|
ble 5b
|
|
@ loop six
|
|
mov r9,r5 @ r9 = x
|
|
mvn r10,r6 @ r10 = - z
|
|
add r10,#1
|
|
6:
|
|
mov r0,r9
|
|
bl computeSumProd
|
|
sub r9,r10
|
|
cmp r9,r4
|
|
bge 6b
|
|
@ loop seven
|
|
mov r0,r5
|
|
mov r1,#11
|
|
bl computePow @ compute 11 pow x
|
|
add r10,r0,r8 @ + one
|
|
mov r9,r0
|
|
7:
|
|
mov r0,r9
|
|
bl computeSumProd
|
|
add r9,#1
|
|
cmp r9,r10
|
|
ble 7b
|
|
@ display result
|
|
ldr r0,iAdriSum
|
|
ldr r0,[r0]
|
|
ldr r1,iAdrsMessValeur @ signed conversion value
|
|
bl conversion10S @ decimal conversion
|
|
ldr r0,iAdrszMessResult
|
|
bl affichageMess @ display message
|
|
ldr r0,iAdrszCarriageReturn
|
|
bl affichageMess @ display return line
|
|
ldr r0,iAdriProd
|
|
ldr r0,[r0]
|
|
ldr r1,iAdrsMessValeur @ conversion value
|
|
bl conversion10S @ signed decimal conversion
|
|
ldr r0,iAdrszMessResult
|
|
bl affichageMess @ display message
|
|
ldr r0,iAdrszCarriageReturn
|
|
bl affichageMess @ display return line
|
|
|
|
|
|
100: @ standard end of the program
|
|
mov r0, #0 @ return code
|
|
mov r7, #EXIT @ request to exit program
|
|
svc #0 @ perform the system call
|
|
|
|
iAdrsMessValeur: .int sMessValeur
|
|
iAdrszMessResult: .int szMessResult
|
|
iAdrszCarriageReturn: .int szCarriageReturn
|
|
iVal1939: .int 1939
|
|
/******************************************************************/
|
|
/* compute the sum and prod */
|
|
/******************************************************************/
|
|
/* r0 contains the number */
|
|
computeSumProd:
|
|
push {r1-r4,lr} @ save registers
|
|
asr r1,r0,#31
|
|
eor r2,r0,r1
|
|
sub r2,r2,r1 @ compute absolue value
|
|
//vidregtit somme
|
|
ldr r3,iAdriSum @ load sum
|
|
ldr r1,[r3]
|
|
add r1,r2 @ add sum
|
|
str r1,[r3] @ store sum
|
|
cmp r0,#0 @ j = 0 ?
|
|
beq 100f @ yes
|
|
ldr r3,iAdriProd
|
|
ldr r1,[r3]
|
|
asr r2,r1,#31 @ compute absolute value of prod
|
|
eor r4,r1,r2
|
|
sub r2,r4,r2
|
|
cmp r2,#1<<27 @ compare 2 puissance 27
|
|
bgt 100f
|
|
mul r1,r0,r1
|
|
str r1,[r3] @ store prod
|
|
100:
|
|
pop {r1-r4,lr} @ restaur registers
|
|
bx lr @ return
|
|
iAdriSum: .int iSum
|
|
iAdriProd: .int iProd
|
|
/******************************************************************/
|
|
/* compute pow */
|
|
/******************************************************************/
|
|
/* r0 contains pow */
|
|
/* r1 contains number */
|
|
computePow:
|
|
push {r1-r2,lr} @ save registers
|
|
mov r2,r0
|
|
mov r0,#1
|
|
1:
|
|
cmp r2,#0
|
|
ble 100f
|
|
mul r0,r1,r0
|
|
sub r2,#1
|
|
b 1b
|
|
100:
|
|
pop {r1-r2,lr} @ restaur registers
|
|
bx lr @ return
|
|
/***************************************************/
|
|
/* ROUTINES INCLUDE */
|
|
/***************************************************/
|
|
.include "../affichage.inc"
|