147 lines
4.5 KiB
Plaintext
147 lines
4.5 KiB
Plaintext
/* ARM assembly Raspberry PI */
|
|
/* program inputLoop.s */
|
|
|
|
/* REMARK 1 : this program use routines in a include file
|
|
see task Include a file language arm assembly
|
|
for the routine affichageMess conversion10
|
|
see at end of this program the instruction include */
|
|
|
|
/*********************************************/
|
|
/*constantes */
|
|
/********************************************/
|
|
.equ STDOUT, 1 @ Linux output console
|
|
.equ EXIT, 1 @ Linux syscall
|
|
.equ READ, 3
|
|
.equ WRITE, 4
|
|
.equ OPEN, 5
|
|
.equ CLOSE, 6
|
|
.equ CREATE, 8
|
|
/* file */
|
|
.equ O_RDONLY, 0x0 @ open for reading only
|
|
|
|
.equ BUFSIZE, 10000
|
|
.equ LINESIZE, 100
|
|
|
|
/*********************************/
|
|
/* Initialized data */
|
|
/*********************************/
|
|
.data
|
|
szMessErreur: .asciz "Erreur ouverture fichier input.\n"
|
|
szMessErreur1: .asciz "Erreur fermeture fichier.\n"
|
|
szMessErreur2: .asciz "Erreur lecture fichier.\n"
|
|
szCarriageReturn: .asciz "\n"
|
|
szMessEndLine: .asciz "<<<<<< End line.\n"
|
|
|
|
szNameFileInput: .asciz "input.txt"
|
|
|
|
/*******************************************/
|
|
/* DONNEES NON INITIALISEES */
|
|
/*******************************************/
|
|
.bss
|
|
sBuffer: .skip BUFSIZE
|
|
sBufferWord: .skip LINESIZE
|
|
/**********************************************/
|
|
/* -- Code section */
|
|
/**********************************************/
|
|
.text
|
|
.global main
|
|
main:
|
|
/* open file */
|
|
ldr r0,iAdrszNameFileInput @ file name
|
|
mov r1,#O_RDONLY @ flags
|
|
mov r2,#0 @ mode
|
|
mov r7,#OPEN @ call system OPEN
|
|
svc #0
|
|
cmp r0,#0 @ open error ?
|
|
ble erreur
|
|
/* read file */
|
|
mov r9,r0 @ save File Descriptor
|
|
ldr r1,iAdrsBuffer @ buffer address
|
|
mov r2,#BUFSIZE @ buffer size
|
|
mov r7, #READ @ call system READ
|
|
svc 0
|
|
cmp r0,#0 @ read error ?
|
|
ble erreur2
|
|
mov r2,r0 @ length read characters
|
|
/* buffer analyze */
|
|
ldr r3,iAdrsBuffer @ buffer address
|
|
ldr r5,iAdrsBufferWord @ buffer address
|
|
mov r7,#0 @ word byte counter
|
|
mov r4,#0 @ byte counter
|
|
1:
|
|
ldrb r6,[r3,r4] @ load byte buffer
|
|
cmp r6,#' ' @ space ?
|
|
moveq r8,#0 @ yes
|
|
beq 2f
|
|
cmp r6,#0xA @ end line ?
|
|
moveq r8,#1
|
|
beq 2f
|
|
cmp r6,#0xD @ end line ?
|
|
beq 3f
|
|
strb r6,[r5,r7] @ store byte
|
|
add r7,#1 @ increment word byte counter
|
|
b 4f
|
|
2: @ word end
|
|
cmp r7,#0
|
|
beq 3f
|
|
mov r6,#0 @ store 0 final
|
|
strb r6,[r5,r7]
|
|
mov r0,r5 @ display word
|
|
bl affichageMess
|
|
ldr r0,iAdrszCarriageReturn
|
|
bl affichageMess
|
|
mov r7,#0 @ raz word byte counter
|
|
3:
|
|
cmp r8,#1 @ end line ?
|
|
bne 4f
|
|
ldr r0,iAdrszMessEndLine
|
|
bl affichageMess
|
|
4:
|
|
add r4,#1 @ increment read buffer counter
|
|
cmp r4,r2 @ end bytes ?
|
|
blt 1b @ no -> loop
|
|
|
|
4:
|
|
/* close imput file */
|
|
mov r0,r9 @ Fd
|
|
mov r7, #CLOSE @ call system CLOSE
|
|
svc 0
|
|
cmp r0,#0 @ close error ?
|
|
blt erreur1
|
|
|
|
|
|
mov r0,#0 @ return code OK
|
|
b 100f
|
|
erreur:
|
|
ldr r1,iAdrszMessErreur
|
|
bl displayError
|
|
mov r0,#1 @ error return code
|
|
b 100f
|
|
erreur1:
|
|
ldr r1,iAdrszMessErreur1
|
|
bl displayError
|
|
mov r0,#1 @ error return code
|
|
b 100f
|
|
erreur2:
|
|
ldr r1,iAdrszMessErreur2
|
|
bl displayError
|
|
mov r0,#1 @ error return code
|
|
b 100f
|
|
|
|
|
|
100: @ end program
|
|
mov r7, #EXIT
|
|
svc 0
|
|
iAdrszNameFileInput: .int szNameFileInput
|
|
iAdrszMessErreur: .int szMessErreur
|
|
iAdrszMessErreur1: .int szMessErreur1
|
|
iAdrszMessErreur2: .int szMessErreur2
|
|
iAdrszCarriageReturn: .int szCarriageReturn
|
|
iAdrszMessEndLine: .int szMessEndLine
|
|
iAdrsBuffer: .int sBuffer
|
|
iAdrsBufferWord: .int sBufferWord
|
|
/***************************************************/
|
|
/* ROUTINES INCLUDE */
|
|
/***************************************************/
|
|
.include "../affichage.inc"
|