/* ARM assembly Raspberry PI */ /* program rot13.s */ /* for constantes see task include a file in arm assembly */ /************************************/ /* Constantes */ /************************************/ .include "../constantes.inc" .equ STRINGSIZE, 500 /************************************/ /* Initialized data */ /************************************/ .data szMessString: .asciz "String :\n" szMessEncrip: .asciz "\nEncrypted :\n" szMessDecrip: .asciz "\nDecrypted :\n" szString1: .asciz "{NOWHERE! abcd xyz 1234}" szCarriageReturn: .asciz "\n" /************************************/ /* UnInitialized data */ /************************************/ .bss szString2: .skip STRINGSIZE szString3: .skip STRINGSIZE /************************************/ /* code section */ /************************************/ .text .global main main: ldr r0,iAdrszMessString @ display message bl affichageMess ldr r0,iAdrszString1 @ display string bl affichageMess ldr r0,iAdrszString1 ldr r1,iAdrszString2 bl encryptRot13 ldr r0,iAdrszMessEncrip bl affichageMess ldr r0,iAdrszString2 @ display string bl affichageMess ldr r0,iAdrszString2 ldr r1,iAdrszString3 bl decryptRot13 ldr r0,iAdrszMessDecrip bl affichageMess ldr r0,iAdrszString3 @ display string bl affichageMess ldr r0,iAdrszCarriageReturn bl affichageMess 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 iAdrszString2: .int szString2 iAdrszString3: .int szString3 iAdrszCarriageReturn: .int szCarriageReturn /******************************************************************/ /* encrypt strings */ /******************************************************************/ /* r0 contains the address of the string1 */ /* r1 contains the address of the encrypted string */ encryptRot13: push {r3,r4,lr} @ save registers mov r3,#0 @ counter byte string 1 mov r2,#13 @ rot characters number 1: ldrb r4,[r0,r3] @ load byte string 1 cmp r4,#0 @ zero final ? streqb r4,[r1,r3] moveq r0,r3 beq 100f cmp r4,#65 @ < A ? strltb r4,[r1,r3] addlt r3,#1 blt 1b cmp r4,#90 @ > Z bgt 2f add r4,r2 @ add key cmp r4,#90 @ > Z subgt r4,#26 strb r4,[r1,r3] add r3,#1 b 1b 2: cmp r4,#97 @ < a ? strltb r4,[r1,r3] addlt r3,#1 blt 1b cmp r4,#122 @> z strgtb r4,[r1,r3] addgt r3,#1 bgt 1b add r4,r2 cmp r4,#122 subgt r4,#26 strb r4,[r1,r3] add r3,#1 b 1b 100: pop {r3,r4,lr} @ restaur registers bx lr @ return /******************************************************************/ /* decrypt strings */ /******************************************************************/ /* r0 contains the address of the encrypted string1 */ /* r1 contains the address of the decrypted string */ decryptRot13: push {r3,r4,lr} @ save registers mov r3,#0 @ counter byte string 1 mov r2,#13 @ rot characters number 1: ldrb r4,[r0,r3] @ load byte string 1 cmp r4,#0 @ zero final ? streqb r4,[r1,r3] moveq r0,r3 beq 100f cmp r4,#65 @ < A ? strltb r4,[r1,r3] addlt r3,#1 blt 1b cmp r4,#90 @ > Z bgt 2f sub r4,r2 @ substract key cmp r4,#65 @ < A addlt r4,#26 strb r4,[r1,r3] add r3,#1 b 1b 2: cmp r4,#97 @ < a ? strltb r4,[r1,r3] addlt r3,#1 blt 1b cmp r4,#122 @ > z strgtb r4,[r1,r3] addgt r3,#1 bgt 1b sub r4,r2 @ substract key cmp r4,#97 @ < a addlt r4,#26 strb r4,[r1,r3] add r3,#1 b 1b 100: pop {r3,r4,lr} @ restaur registers bx lr @ return /***************************************************/ /* ROUTINES INCLUDE */ /***************************************************/ /* for this file see task include a file in language ARM assembly*/ .include "../affichage.inc"