203 lines
6.8 KiB
Text
203 lines
6.8 KiB
Text
/* 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"
|