169 lines
5.2 KiB
Plaintext
169 lines
5.2 KiB
Plaintext
/* 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"
|