Append

m
/* ===============================

   This program uses codes from Rosetta Code.
   See: https://rosettacode.org/wiki/String_append
   This code follows Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

   =============================== */

/* ARM assembly AARCH64 Raspberry PI 3B */
/*  program append.s   */
 
/*******************************************/
/* Constantes file                         */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
 
.equ BUFFERSIZE,          100
/*******************************************/
/* Initialized data                        */
/*******************************************/
.data
szMessString:            .asciz "String :\n"
szString1:              .asciz "Alphabet : "
sComplement:            .fill BUFFERSIZE,1,0
szString2:              .asciz "abcdefghijklmnopqrstuvwxyz"
 
szCarriageReturn:       .asciz "\n"
/*******************************************/
/* UnInitialized data                      */
/*******************************************/
.bss 
/*******************************************/
/*  code section                           */
/*******************************************/
.text
.global main 
main: 
 
    ldr x0,qAdrszMessString               // display message
    bl affichageMess
    ldr x0,qAdrszString1                  // display begin string
    bl affichageMess
    ldr x0,qAdrszCarriageReturn           // display return line
    bl affichageMess
    ldr x0,qAdrszString1
    ldr x1,qAdrszString2
    bl append                             // append sting2 to string1
    ldr x0,qAdrszMessString
    bl affichageMess
    ldr x0,qAdrszString1                  // display string
    bl affichageMess 
    ldr x0,qAdrszCarriageReturn
    bl affichageMess
 
100:                                      // standard end of the program
    mov x0,0                              // return code
    mov x8,EXIT                           // request to exit program
    svc 0                                 // perform system call
qAdrszMessString:         .quad szMessString
qAdrszString1:            .quad szString1
qAdrszString2:            .quad szString2
qAdrszCarriageReturn:     .quad szCarriageReturn
/**************************************************/
/*     append two strings                         */ 
/**************************************************/
/* x0 contains the address of the string1 */
/* x1 contains the address of the string2 */
append:
    stp x1,lr,[sp,-16]!            // save  registers
    mov x2,#0                      // counter byte string 1
1:
    ldrb w3,[x0,x2]                // load byte string 1
    cmp x3,#0                      // zero final ?
    add x4,x2,1
    csel x2,x4,x2,ne               // if x3 not equal 0, x2 = X2 +1 else x2
    bne 1b                         // no -> loop
    mov x4,#0                      // counter byte string 2
2:
    ldrb w3,[x1,x4]                // load byte string 2
    strb w3,[x0,x2]                // store byte string 1
    cbz x3,100f                    // zero final ?
    add x2,x2,1                    // no -> increment counter 1
    add x4,x4,1                    // no -> increment counter 2
    b 2b                           // no -> loop
100:
 
    ldp x1,lr,[sp],16              // restaur  2 registers
    ret                            // return to address lr x30
/********************************************************/
/*        File Include fonctions                        */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"