Input loop: Difference between revisions
Content added Content deleted
(Added XPL0 example.) |
(Add task to ARM assembly Raspberry pi) |
||
Line 121: | Line 121: | ||
ENDIF |
ENDIF |
||
ENDPROC</lang> |
ENDPROC</lang> |
||
=={{header|ARM Assembly}}== |
|||
{{works with|as|Raspberry Pi}} |
|||
<lang ARM Assembly> |
|||
/* 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" |
|||
szMessErreur4: .asciz "Erreur création fichier output.\n" |
|||
szMessErreur1: .asciz "Erreur fermeture fichier.\n" |
|||
szMessErreur2: .asciz "Erreur lecture fichier.\n" |
|||
szMessErreur3: .asciz "Erreur d'écriture dans fichier de sortie.\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 |
|||
pop {fp,lr} /* restaur des 2 registres */ |
|||
mov r7, #EXIT /* appel fonction systeme pour terminer */ |
|||
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" |
|||
</lang> |
|||
{{Output}} |
|||
<pre> |
|||
word1 |
|||
word2 |
|||
word3 |
|||
<<<<<< End line. |
|||
Line2w1 |
|||
line2w2 |
|||
<<<<<< End line. |
|||
Oneword |
|||
<<<<<< End line. |
|||
<<<<<< End line. |
|||
AfterEmptyLine |
|||
<<<<<< End line. |
|||
</pre> |
|||
=={{header|AutoHotkey}}== |
=={{header|AutoHotkey}}== |
||
This example reads the text of a source file line by line |
This example reads the text of a source file line by line |