Arrays: Difference between revisions
Content added Content deleted
No edit summary |
(add task to ARM64 assembly Raspberry Pi) |
||
Line 178: | Line 178: | ||
[1,"one", 2, "two"] |
[1,"one", 2, "two"] |
||
</lang> |
</lang> |
||
=={{header|AArch64 Assembly}}== |
|||
{{works with|as|Raspberry Pi 3B version Buster 64 bits}} |
|||
<lang AArch64 Assembly> |
|||
/* ARM assembly AARCH64 Raspberry PI 3B */ |
|||
/* program areaString64.s */ |
|||
/*******************************************/ |
|||
/* Constantes file */ |
|||
/*******************************************/ |
|||
/* for this file see task include a file in language AArch64 assembly*/ |
|||
.include "../includeConstantesARM64.inc" |
|||
/*******************************************/ |
|||
/* Initialized data */ |
|||
/*******************************************/ |
|||
.data |
|||
szMessStringsch: .ascii "The string is at item : @ \n" |
|||
szCarriageReturn: .asciz "\n" |
|||
szMessStringNfound: .asciz "The string is not found in this area.\n" |
|||
/* areas strings */ |
|||
szString1: .asciz "Apples" |
|||
szString2: .asciz "Oranges" |
|||
szString3: .asciz "Pommes" |
|||
szString4: .asciz "Raisins" |
|||
szString5: .asciz "Abricots" |
|||
/* pointer items area 1*/ |
|||
tablesPoi1: |
|||
pt1_1: .quad szString1 |
|||
pt1_2: .quad szString2 |
|||
pt1_3: .quad szString3 |
|||
pt1_4: .quad szString4 |
|||
ptVoid_1: .quad 0 |
|||
ptVoid_2: .quad 0 |
|||
ptVoid_3: .quad 0 |
|||
ptVoid_4: .quad 0 |
|||
ptVoid_5: .quad 0 |
|||
szStringSch: .asciz "Raisins" |
|||
szStringSch1: .asciz "Ananas" |
|||
/*******************************************/ |
|||
/* UnInitialized data */ |
|||
/*******************************************/ |
|||
.bss |
|||
sZoneConv: .skip 30 |
|||
/*******************************************/ |
|||
/* code section */ |
|||
/*******************************************/ |
|||
.text |
|||
.global main |
|||
main: // entry of program |
|||
// add string 5 to area |
|||
ldr x1,qAdrtablesPoi1 // begin pointer area 1 |
|||
mov x0,0 // counter |
|||
1: // search first void pointer |
|||
ldr x2,[x1,x0,lsl 3] // read string pointer address item x0 (4 bytes by pointer) |
|||
cmp x2,0 // is null ? |
|||
cinc x0,x0,ne // no increment counter |
|||
bne 1b // and loop |
|||
// store pointer string 5 in area at position x0 |
|||
ldr x2,qAdrszString5 // address string 5 |
|||
str x2,[x1,x0,lsl 3] // store address |
|||
// display string at item 3 |
|||
mov x2,2 // pointers begin in position 0 |
|||
ldr x1,qAdrtablesPoi1 // begin pointer area 1 |
|||
ldr x0,[x1,x2,lsl 3] |
|||
bl affichageMess |
|||
ldr x0,qAdrszCarriageReturn |
|||
bl affichageMess |
|||
// search string in area |
|||
ldr x1,qAdrszStringSch |
|||
//ldr x1,qAdrszStringSch1 // uncomment for other search : not found !! |
|||
ldr x2,qAdrtablesPoi1 // begin pointer area 1 |
|||
mov x3,0 |
|||
2: // search |
|||
ldr x0,[x2,x3,lsl 3] // read string pointer address item x0 (4 bytes by pointer) |
|||
cbz x0,3f // is null ? end search |
|||
bl comparString |
|||
cmp x0,0 // string = ? |
|||
cinc x3,x3,ne // no increment counter |
|||
bne 2b // and loop |
|||
mov x0,x3 // position item string |
|||
ldr x1,qAdrsZoneConv // conversion decimal |
|||
bl conversion10S |
|||
ldr x0,qAdrszMessStringsch |
|||
ldr x1,qAdrsZoneConv |
|||
bl strInsertAtCharInc // insert result at @ character |
|||
bl affichageMess |
|||
b 100f |
|||
3: // end search string not found |
|||
ldr x0,qAdrszMessStringNfound |
|||
bl affichageMess |
|||
100: // standard end of the program |
|||
mov x0, 0 // return code |
|||
mov x8,EXIT // request to exit program |
|||
svc 0 // perform the system call |
|||
qAdrtablesPoi1: .quad tablesPoi1 |
|||
qAdrszMessStringsch: .quad szMessStringsch |
|||
qAdrszString5: .quad szString5 |
|||
qAdrszStringSch: .quad szStringSch |
|||
qAdrszStringSch1: .quad szStringSch1 |
|||
qAdrsZoneConv: .quad sZoneConv |
|||
qAdrszMessStringNfound: .quad szMessStringNfound |
|||
qAdrszCarriageReturn: .quad szCarriageReturn |
|||
/************************************/ |
|||
/* Strings comparaison */ |
|||
/************************************/ |
|||
/* x0 et x1 contains strings addresses */ |
|||
/* x0 return 0 if equal */ |
|||
/* return -1 if string x0 < string x1 */ |
|||
/* return 1 if string x0 > string x1 */ |
|||
comparString: |
|||
stp x2,lr,[sp,-16]! // save registers |
|||
stp x3,x4,[sp,-16]! // save registers |
|||
mov x2,#0 // indice |
|||
1: |
|||
ldrb w3,[x0,x2] // one byte string 1 |
|||
ldrb w4,[x1,x2] // one byte string 2 |
|||
cmp w3,w4 |
|||
blt 2f // less |
|||
bgt 3f // greather |
|||
cmp w3,#0 // 0 final |
|||
beq 4f // equal and end |
|||
add x2,x2,#1 // |
|||
b 1b // else loop |
|||
2: |
|||
mov x0,#-1 // less |
|||
b 100f |
|||
3: |
|||
mov x0,#1 // greather |
|||
b 100f |
|||
4: |
|||
mov x0,#0 // equal |
|||
b 100f |
|||
100: |
|||
ldp x3,x4,[sp],16 // restaur 2 registers |
|||
ldp x2,lr,[sp],16 // restaur 2 registers |
|||
ret // return to address lr x30 |
|||
/********************************************************/ |
|||
/* File Include fonctions */ |
|||
/********************************************************/ |
|||
/* for this file see task include a file in language AArch64 assembly */ |
|||
.include "../includeARM64.inc" |
|||
</lang> |
|||
=={{header|ABAP}}== |
=={{header|ABAP}}== |
||
There are no real arrays in ABAP but a construct called internal tables. |
There are no real arrays in ABAP but a construct called internal tables. |