/* 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"