/* ARM assembly Raspberry PI */ /* program cptletters.s */ /************************************/ /* Constantes */ /************************************/ /* for this file see task include a file in language ARM assembly*/ .include "../constantes.inc" .equ READ, 3 .equ WRITE, 4 .equ OPEN, 5 .equ CLOSE, 6 .equ O_RDWR, 0x0002 @ open for reading and writing .equ BUFFERSIZE, 300000 /************************************/ /* Initialized data */ /************************************/ .data szMessOpen: .asciz "File open error.\n" szMessStat: .asciz "File information error.\n" szMessRead: .asciz "File read error.\n" szMessClose: .asciz "File close error.\n" szMessDecryptText: .asciz "Decrypted text :\n" szMessCryptText: .asciz "Encrypted text :\n" szMessErrorChar: .asciz "Character text not Ok!\n" szFileName: .asciz "unixdict.txt" //szFileName: .asciz "test1.txt" szMessResult: .asciz "Result: = " szCarriageReturn: .asciz "\n" szMessStart: .asciz "Program 32 bits start.\n" /************************************/ /* UnInitialized data */ /************************************/ .bss sZoneConv: .skip 24 tabCptLetters: .skip 4 * 52 @ (A-Z a-z) counter array sBuffer: .skip BUFFERSIZE @ file buffer /************************************/ /* code section */ /************************************/ .text .global main main: @ entry of program ldr r0,iAdrszMessStart bl affichageMess ldr r0,iAdrszFileName @ file name mov r1,#O_RDWR @ flags mov r2,#0 @ mode mov r7,#OPEN @ file open svc 0 cmp r0,#0 @ error ? ble 99f mov r8,r0 @ FD save mov r0,r8 ldr r1,iAdrsBuffer ldr r2,#iBufferSize mov r7,#READ @ call system read file svc 0 cmp r0,#0 @ error read ? blt 97f mov r6,r0 @ file size mov r0,r8 mov r7,#CLOSE @ call system close file svc 0 cmp r0,#0 @ error close ? blt 96f ldr r0,iAdrsBuffer mov r1,r6 bl cptLetters b 100f 96: ldr r0,iAdrszMessClose bl affichageMess mov r0,#-1 @ error b 100f 97: ldr r0,iAdrszMessRead bl affichageMess mov r0,#-1 @ error b 100f 99: ldr r0,iAdrszMessOpen bl affichageMess mov r0,#-1 @ error 100: @ standard end of the program mov r0, #0 @ return code mov r7, #EXIT @ request to exit program svc 0 @ perform the system call iAdrsZoneConv: .int sZoneConv iAdrszMessResult: .int szMessResult iAdrszCarriageReturn: .int szCarriageReturn iAdrszMessStart: .int szMessStart iAdrszFileName: .int szFileName iAdrszMessOpen: .int szMessOpen iAdrszMessRead: .int szMessRead iAdrszMessStat: .int szMessStat iAdrszMessClose: .int szMessClose iAdrsBuffer: .int sBuffer iBufferSize: .int BUFFERSIZE /***************************************************/ /* letters frequency */ /***************************************************/ /* r0 contains a file buffer */ /* r1 contains string length */ cptLetters: push {r1-r7,lr} @ save registers ldr r4,iAdrtabCptLetters @ counter array mov r3,#0 @ index string 1: ldrb r2,[r0,r3] @ load byte of string cmp r2,#'A' @ select alpha characters lower or upper blt 5f cmp r2,#'Z' bgt 2f sub r5,r2,#65 @ convert ascii upper in index array (0-25) b 3f 2: cmp r2,#'z' bgt 5f cmp r2,#'a' blt 5f sub r5,r2,#97 - 26 @ convert ascii lower in index array (26,52] 3: ldr r7,[r4,r5,lsl #2] @ load counter of load character add r7,r7,#1 @ increment counter str r7,[r4,r5,lsl #2] @ and store 5: add r3,r3,#1 @ increment text index cmp r3,r1 @ end ? blt 1b @ and loop ldr r7,iAdrszMessResult mov r3,#0 6: @ result display ldr r1,[r4,r3,lsl #2] @ load counter cmp r1,#0 @ if zero not display beq 7f cmp r3,#25 @ upper ? addle r6,r3,#65 @ yes compute ascci character addgt r6,r3,#97 - 26 @ lower strb r6,[r7,#9] @ store in message mov r0,r1 @ convert count in decimal ldr r1,iAdrsZoneConv bl conversion10 ldr r0,iAdrszMessResult @ and display bl affichageMess ldr r0,iAdrsZoneConv bl affichageMess ldr r0,iAdrszCarriageReturn bl affichageMess 7: add r3,r3,#1 cmp r3,#52 blt 6b 100: pop {r1-r7,pc} iAdrtabCptLetters: .int tabCptLetters /***************************************************/ /* ROUTINES INCLUDE */ /***************************************************/ /* for this file see task include a file in language ARM assembly*/ .include "../affichage.inc"