File size: Difference between revisions

add task to aarch64 assembly raspberry pi
(add text to arm assembly raspberry pi)
(add task to aarch64 assembly raspberry pi)
Line 104:
INPUT.TXT: 10 bytes
\INPUT.TXT: 8 bytes</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 filelen64.s */
 
/************************************/
/* Constantes */
/************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
 
.equ FSTAT, 0x50
 
/************************************/
/* structure de type stat : file infos */
/************************************/
.struct 0
Stat_dev_t: /* ID of device containing file */
.struct Stat_dev_t + 8
Stat_ino_t: /* inode */
.struct Stat_ino_t + 8
Stat_mode_t: /* File type and mode */
.struct Stat_mode_t + 4
Stat_nlink_t: /* Number of hard links */
.struct Stat_nlink_t + 4
Stat_uid_t: /* User ID of owner */
.struct Stat_uid_t + 4
Stat_gid_t: /* Group ID of owner */
.struct Stat_gid_t + 4
Stat_rdev_t: /* Device ID (if special file) */
.struct Stat_rdev_t + 8
Stat_size_deb: /* la taille est sur 8 octets si gros fichiers */
.struct Stat_size_deb + 8
Stat_size_t: /* Total size, in bytes */
.struct Stat_size_t + 8
Stat_blksize_t: /* Block size for filesystem I/O */
.struct Stat_blksize_t + 8
Stat_blkcnt_t: /* Number of 512B blocks allocated */
.struct Stat_blkcnt_t + 8
Stat_atime: /* date et heure fichier */
.struct Stat_atime + 8
Stat_mtime: /* date et heure modif fichier */
.struct Stat_atime + 8
Stat_ctime: /* date et heure creation fichier */
.struct Stat_atime + 8
Stat_End:
 
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessResult: .asciz " File size = "
szCarriageReturn: .asciz "\n"
szMessErrOpen: .asciz "Error open file\n"
szMessErrStat: .asciz "Error stats file\n"
szFileName: .asciz "input.txt"
szFileName1: .asciz "../../../input.txt"
 
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
sBuffer: .skip Stat_End
/*********************************/
/* code section */
/*********************************/
.text
.global main
main:
ldr x0,qAdrszFileName // file name
bl filesize
cmp x0,#0
blt 100f
ldr x1,qAdrsZoneConv
bl conversion10 // call décimal conversion
mov x0,#4
ldr x1,qAdrszFileName
ldr x2,qAdrszMessResult
ldr x3,qAdrsZoneConv // insert conversion in message
ldr x4,qAdrszCarriageReturn
stp x4,x4,[sp,-16]! // save registers
bl displayStrings // display message
add sp,sp,#16 // 1 parameter on stack
ldr x0,qAdrszFileName1 // file name
bl filesize
cmp x0,#0
blt 100f
ldr x1,qAdrsZoneConv
bl conversion10 // call décimal conversion
ldr x0,qAdrsZoneConv
mov x0,#4
ldr x1,qAdrszFileName1
ldr x2,qAdrszMessResult
ldr x3,qAdrsZoneConv // insert conversion in message
ldr x4,qAdrszCarriageReturn
stp x4,x4,[sp,-16]! // save registers
bl displayStrings // display message
add sp,sp,#16 // 1 parameter on stack
100: // standard end of the program
mov x0, #0 // return code
mov x8,EXIT
svc #0 // perform the system call
qAdrszCarriageReturn: .quad szCarriageReturn
qAdrsZoneConv: .quad sZoneConv
qAdrszMessResult: .quad szMessResult
qAdrszFileName: .quad szFileName
qAdrszFileName1: .quad szFileName1
qAdrsBuffer: .quad sBuffer
qAdrszMessErrOpen: .quad szMessErrOpen
qAdrszMessErrStat: .quad szMessErrStat
/***************************************************/
/* display multi strings */
/***************************************************/
/* x0 contains number strings address */
filesize: // INFO: filesize
stp x1,lr,[sp,-16]! // save registers
stp x2,x3,[sp,-16]! // save registers
stp x4,x5,[sp,-16]! // save registers
stp x6,x7,[sp,-16]! // save registers
stp x8,x9,[sp,-16]! // save registers
mov x1,x0
mov x0,#AT_FDCWD
mov x2,#O_RDWR // flags
mov x3,#0 // mode
mov x8,#OPEN
svc 0
cmp x0,#0 // error ?
ble 99f
mov x8,x0 // Fd save
ldr x1,qAdrsBuffer // buffer address
mov x8,#FSTAT
svc 0
cmp x0,#0
blt 98f
ldr x1,qAdrsBuffer // buffer address
ldr x4,[x1,#Stat_size_t] // file size
mov x0,x8
mov x8,CLOSE
mov x0,x4 // return size
b 100f
98:
ldr x0,qAdrszMessErrStat
bl affichageMess
mov x0,#-1
b 100f
99:
ldr x0,qAdrszMessErrOpen
bl affichageMess
mov x0,#-1
100:
ldp x8,x9,[sp],16 // restaur registers
ldp x6,x7,[sp],16 // restaur registers
ldp x4,x5,[sp],16 // restaur registers
ldp x2,x3,[sp],16 // restaur registers
ldp x1,lr,[sp],16 // restaur registers
ret
/***************************************************/
/* display multi strings */
/***************************************************/
/* x0 contains number strings address */
/* x1 address string1 */
/* x2 address string2 */
/* x3 address string3 */
/* other address on the stack */
/* thinck to add number other address * 4 to add to the stack */
displayStrings: // INFO: displayStrings
stp x1,lr,[sp,-16]! // save registers
stp x2,x3,[sp,-16]! // save registers
stp x4,x5,[sp,-16]! // save registers
add fp,sp,#48 // save paraméters address (6 registers saved * 4 bytes)
mov x4,x0 // save strings number
cmp x4,#0 // 0 string -> end
ble 100f
mov x0,x1 // string 1
bl affichageMess
cmp x4,#1 // number > 1
ble 100f
mov x0,x2
bl affichageMess
cmp x4,#2
ble 100f
mov x0,x3
bl affichageMess
cmp x4,#3
ble 100f
mov x3,#3
sub x2,x4,#4
1: // loop extract address string on stack
ldr x0,[fp,x2,lsl #3]
bl affichageMess
subs x2,x2,#1
bge 1b
100:
ldp x4,x5,[sp],16 // restaur registers
ldp x2,x3,[sp],16 // restaur registers
ldp x1,lr,[sp],16 // restaur registers
ret
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
</syntaxhighlight>
{{out}}
<pre>
~/.../rosetta/asm3 $ filelen64
input.txt File size = 13
../../../input.txt File size = 6
</pre>
 
=={{header|Action!}}==
79

edits