How to resolve the algorithm ABC problem step by step in the AArch64 Assembly programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm ABC problem step by step in the AArch64 Assembly programming language

Table of Contents

Problem Statement

You are given a collection of ABC blocks   (maybe like the ones you had when you were a kid).
There are twenty blocks with two letters on each block. A complete alphabet is guaranteed amongst all sides of the blocks. The sample collection of blocks:

Write a function that takes a string (word) and determines whether the word can be spelled with the given collection of blocks.

The rules are simple:

Let's start with the solution:

Step by Step solution about How to resolve the algorithm ABC problem step by step in the AArch64 Assembly programming language

Source code in the aarch64 programming language

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

  

You may also check:How to resolve the algorithm Combinations step by step in the E programming language
You may also check:How to resolve the algorithm Array concatenation step by step in the GAP programming language
You may also check:How to resolve the algorithm Send email step by step in the Lingo programming language
You may also check:How to resolve the algorithm Averages/Mode step by step in the Wren programming language
You may also check:How to resolve the algorithm Quoting constructs step by step in the C++ programming language