String matching: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
(add task to ARM64 assembly Raspberry Pi) |
||
Line 62: | Line 62: | ||
CD |
CD |
||
</pre> |
</pre> |
||
=={{header|AArch64 Assembly}}== |
|||
{{works with|as|Raspberry Pi 3B version Buster 64 bits}} |
|||
<lang AArch64 Assembly> |
|||
/* ARM assembly AARCH64 Raspberry PI 3B */ |
|||
/* program strMatching64.s */ |
|||
/*******************************************/ |
|||
/* Constantes file */ |
|||
/*******************************************/ |
|||
/* for this file see task include a file in language AArch64 assembly*/ |
|||
.include "../includeConstantesARM64.inc" |
|||
/*******************************************/ |
|||
/* Initialized data */ |
|||
/*******************************************/ |
|||
.data |
|||
szMessFound: .asciz "String found. \n" |
|||
szMessNotFound: .asciz "String not found. \n" |
|||
szString: .asciz "abcdefghijklmnopqrstuvwxyz" |
|||
szString2: .asciz "abc" |
|||
szStringStart: .asciz "abcd" |
|||
szStringEnd: .asciz "xyz" |
|||
szStringStart2: .asciz "abcd" |
|||
szStringEnd2: .asciz "xabc" |
|||
szCarriageReturn: .asciz "\n" |
|||
/*******************************************/ |
|||
/* UnInitialized data */ |
|||
/*******************************************/ |
|||
.bss |
|||
/*******************************************/ |
|||
/* code section */ |
|||
/*******************************************/ |
|||
.text |
|||
.global main |
|||
main: |
|||
ldr x0,qAdrszString // address input string |
|||
ldr x1,qAdrszStringStart // address search string |
|||
bl searchStringDeb // Determining if the first string starts with second string |
|||
cmp x0,0 |
|||
ble 1f |
|||
ldr x0,qAdrszMessFound // display message |
|||
bl affichageMess |
|||
b 2f |
|||
1: |
|||
ldr x0,qAdrszMessNotFound |
|||
bl affichageMess |
|||
2: |
|||
ldr x0,qAdrszString // address input string |
|||
ldr x1,qAdrszStringEnd // address search string |
|||
bl searchStringFin // Determining if the first string ends with the second string |
|||
cmp x0,0 |
|||
ble 3f |
|||
ldr x0,qAdrszMessFound // display message |
|||
bl affichageMess |
|||
b 4f |
|||
3: |
|||
ldr x0,qAdrszMessNotFound |
|||
bl affichageMess |
|||
4: |
|||
ldr x0,qAdrszString2 // address input string |
|||
ldr x1,qAdrszStringStart2 // address search string |
|||
bl searchStringDeb // |
|||
cmp x0,0 |
|||
ble 5f |
|||
ldr x0,qAdrszMessFound // display message |
|||
bl affichageMess |
|||
b 6f |
|||
5: |
|||
ldr x0,qAdrszMessNotFound |
|||
bl affichageMess |
|||
6: |
|||
ldr x0,qAdrszString2 // address input string |
|||
ldr x1,qAdrszStringEnd2 // address search string |
|||
bl searchStringFin |
|||
cmp x0,0 |
|||
ble 7f |
|||
ldr x0,qAdrszMessFound // display message |
|||
bl affichageMess |
|||
b 8f |
|||
7: |
|||
ldr x0,qAdrszMessNotFound |
|||
bl affichageMess |
|||
8: |
|||
ldr x0,qAdrszString // address input string |
|||
ldr x1,qAdrszStringEnd // address search string |
|||
bl searchSubString // Determining if the first string contains the second string at any location |
|||
cmp x0,0 |
|||
ble 9f |
|||
ldr x0,qAdrszMessFound // display message |
|||
bl affichageMess |
|||
b 10f |
|||
9: |
|||
ldr x0,qAdrszMessNotFound // display substring result |
|||
bl affichageMess |
|||
10: |
|||
100: // standard end of the program |
|||
mov x0,0 // return code |
|||
mov x8,EXIT // request to exit program |
|||
svc 0 // perform system call |
|||
qAdrszMessFound: .quad szMessFound |
|||
qAdrszMessNotFound: .quad szMessNotFound |
|||
qAdrszString: .quad szString |
|||
qAdrszString2: .quad szString2 |
|||
qAdrszStringStart: .quad szStringStart |
|||
qAdrszStringEnd: .quad szStringEnd |
|||
qAdrszStringStart2: .quad szStringStart2 |
|||
qAdrszStringEnd2: .quad szStringEnd2 |
|||
qAdrszCarriageReturn: .quad szCarriageReturn |
|||
/******************************************************************/ |
|||
/* search substring at begin of input string */ |
|||
/******************************************************************/ |
|||
/* x0 contains the address of the input string */ |
|||
/* x1 contains the address of substring */ |
|||
/* x0 returns 1 if find or 0 if not or -1 if error */ |
|||
searchStringDeb: |
|||
stp x1,lr,[sp,-16]! // save registers |
|||
stp x2,x3,[sp,-16]! // save registers |
|||
mov x3,0 // counter byte string |
|||
ldrb w4,[x1,x3] // load first byte of substring |
|||
cbz x4,99f // empty string ? |
|||
1: |
|||
ldrb w2,[x0,x3] // load byte string input |
|||
cbz x2,98f // zero final ? |
|||
cmp x4,x2 // bytes equals ? |
|||
bne 98f // no not find |
|||
add x3,x3,1 // increment counter |
|||
ldrb w4,[x1,x3] // and load next byte of substring |
|||
cbnz x4,1b // zero final ? |
|||
mov x0,1 // yes is ok |
|||
b 100f |
|||
98: |
|||
mov x0,0 // not find |
|||
b 100f |
|||
99: |
|||
mov x0,-1 // error |
|||
100: |
|||
ldp x2,x3,[sp],16 // restaur 2 registers |
|||
ldp x1,lr,[sp],16 // restaur 2 registers |
|||
ret // return to address lr x30 |
|||
/******************************************************************/ |
|||
/* search substring at end of input string */ |
|||
/******************************************************************/ |
|||
/* x0 contains the address of the input string */ |
|||
/* x1 contains the address of substring */ |
|||
/* x0 returns 1 if find or 0 if not or -1 if error */ |
|||
searchStringFin: |
|||
stp x1,lr,[sp,-16]! // save registers |
|||
stp x2,x3,[sp,-16]! // save registers |
|||
stp x4,x5,[sp,-16]! // save registers |
|||
mov x3,0 // counter byte string |
|||
// search the last character of substring |
|||
1: |
|||
ldrb w4,[x1,x3] // load byte of substring |
|||
cmp x4,#0 // zero final ? |
|||
add x2,x3,1 |
|||
csel x3,x2,x3,ne // no increment counter |
|||
//addne x3,#1 // no increment counter |
|||
bne 1b // and loop |
|||
cbz x3,99f // empty string ? |
|||
sub x3,x3,1 // index of last byte |
|||
ldrb w4,[x1,x3] // load last byte of substring |
|||
// search the last character of string |
|||
mov x2,0 // index last character |
|||
2: |
|||
ldrb w5,[x0,x2] // load first byte of substring |
|||
cmp x5,0 // zero final ? |
|||
add x5,x2,1 // no -> increment counter |
|||
csel x2,x5,x2,ne |
|||
//addne x2,#1 // no -> increment counter |
|||
bne 2b // and loop |
|||
cbz x2,98f // empty input string ? |
|||
sub x2,x2,1 // index last character |
|||
3: |
|||
ldrb w5,[x0,x2] // load byte string input |
|||
cmp x4,x5 // bytes equals ? |
|||
bne 98f // no -> not found |
|||
subs x3,x3,1 // decrement counter |
|||
blt 97f // ok found |
|||
subs x2,x2,1 // decrement counter input string |
|||
blt 98f // if zero -> not found |
|||
ldrb w4,[x1,x3] // load previous byte of substring |
|||
b 3b // and loop |
|||
97: |
|||
mov x0,1 // yes is ok |
|||
b 100f |
|||
98: |
|||
mov x0,0 // not found |
|||
b 100f |
|||
99: |
|||
mov x0,-1 // error |
|||
100: |
|||
ldp x4,x5,[sp],16 // restaur 2 registers |
|||
ldp x2,x3,[sp],16 // restaur 2 registers |
|||
ldp x1,lr,[sp],16 // restaur 2 registers |
|||
ret // return to address lr x30 |
|||
/******************************************************************/ |
|||
/* search a substring in the string */ |
|||
/******************************************************************/ |
|||
/* x0 contains the address of the input string */ |
|||
/* x1 contains the address of substring */ |
|||
/* x0 returns index of substring in string or -1 if not found */ |
|||
searchSubString: |
|||
stp x1,lr,[sp,-16]! // save registers |
|||
stp x2,x3,[sp,-16]! // save registers |
|||
stp x4,x5,[sp,-16]! // save registers |
|||
mov x2,0 // counter byte input string |
|||
mov x3,0 // counter byte string |
|||
mov x6,-1 // index found |
|||
ldrb w4,[x1,x3] |
|||
1: |
|||
ldrb w5,[x0,x2] // load byte string |
|||
cbz x5,99f // zero final ? |
|||
cmp x5,x4 // compare character |
|||
beq 2f |
|||
mov x6,-1 // no equals - > raz index |
|||
mov x3,0 // and raz counter byte |
|||
add x2,x2,1 // and increment counter byte |
|||
b 1b // and loop |
|||
2: // characters equals |
|||
cmp x6,-1 // first characters equals ? |
|||
csel x6,x2,x6,eq // yes -> index begin in x6 |
|||
//moveq x6,x2 // yes -> index begin in x6 |
|||
add x3,x3,1 // increment counter substring |
|||
ldrb w4,[x1,x3] // and load next byte |
|||
cmp x4,0 // zero final ? |
|||
beq 3f // yes -> end search |
|||
add x2,x2,1 // else increment counter string |
|||
b 1b // and loop |
|||
3: |
|||
mov x0,x6 |
|||
b 100f |
|||
98: |
|||
mov x0,0 // not found |
|||
b 100f |
|||
99: |
|||
mov x0,-1 // error |
|||
100: |
|||
ldp x4,x5,[sp],16 // restaur 2 registers |
|||
ldp x2,x3,[sp],16 // restaur 2 registers |
|||
ldp x1,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|Ada}}== |
=={{header|Ada}}== |
||
<lang Ada> |
<lang Ada> |