/* ARM assembly AARCH64 Raspberry PI 3B */ /* program problemABC64.s */ /*******************************************/ /* Constantes file */ /*******************************************/ /* for this file see task include a file in language AArch64 assembly*/ .include "../includeConstantesARM64.inc" .equ TRUE, 1 .equ FALSE, 0 /*********************************/ /* Initialized data */ /*********************************/ .data szMessTitre1: .asciz "Can_make_word: @ \n" szMessTrue: .asciz "True.\n" szMessFalse: .asciz "False.\n" szCarriageReturn: .asciz "\n" szTablBloc: .asciz "BO" .asciz "XK" .asciz "DQ" .asciz "CP" .asciz "NA" .asciz "GT" .asciz "RE" .asciz "TG" .asciz "QD" .asciz "FS" .asciz "JW" .asciz "HU" .asciz "VI" .asciz "AN" .asciz "OB" .asciz "ER" .asciz "FS" .asciz "LY" .asciz "PC" .asciz "ZM" .equ NBBLOC, (. - szTablBloc) / 3 szWord1: .asciz "A" szWord2: .asciz "BARK" szWord3: .asciz "BOOK" szWord4: .asciz "TREAT" szWord5: .asciz "COMMON" szWord6: .asciz "SQUAD" szWord7: .asciz "CONFUSE" /*********************************/ /* UnInitialized data */ /*********************************/ .bss .align 4 qtabTopBloc: .skip 8 * NBBLOC /*********************************/ /* code section */ /*********************************/ .text .global main main: // entry of program ldr x0,qAdrszWord1 bl traitBlock // control word ldr x0,qAdrszWord2 bl traitBlock // control word ldr x0,qAdrszWord3 bl traitBlock // control word ldr x0,qAdrszWord4 bl traitBlock // control word ldr x0,qAdrszWord5 bl traitBlock // control word ldr x0,qAdrszWord6 bl traitBlock // control word ldr x0,qAdrszWord7 bl traitBlock // control word 100: // standard end of the program mov x0, #0 // return code mov x8, #EXIT // request to exit program svc #0 // perform the system call qAdrszCarriageReturn: .quad szCarriageReturn qAdrszWord1: .quad szWord1 qAdrszWord2: .quad szWord2 qAdrszWord3: .quad szWord3 qAdrszWord4: .quad szWord4 qAdrszWord5: .quad szWord5 qAdrszWord6: .quad szWord6 qAdrszWord7: .quad szWord7 /******************************************************************/ /* traitement */ /******************************************************************/ /* x0 contains word */ traitBlock: stp x1,lr,[sp,-16]! // save registres mov x1,x0 ldr x0,qAdrszMessTitre1 // insertion word in message bl strInsertAtCharInc bl affichageMess // display title message mov x0,x1 bl controlBlock // control cmp x0,#TRUE // ok ? bne 1f ldr x0,qAdrszMessTrue // yes bl affichageMess b 100f 1: // no ldr x0,qAdrszMessFalse bl affichageMess 100: ldp x1,lr,[sp],16 // restaur des 2 registres ret qAdrszMessTitre1: .quad szMessTitre1 qAdrszMessFalse: .quad szMessFalse qAdrszMessTrue: .quad szMessTrue /******************************************************************/ /* control if letters are in block */ /******************************************************************/ /* x0 contains word */ controlBlock: stp x1,lr,[sp,-16]! // save registres stp x2,x3,[sp,-16]! // save registres stp x4,x5,[sp,-16]! // save registres stp x6,x7,[sp,-16]! // save registres stp x8,x9,[sp,-16]! // save registres mov x5,x0 // save word address ldr x4,qAdrqtabTopBloc ldr x6,qAdrszTablBloc mov x2,#0 mov x3,#0 1: // init table top block used str x3,[x4,x2,lsl #3] add x2,x2,#1 cmp x2,#NBBLOC blt 1b mov x2,#0 2: // loop to load letters ldrb w3,[x5,x2] cbz w3,10f // end mov x0,0xDF and x3,x3,x0 // transform in capital letter mov x8,#0 3: // begin loop control block ldr x7,[x4,x8,lsl #3] // block already used ? cbnz x7,5f // yes add x9,x8,x8,lsl #1 // no -> index * 3 ldrb w7,[x6,x9] // first block letter cmp w3,w7 // equal ? beq 4f add x9,x9,#1 ldrb w7,[x6,x9] // second block letter cmp w3,w7 // equal ? beq 4f b 5f 4: mov x7,#1 // top block str x7,[x4,x8,lsl #3] // block used add x2,x2,#1 b 2b // next letter 5: add x8,x8,#1 cmp x8,#NBBLOC blt 3b mov x0,#FALSE // no letter find on block -> false b 100f 10: // all letters are ok mov x0,#TRUE 100: ldp x8,x9,[sp],16 // restaur des 2 registres ldp x6,x7,[sp],16 // restaur des 2 registres ldp x4,x5,[sp],16 // restaur des 2 registres ldp x2,x3,[sp],16 // restaur des 2 registres ldp x1,lr,[sp],16 // restaur des 2 registres ret qAdrqtabTopBloc: .quad qtabTopBloc qAdrszTablBloc: .quad szTablBloc /********************************************************/ /* File Include fonctions */ /********************************************************/ /* for this file see task include a file in language AArch64 assembly */ .include "../includeARM64.inc"