How to resolve the algorithm String interpolation (included) step by step in the ARM Assembly programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm String interpolation (included) step by step in the ARM Assembly programming language

Table of Contents

Problem Statement

Given a string and defined variables or values, string interpolation is the replacement of defined character sequences in the string by values or variable values.

Note: The task is not to create a string interpolation routine, but to show a language's built-in capability.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm String interpolation (included) step by step in the ARM Assembly programming language

Source code in the arm programming language

/* ARM assembly Raspberry PI  */
/*  program insertString.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                              */
/*******************************************/
.equ STDOUT, 1           @ Linux output console
.equ EXIT,   1           @ Linux syscall
.equ WRITE,  4           @ Linux syscall
.equ BRK,    0x2d        @ Linux syscall
.equ CHARPOS,       '@'
 
/*******************************************/
/* Initialized data                        */
/*******************************************/
.data
szString:           .asciz " string "
szString1:          .asciz "insert"
szString2:          .asciz "abcd@efg"
szString3:          .asciz "abcdef @"
szString4:          .asciz "@ abcdef"
szCarriageReturn:   .asciz "\n"
/*******************************************/
/* UnInitialized data                      */
/*******************************************/
.bss 
/*******************************************/
/*  code section                           */
/*******************************************/
.text
.global main 
main:                            // entry of program
 
    ldr r0,iAdrszString          // string address
    ldr r1,iAdrszString1         // string address
    mov r2,#0
    bl strInsert                 // 
                                 // return new pointer
    bl affichageMess             // display result string
    ldr r0,iAdrszCarriageReturn
    bl affichageMess
 
    ldr r0,iAdrszString          // string address
    ldr r1,iAdrszString1         // string address
    mov r2,#3
    bl strInsert                 // 
                                 // return new pointer
    bl affichageMess             // display result string
    ldr r0,iAdrszCarriageReturn
    bl affichageMess
 
    ldr r0,iAdrszString          // string address
    ldr r1,iAdrszString1         // string address
    mov r2,#40
    bl strInsert                 // 
                                 // return new pointer
    bl affichageMess             // display result string
    ldr r0,iAdrszCarriageReturn
    bl affichageMess
 
    ldr r0,iAdrszString2         // string address
    ldr r1,iAdrszString1         // string address
    bl strInsertAtChar           // 
                                 // return new pointer
    bl affichageMess             // display result string
    ldr r0,iAdrszCarriageReturn
    bl affichageMess
 
    ldr r0,iAdrszString3         // string address
    ldr r1,iAdrszString1         // string address
    bl strInsertAtChar           // 
                                 // return new pointer
    bl affichageMess             // display result string
    ldr r0,iAdrszCarriageReturn
    bl affichageMess
 
    ldr r0,iAdrszString4         // string address
    ldr r1,iAdrszString1         // string address
    bl strInsertAtChar           // 
                                 // return new pointer
    bl affichageMess             // display result string
    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 the system call
iAdrszString:          .int szString
iAdrszString1:         .int szString1
iAdrszString2:         .int szString2
iAdrszString3:         .int szString3
iAdrszString4:         .int szString4
iAdrszCarriageReturn:  .int szCarriageReturn
/******************************************************************/
/*   insertion of a sub-chain in a chain in the desired position  */ 
/******************************************************************/
/* r0 contains the address of string 1 */
/* r1 contains the address of string to insert */
/* r2 contains the position of insertion : 
      0 start string 
      if r2 > lenght string 1 insert at end of string*/
/* r0 return the address of new string  on the heap */
strInsert:
    push {r1-r4,lr}                         @ save  registres
    mov r3,#0                                // length counter 
1:                                           // compute length of string 1
    ldrb r4,[r0,r3]
    cmp r4,#0
    addne r3,r3,#1                          // increment to one if not equal
    bne 1b                                   // loop if not equal
    mov r5,#0                                // length counter insertion string
2:                                           // compute length of insertion string
    ldrb r4,[r1,r5]
    cmp r4,#0
    addne r5,r5,#1                          // increment to one if not equal
    bne 2b
    cmp r5,#0
    beq 99f                                  // string empty -> error
    add r3,r3,r5                             // add 2 length
    add r3,r3,#1                             // +1 for final zero
    mov r6,r0                                // save address string 1
    mov r0,#0                                // allocation place heap
    mov r7,#BRK                               // call system 'brk'
    svc #0
    mov r5,r0                                // save address heap for output string
    add r0,r0,r3                             // reservation place r3 length
    mov r7,#BRK                               // call system 'brk'
    svc #0
    cmp r0,#-1                               // allocation error
    beq 99f
    //
    mov r7,#0                                // index load characters string 1
    cmp r2,#0                                // index insertion = 0
    beq 5f                                   // insertion at string 1 begin
3:                                           // loop copy characters string 1
    ldrb r0,[r6,r7]                          // load character
    cmp r0,#0                                // end string ?
    beq 5f                                   // insertion at end
    strb r0,[r5,r7]                          // store character in output string
    add r7,r7,#1                             // increment index
    cmp r7,r2                                // < insertion index ?
    blt 3b                                   // yes -> loop
5:
    mov r4,r7                                // init index character output string
    mov r3,#0                                // index load characters insertion string
6:
    ldrb r0,[r1,r3]                          // load characters insertion string
    cmp r0,#0                                // end string ?
    beq 7f
    strb r0,[r5,r4]                          // store in output string
    add r3,r3,#1                             // increment index
    add r4,r4,#1                             // increment output index
    b 6b                                     // and loop
7:
    ldrb r0,[r6,r7]                          // load other character string 1
    strb r0,[r5,r4]                          // store in output string
    cmp r0,#0                                // end string 1 ?
    beq 8f                                   // yes -> end
    add r4,r4,#1                             // increment output index
    add r7,r7,#1                             // increment index
    b 7b                                     // and loop
8:
    mov r0,r5                                // return output string address 
    b 100f
99:                                          // error
    mov r0,#-1
100:
    pop {r1-r4,lr}                          @ restaur registers 
    bx lr                                   @ return  
/******************************************************************/
/*   insert string at character insertion                         */ 
/******************************************************************/
/* r0 contains the address of string 1 */
/* r1 contains the address of insertion string   */
/* r0 return the address of new string  on the heap */
/* or -1 if error   */
strInsertAtChar:
    push {r1-r7,lr}                         @ save  registres
    mov r3,#0                                // length counter 
1:                                           // compute length of string 1
    ldrb r4,[r0,r3]
    cmp r4,#0
    addne r3,r3,#1                           // increment to one if not equal
    bne 1b                                   // loop if not equal
    mov r5,#0                                // length counter insertion string
2:                                           // compute length to insertion string
    ldrb r4,[r1,r5]
    cmp r4,#0
    addne r5,r5,#1                           // increment to one if not equal
    bne 2b                                   // and loop
    cmp r5,#0
    beq 99f                                  // string empty -> error
    add r3,r3,r5                             // add 2 length
    add r3,r3,#1                             // +1 for final zero
    mov r6,r0                                // save address string 1
    mov r0,#0                                // allocation place heap
    mov r7,#BRK                               // call system 'brk' 
    svc #0
    mov r5,r0                                // save address heap for output string
    add r0,r0,r3                             // reservation place r3 length
    mov r7,#BRK                               // call system 'brk'
    svc #0
    cmp r0,#-1                               // allocation error
    beq 99f
 
    mov r2,#0
    mov r4,#0
3:                                           // loop copy string begin 
    ldrb r3,[r6,r2]
    cmp r3,#0
    beq 99f
    cmp r3,#CHARPOS                           // insertion character ?
    beq 5f                                   // yes
    strb r3,[r5,r4]                          // no store character in output string
    add r2,r2,#1
    add r4,r4,#1
    b 3b                                     // and loop
5:                                           // r4 contains position insertion
    add r7,r4,#1                              // init index character output string
                                             // at position insertion + one
    mov r3,#0                                // index load characters insertion string
6:
    ldrb r0,[r1,r3]                          // load characters insertion string
    cmp r0,#0                                // end string ?
    beq 7f                                   // yes 
    strb r0,[r5,r4]                          // store in output string
    add r3,r3,#1                             // increment index
    add r4,r4,#1                             // increment output index
    b 6b                                     // and loop
7:                                           // loop copy end string 
    ldrb r0,[r6,r7]                          // load other character string 1
    strb r0,[r5,r4]                          // store in output string
    cmp r0,#0                                // end string 1 ?
    beq 8f                                   // yes -> end
    add r4,r4,#1                             // increment output index
    add r7,r7,#1                             // increment index
    b 7b                                     // and loop
8:
    mov r0,r5                                // return output string address 
    b 100f
99:                                          // error
    mov r0,#-1
100:
    pop {r1-r7,lr}                          @ restaur registers 
    bx lr                                   @ return  
/***************************************************/
/*      ROUTINES INCLUDE                 */
/***************************************************/
.include "../affichage.inc"

  

You may also check:How to resolve the algorithm Parse an IP Address step by step in the J programming language
You may also check:How to resolve the algorithm Infinity step by step in the Oz programming language
You may also check:How to resolve the algorithm Bitwise operations step by step in the Simula programming language
You may also check:How to resolve the algorithm Determine if only one instance is running step by step in the TXR programming language
You may also check:How to resolve the algorithm Permutations/Rank of a permutation step by step in the Mathematica/Wolfram Language programming language