RosettaCodeData/Task/Bifid-cipher/ARM-Assembly/bifid-cipher.arm

377 lines
11 KiB
Plaintext

/* ARM assembly Raspberry PI */
/* program bifid.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 */
/*******************************************/
.include "../constantes.inc"
.equ MESSSIZE, 2000
.equ BUFFERSIZE, 2000
/*******************************************/
/* Macros */
/*******************************************/
//.include "../../ficmacros32.inc" @ for developer debugging
/*******************************************/
/* Initialized data */
/*******************************************/
.data
szMessDebutPgm: .asciz "Program 32 bits start. \n"
szCarriageReturn: .asciz "\n"
szMessFinOK: .asciz "Program normal end. \n"
szMessError: .asciz "\nError Buffer too small!!!\n"
szMessString: .asciz "String :\n"
szMessEncrip: .asciz "\nEncrypted :\n"
szMessDecrip: .asciz "\nDecrypted :\n"
//szString1: .asciz "ABCDEFGHIJKLMNOPQRSTUVWXYZ!.?abcdefghijklmnopqrstuvwxyz"
//szString1: .asciz "attackatdawn"
szString1: .asciz "ATTACKATDAWN"
//szString1: .asciz "ABCD"
szString2: .asciz "FLEEATONCE"
szString3: .asciz "L'invasion commencera le premier janvier"
szPolybe1: .ascii "ABCDE"
.ascii "FGHIK"
.ascii "LMNOP"
.ascii "QRSTU"
.asciz "VWXYZ"
szPolybe2: .ascii "BGWKZ"
.ascii "QPNDS"
.ascii "IOAXE"
.ascii "FCLUM"
.asciz "THYVR"
/*******************************************/
/* UnInitialized data */
/*******************************************/
.bss
.align 4
tabiposX: .skip 4 * MESSSIZE
tabiposY: .skip 4 * MESSSIZE
sBuffer1: .skip BUFFERSIZE
sBuffer2: .skip BUFFERSIZE
/*******************************************/
/* code section */
/*******************************************/
.text
.global main
main:
ldr r0,iAdrszMessDebutPgm
bl affichageMess
ldr r0,iAdrszMessString @ display message
bl affichageMess
ldr r0,iAdrszString1 @ display string
bl affichageMess
ldr r0,iAdrszString1 @ string address
ldr r1,iAdrszPolybe1 @ Polybe key
ldr r2,iAdrsBuffer1 @ encrypted buffer result
bl encrypt
cmp r0,#0
ble 99f
ldr r0,iAdrszMessEncrip
bl affichageMess
ldr r0,iAdrsBuffer1 @ display encrypted buffer
bl affichageMess
ldr r0,iAdrsBuffer1 @ encrypted buffer
ldr r1,iAdrszPolybe1 @ Polybe key
ldr r2,iAdrsBuffer2 @ decrypted buffer
bl decrypt
ldr r0,iAdrszMessDecrip
bl affichageMess
ldr r0,iAdrsBuffer2 @ display decrypted buffer
bl affichageMess
ldr r0,iAdrszCarriageReturn
bl affichageMess
ldr r0,iAdrszMessString @ display message
bl affichageMess
ldr r0,iAdrszString2 @ display string
bl affichageMess
ldr r0,iAdrszString2 @ string address
ldr r1,iAdrszPolybe2 @ Polybe key
ldr r2,iAdrsBuffer1 @ encrypted buffer result
bl encrypt
cmp r0,#0
ble 99f
ldr r0,iAdrszMessEncrip
bl affichageMess
ldr r0,iAdrsBuffer1 @ display encrypted buffer
bl affichageMess
ldr r0,iAdrsBuffer1 @ encrypted buffer
ldr r1,iAdrszPolybe2 @ Polybe key
ldr r2,iAdrsBuffer2 @ decrypted buffer
bl decrypt
ldr r0,iAdrszMessDecrip
bl affichageMess
ldr r0,iAdrsBuffer2 @ display decrypted buffer
bl affichageMess
ldr r0,iAdrszCarriageReturn
bl affichageMess
ldr r0,iAdrszMessString @ display message
bl affichageMess
ldr r0,iAdrszString1 @ display string
bl affichageMess
ldr r0,iAdrszString1 @ string address
ldr r1,iAdrszPolybe2 @ Polybe key
ldr r2,iAdrsBuffer1 @ encrypted buffer result
bl encrypt
cmp r0,#0
ble 99f
ldr r0,iAdrszMessEncrip
bl affichageMess
ldr r0,iAdrsBuffer1 @ display encrypted buffer
bl affichageMess
ldr r0,iAdrsBuffer1 @ encrypted buffer
ldr r1,iAdrszPolybe2 @ Polybe key
ldr r2,iAdrsBuffer2 @ decrypted buffer
bl decrypt
ldr r0,iAdrszMessDecrip
bl affichageMess
ldr r0,iAdrsBuffer2 @ display decrypted buffer
bl affichageMess
ldr r0,iAdrszCarriageReturn
bl affichageMess
ldr r0,iAdrszMessString @ display message
bl affichageMess
ldr r0,iAdrszString3 @ display string
bl affichageMess
ldr r0,iAdrszString3 @ string address
ldr r1,iAdrszPolybe1 @ Polybe key
ldr r2,iAdrsBuffer1 @ encrypted buffer result
bl encrypt
cmp r0,#0
ble 99f
ldr r0,iAdrszMessEncrip
bl affichageMess
ldr r0,iAdrsBuffer1 @ display encrypted buffer
bl affichageMess
ldr r0,iAdrsBuffer1 @ encrypted buffer
ldr r1,iAdrszPolybe1 @ Polybe key
ldr r2,iAdrsBuffer2 @ decrypted buffer
bl decrypt
ldr r0,iAdrszMessDecrip
bl affichageMess
ldr r0,iAdrsBuffer2 @ display decrypted buffer
bl affichageMess
ldr r0,iAdrszCarriageReturn
bl affichageMess
ldr r0,iAdrszMessFinOK
bl affichageMess
b 100f
99:
ldr r0,iAdrszMessError @ error
bl affichageMess
mov r0, #1
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc 0 @ perform system call
iAdrszMessString: .int szMessString
iAdrszMessDecrip: .int szMessDecrip
iAdrszMessEncrip: .int szMessEncrip
iAdrszString1: .int szString1
iAdrszPolybe1: .int szPolybe1
iAdrszString2: .int szString2
iAdrszString3: .int szString3
iAdrszPolybe2: .int szPolybe2
iAdrsBuffer1: .int sBuffer1
iAdrsBuffer2: .int sBuffer2
iAdrszMessDebutPgm: .int szMessDebutPgm
iAdrszMessFinOK: .int szMessFinOK
iAdrszCarriageReturn: .int szCarriageReturn
iAdrszMessError: .int szMessError
/******************************************************************/
/* encrypt strings */
/******************************************************************/
/* r0 contains the address of the string1 */
/* r1 contains Polybe area address
/* r2 contains the address of the encrypted string */
/* r0 return buffer lenght */
encrypt:
push {r3-r12,lr} @ save registers
mov r3,#0 @ counter byte string 1
mov r5,#0 @ counter byte buffer
1:
ldrb r7,[r0,r3] @ load byte string 1
cmp r7,#0 @ zero final ?
beq 4f
cmp r7,#65 @ < A ?
addlt r3,#1
blt 1b
cmp r7,#90 @ > Z
ble 2f
cmp r7,#97 @ < a ?
addlt r3,#1
blt 1b
cmp r7,#122 @> z
addgt r3,#1
bgt 1b
sub r7,#32 @ convert minuscul to majuscule
2:
cmp r7,#'J' @ change J to I
moveq r7,#'I'
ldr r11,iAdrtabiposX
ldr r12,iAdrtabiposY
mov r6,#0
mov r9,#5
3: @ loop to search char in polybe square
ldrb r8,[r1,r6] @ load byte polybe
cmp r8,r7 @ equal ?
addne r6,#1
bne 3b
udiv r10,r6,r9 @ compute coordonnés
mls r8,r10,r9,r6
strb r10,[r11,r5] @ save X position
strb r8,[r12,r5] @ save Y position
add r5,r5,#1 @ increment indice
add r3,r3,#1
b 1b @ and loop
4:
mov r6,#0
mov r8,r5
mov r5,#0
mov r3,#5
5: @ convert position line 1 in char
ldrb r9,[r11,r6]
add r6,r6,#1
cmp r6,r8 @ first line end ?
movge r6,#0
bge 7f @ jmp for second line
ldrb r7,[r11,r6] @ compute rank with position X and Y
mul r9,r3,r9
add r9,r9,r7
ldrb r9,[r1,r9] @ load polybe char
strb r9,[r2,r5]
add r5,r5,#1
add r6,r6,#1
cmp r6,r8
blt 5b
mov r6,#0
6: @ convert position line 2 in char
ldrb r9,[r12,r6]
add r6,r6,#1
7:
ldrb r7,[r12,r6] @ compute rank with position X and Y
mul r9,r3,r9
add r9,r9,r7
ldrb r9,[r1,r9] @ load polybe char
strb r9,[r2,r5]
add r5,r5,#1
add r6,r6,#1
cmp r6,r8
blt 6b
mov r9,#0 @ zero final
strb r9,[r2,r5]
mov r0,r5
100:
pop {r3-r12,pc} @ restaur registers
iAdrtabiposX: .int tabiposX
iAdrtabiposY: .int tabiposY
/******************************************************************/
/* decrypt strings */
/******************************************************************/
/* r0 contains the address of the encrypted string1 */
/* r1 contains Polybe area address
/* r2 contains the address of the decrypted string */
/* r0 return buffer lenght */
decrypt:
push {r3-r11,lr} @ save registers
mov r3,#0 @ counter byte string 1
mov r5,#0 @ counter byte result buffer
1:
ldrb r7,[r0,r3] @ load byte string 1
cmp r7,#0 @ zero final ?
moveq r0,r5
beq 4f
cmp r7,#65 @ < A ?
addlt r3,#1
blt 1b
cmp r7,#90 @ > Z
ble 2f
cmp r7,#97 @ < a ?
addlt r3,#1
blt 1b
cmp r7,#122 @> z
addgt r3,#1
bgt 1b
sub r7,#32 @ convert minuscul to majuscule
2:
ldr r11,iAdrtabiposX
mov r6,#0
mov r9,#5
3: @ loop to search char in polybe square
ldrb r8,[r1,r6] @ load byte polybe
cmp r8,r7
addne r6,#1
bne 3b
udiv r10,r6,r9
mls r8,r10,r9,r6
strb r10,[r11,r5]
add r5,r5,#1
strb r8,[r11,r5]
add r5,r5,#1
add r3,#1
b 1b
4:
mov r6,#0 @ start indice first line
lsr r8,r5,#1
mov r10,r8 @ start indice second line
mov r5,#0
mov r3,#5
5:
ldrb r9,[r11,r6] @ load position
ldrb r7,[r11,r10]
mul r9,r3,r9 @ compute rank
add r9,r9,r7
ldrb r9,[r1,r9] @ load polybe byte
strb r9,[r2,r5] @ and store to result
add r5,r5,#1
add r10,r10,#1
add r6,r6,#1
cmp r6,r8 @ end ?
blt 5b
mov r9,#0 @ 0 final
strb r9,[r2,r5]
mov r0,r5
100:
pop {r3-r11,pc} @ restaur registers
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
.include "../affichage.inc"