145 lines
5.1 KiB
Text
145 lines
5.1 KiB
Text
/* 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"
|