Filter: Difference between revisions
Content added Content deleted
(→Insitux: implementation) |
VincentARM (talk | contribs) (add task to arm assembly raspberry pi) |
||
Line 480: | Line 480: | ||
{{Out}} |
{{Out}} |
||
<pre>{0, 2, 4, 6, 8, 10}</pre> |
<pre>{0, 2, 4, 6, 8, 10}</pre> |
||
=={{header|ARM Assembly}}== |
|||
{{works with|as|Raspberry Pi <br> or android 32 bits with application Termux}} |
|||
<syntaxhighlight lang ARM Assembly> |
|||
/* ARM assembly Raspberry PI */ |
|||
/* program filterdes.s */ |
|||
/************************************/ |
|||
/* Constantes */ |
|||
/************************************/ |
|||
/* for constantes see task include a file in arm assembly */ |
|||
.include "../constantes.inc" |
|||
/************************************/ |
|||
/* Initialized data */ |
|||
/************************************/ |
|||
.data |
|||
szMessResult: .asciz "Start array : " |
|||
szMessResultFil: .asciz "Filter array : " |
|||
szMessResultdest: .asciz "Same array : " |
|||
szMessStart: .asciz "Program 32 bits start.\n" |
|||
szCarriageReturn: .asciz "\n" |
|||
.align 4 |
|||
arrayNumber: .int 1,2,3,4,5,6,7,8,9,10 |
|||
.equ LGARRAY, (. - arrayNumber) / 4 |
|||
/************************************/ |
|||
/* UnInitialized data */ |
|||
/************************************/ |
|||
.bss |
|||
.align 4 |
|||
arrayNumberFil: .skip 4 * LGARRAY @ result array |
|||
sZoneConv: .skip 24 |
|||
/************************************/ |
|||
/* code section */ |
|||
/************************************/ |
|||
.text |
|||
.global main |
|||
main: |
|||
ldr r0,iAdrszMessStart @ display start message |
|||
bl affichageMess |
|||
ldr r0,iAdrszMessResult @ display message |
|||
bl affichageMess |
|||
ldr r5,iAdrarrayNumber @ start array address |
|||
mov r4,#0 @ index |
|||
1: |
|||
ldr r0,[r5,r4,lsl #2] @ load a value |
|||
ldr r1,iAdrsZoneConv |
|||
bl conversion10 @ décimal conversion |
|||
add r1,r1,r0 @ compute address end number |
|||
add r1,#2 @ add two characters |
|||
mov r0,#0 @ for limit the size of display number |
|||
strb r0,[r1] @ to store a final zero |
|||
ldr r0,iAdrsZoneConv |
|||
bl affichageMess @ display value |
|||
add r4,r4,#1 @ increment index |
|||
cmp r4,#LGARRAY @ end array ? |
|||
blt 1b @ no -> loop |
|||
ldr r0,iAdrszCarriageReturn |
|||
bl affichageMess |
|||
ldr r6,iAdrarrayNumberFil @ adrress result array |
|||
mov r4,#0 @ index |
|||
mov r3,#0 @ index result |
|||
2: |
|||
ldr r0,[r5,r4,lsl #2] @ load a value |
|||
tst r0,#1 @ odd ? |
|||
streq r0,[r6,r3,lsl #2] @ no -> store in result array |
|||
addeq r3,r3,#1 @ and increment result index |
|||
add r4,r4,#1 @ increment array index |
|||
cmp r4,#LGARRAY @ end ? |
|||
blt 2b @ no -> loop |
|||
ldr r0,iAdrszMessResultFil |
|||
bl affichageMess |
|||
mov r4,#0 @ init index |
|||
3: @ display filter result array |
|||
ldr r0,[r6,r4,lsl #2] |
|||
ldr r1,iAdrsZoneConv |
|||
bl conversion10 |
|||
add r1,r1,r0 |
|||
add r1,#2 |
|||
mov r0,#0 |
|||
strb r0,[r1] |
|||
ldr r0,iAdrsZoneConv |
|||
bl affichageMess |
|||
add r4,r4,#1 |
|||
cmp r4,r3 |
|||
blt 3b |
|||
ldr r0,iAdrszCarriageReturn |
|||
bl affichageMess |
|||
@ array destruction |
|||
mov r4,#0 @ index |
|||
mov r3,#0 @ index result |
|||
4: |
|||
ldr r0,[r5,r4,lsl #2] @ load a value |
|||
tst r0,#1 @ even ? |
|||
bne 6f |
|||
cmp r3,r4 @ index = no store |
|||
beq 5f |
|||
str r0,[r5,r3,lsl #2] @ store in free item on same array |
|||
5: |
|||
add r3,r3,#1 @ and increment result index |
|||
6: |
|||
add r4,r4,#1 @ increment array index |
|||
cmp r4,#LGARRAY @ end ? |
|||
blt 4b @ no -> loop |
|||
ldr r0,iAdrszMessResultdest |
|||
bl affichageMess |
|||
mov r4,#0 @ init index |
|||
7: @ display array |
|||
ldr r0,[r5,r4,lsl #2] |
|||
ldr r1,iAdrsZoneConv |
|||
bl conversion10 |
|||
add r1,r1,r0 |
|||
add r1,#2 |
|||
mov r0,#0 |
|||
strb r0,[r1] |
|||
ldr r0,iAdrsZoneConv |
|||
bl affichageMess |
|||
add r4,r4,#1 |
|||
cmp r4,r3 |
|||
blt 7b |
|||
ldr r0,iAdrszCarriageReturn |
|||
bl affichageMess |
|||
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 |
|||
iAdrszMessStart: .int szMessStart |
|||
iAdrarrayNumber: .int arrayNumber |
|||
iAdrszMessResult: .int szMessResult |
|||
iAdrarrayNumberFil: .int arrayNumberFil |
|||
iAdrszMessResultFil: .int szMessResultFil |
|||
iAdrszMessResultdest: .int szMessResultdest |
|||
iAdrsZoneConv: .int sZoneConv |
|||
/***************************************************/ |
|||
/* ROUTINES INCLUDE */ |
|||
/***************************************************/ |
|||
/* for this file see task include a file in language ARM assembly*/ |
|||
.include "../affichage.inc" |
|||
</syntaxhighlight> |
|||
{{Out}} |
|||
<pre> |
|||
Program 32 bits start. |
|||
Start array : 1 2 3 4 5 6 7 8 9 10 |
|||
Filter array : 2 4 6 8 10 |
|||
Same array : 2 4 6 8 10 |
|||
</pre> |
|||
=={{header|Arturo}}== |
=={{header|Arturo}}== |