File size: Difference between revisions
Content added Content deleted
VincentARM (talk | contribs) (add text to arm assembly raspberry pi) |
VincentARM (talk | contribs) (add task to aarch64 assembly raspberry pi) |
||
Line 104: | Line 104: | ||
INPUT.TXT: 10 bytes |
INPUT.TXT: 10 bytes |
||
\INPUT.TXT: 8 bytes</pre> |
\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!}}== |
=={{header|Action!}}== |