Odd words: Difference between revisions

9,487 bytes added ,  8 months ago
add task to aarch64 assembly raspberry pi3
(add task to arm assembly raspberry pi)
(add task to aarch64 assembly raspberry pi3)
Line 37:
spree
trial
</pre>
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits <br> or android 64 bits with application Termux }}
<syntaxhighlight lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program oddwords64.s */
/************************************/
/* Constantes */
/************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
.equ BUFFERSIZE, 300000
.equ WORDSIZE, 4
 
//.include "../../ficmacros64.inc" // use for developper debugging
/*******************************************/
/* Structures **/
/*******************************************/
/* structure words array */
.struct 0
st_word_adr:
.struct st_word_adr + 8
st_word_size:
.struct st_word_size + 8
st_word_end:
/************************************/
/* Initialized data */
/************************************/
.data
szMessOpen: .asciz "File open error.\n"
szMessRead: .asciz "File read error.\n"
szMessClose: .asciz "File close error.\n"
szFileName: .asciz "unixdict.txt"
szMessResult: .asciz " : "
szCarriageReturn: .asciz "\n"
szMessStart: .asciz "Program 64 bits start.\n"
/************************************/
/* UnInitialized data */
/************************************/
.bss
sZoneConv: .skip 24
sBuffer: .skip BUFFERSIZE // file buffer
.align 4
WordArray: .skip st_word_end * 0x10000
/************************************/
/* code section */
/************************************/
.text
.global main
main: // entry of program
ldr x0,qAdrszMessStart
bl affichageMess
ldr x0,qAdrszFileName // file name
ldr x1,qAdrsBuffer // read buffer address
ldr x2,#iBufferSize // buffer size
ldr x3,qAdrWordArray // word address array
bl readFile
cmp x0,#-1 // file error ?
beq 100f
mov x2,x0 // word counter
ldr x0,qAdrsBuffer
ldr x1,qAdrWordArray // array address
bl traitWord
 
100: // standard end of the program
mov x0, #0 // return code
mov x8, #EXIT // request to exit program
svc 0 // perform the system call
 
qAdrsZoneConv: .quad sZoneConv
qAdrszMessResult: .quad szMessResult
qAdrszCarriageReturn: .quad szCarriageReturn
qAdrszMessStart: .quad szMessStart
qAdrszFileName: .quad szFileName
qAdrszMessOpen: .quad szMessOpen
qAdrszMessRead: .quad szMessRead
qAdrszMessClose: .quad szMessClose
qAdrsBuffer: .quad sBuffer
iBufferSize: .quad BUFFERSIZE
qAdrWordArray: .quad WordArray
/***************************************************/
/* read file and create array words */
/***************************************************/
/* x0 contains file name */
/* x1 contains a file buffer */
/* x2 contains buffer size */
/* x3 contains array word address */
readFile:
stp x1,lr,[sp,-16]!
stp x2,x3,[sp,-16]!
stp x4,x5,[sp,-16]!
stp x6,x7,[sp,-16]!
stp x8,x9,[sp,-16]!
mov x9,x1 // file buffer
mov x6,x2
mov x1,x0
mov x10,x3
mov x0,AT_FDCWD
mov x2,#O_RDWR // flags
mov x3,#0 // mode
mov x8,#OPEN // file open
svc 0
cmp x0,#0 // error ?
ble 99f
mov x7,x0 // FD save
 
mov x0,x7
mov x1,x9 // read buffer address
mov x2,x6
mov x8,#READ // call system read file
svc 0
cmp x0,#0 // error read ?
blt 97f
mov x6,x0 // save file size
mov x0,x7 // FD
mov x8,#CLOSE // call system close file
svc 0
cmp x0,#0 // error close ?
blt 96f
mov x1,#0 // index buffer
mov x2,x9 // file buffer address
mov x3,#0 // word length
mov x5,#0 // word counter
1:
ldrb w4,[x9,x1] // load character file buffer
cmp x4,#0x0D // end word ?
beq 2f // yes
add x1,x1,#1 // increment index and length
add x3,x3,#1
b 1b // and loop
2: //
strb wzr,[x9,x1] // store 0 final in word
cmp x3,#WORDSIZE // word length ?
ble 3f // no ?
mov x0,#st_word_end // structure size
madd x0,x5,x0,x10 // compute word item address
str x2,[x0,#st_word_adr] // store word address in array word
str x3,[x0,#st_word_size] // store word size in array word
add x5,x5,#1 // increment word counter
3:
add x1,x1,#2 // increment index buffer (0D0A)
cmp x1,x6 // end ?
bge 4f
add x2,x9,x1 // new word begin
mov x3,#0 // init word length
b 1b // and loop
4:
mov x0,x5 // return word counter
b 100f
96: // display error messages
ldr x0,qAdrszMessClose
bl affichageMess
mov x0,#-1 // error
b 100f
97:
ldr x0,qAdrszMessRead
bl affichageMess
mov x0,#-1 // error
b 100f
99:
ldr x0,qAdrszMessOpen
bl affichageMess
mov x0,#-1 // error
 
100:
ldp x8,x9,[sp],16
ldp x6,x7,[sp],16
ldp x4,x5,[sp],16
ldp x2,x3,[sp],16
ldp x1,lr,[sp],16
ret
/***************************************************/
/* word analyse */
/***************************************************/
/* x0 contains a file buffer */
/* x1 contains array word address */
/* x2 contains array element */
traitWord:
stp x1,lr,[sp,-16]!
stp x2,x3,[sp,-16]!
stp x4,x5,[sp,-16]!
stp x6,x7,[sp,-16]!
stp x8,x9,[sp,-16]!
stp x10,x12,[sp,-16]!
mov x7,x0 // save buffer address
mov x8,x1 // save array word address
mov x9,x2 // save size
mov x10,#0 // init index word array
sub sp,sp,#80 // reserve 80 byte on stack for work array
mov fp,sp // work array address
1:
mov x0,#st_word_end // structure size
madd x0,x10,x0,x8 // compute word item address
ldr x12,[x0,#st_word_adr] // load one word address
ldr x5,[x0,#st_word_size] // load word size
mov x3,#0 // index word
mov x6,#0 // size new word
2:
ldrb w4,[x12,x3] // load characters on odd index
strb w4,[fp,x6] // store in wprk array on stack
add x6,x6,#1 // increment size new word
add x3,x3,#2 // increment index
cmp x3,x5 // end word ?
ble 2b
cmp x6,#WORDSIZE // length new word ok ?
ble 10f
strb wzr,[fp,x6] // store 0 final new word
// search new word in word array by binary search
// in french recherche dichotomique
mov x3,#0 // low index
sub x4,x9,#1 // high index = number of elements - 1
3: // begin search loop
cmp x3,x4 // low > high
bgt 10f // not found
add x7,x3,x4 // compute (low + high) /2
lsr x7,x7,#1
mov x1,#st_word_end // structure size
madd x2,x7,x1,x8 // compute word item address
ldr x0,[x2,#st_word_adr] // load word array address at new index r7
mov x1,fp // search word address
bl comparerChaines // alpha comparison
cmp x0,#0
beq 4f // find
add x0,x7,1
csel x3,x0,x3,lt // lower -> index low = index + 1
sub x0,x7,1
csel x4,x0,x4,gt // bigger -> index high = index - 1
b 3b // and loop
4: // ok -> display result
mov x0,x12
bl affichageMess
ldr x0,qAdrszMessResult
bl affichageMess
mov x0,fp
bl affichageMess
ldr x0,qAdrszCarriageReturn
bl affichageMess
10:
mov x6,#0 // init new length new word
add x10,x10,#1 // increment index word array
cmp x10,x9 // end ?
blt 1b // no -> loop
100:
add sp,sp,#80 // stack alignement release work array
ldp x10,x12,[sp],16
ldp x8,x9,[sp],16
ldp x6,x7,[sp],16
ldp x4,x5,[sp],16
ldp x2,x3,[sp],16
ldp x1,lr,[sp],16
ret
 
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeARM64.inc"
 
</syntaxhighlight>
{{Out}}
<pre>
Program 64 bits start.
barbarian : brain
childbear : cider
corrigenda : cried
gargantuan : grata
headdress : hades
palladian : plain
propionate : point
salvation : slain
siltation : slain
slingshot : sight
statuette : saute
supersede : spree
supervene : spree
terminable : trial
</pre>
 
79

edits