Length

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

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

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

/* ARM assembly AARCH64 Raspberry PI 3B */
/*  program length.s   */ 
 
/*******************************************/
/* Constantes file                         */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
 
/*********************************/
/* Initialized data              */
/*********************************/
.data
sMessResultByte:        .asciz "===Byte Length=== : @ \n"
sMessResultChar:        .asciz "===Character Length=== : @ \n"
szString1:              .asciz "møøse€"
szCarriageReturn:       .asciz "\n"
 
/*********************************/
/* UnInitialized data            */
/*********************************/
.bss
sZoneConv:        .skip 24
/*********************************/
/*  code section                 */
/*********************************/
.text
.global main 
main:                                 // entry of program 
    ldr x0,qAdrszString1
    bl affichageMess                  // display string
    ldr x0,qAdrszCarriageReturn
    bl affichageMess
 
    ldr x0,qAdrszString1
    mov x1,#0
1:                                    // loop compute length bytes
    ldrb w2,[x0,x1]
    cmp w2,#0
    cinc x1,x1,ne
    bne 1b
 
    mov x0,x1                         // result display
    ldr x1,qAdrsZoneConv
    bl conversion10                   // call decimal conversion
    ldr x0,qAdrsMessResultByte
    ldr x1,qAdrsZoneConv              // insert conversion in message
    bl strInsertAtCharInc
    bl affichageMess
 
    ldr x0,qAdrszString1
    mov x1,#0
    mov x3,#0
2:                                    // loop compute length characters
    ldrb w2,[x0,x1]
    cmp w2,#0
    beq 6f
    and x2,x2,#0b11100000             // 3 bytes ?
    cmp x2,#0b11100000
    bne 3f
    add x3,x3,#1
    add x1,x1,#3
    b 2b
3:
    and x2,x2,#0b11000000              // 2 bytes ?
    cmp x2,#0b11000000
    bne 4f
    add x3,x3,#1
    add x1,x1,#2
    b 2b
4:                                    // else 1 byte
    add x3,x3,#1
    add x1,x1,#1
    b 2b
 
6:
    mov x0,x3
    ldr x1,qAdrsZoneConv
    bl conversion10                   // call decimal conversion
    ldr x0,qAdrsMessResultChar
    ldr x1,qAdrsZoneConv              // insert conversion in message
    bl strInsertAtCharInc
    bl affichageMess
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
qAdrsMessResultByte:      .quad sMessResultByte
qAdrsMessResultChar:      .quad sMessResultChar
qAdrszString1:            .quad szString1
qAdrsZoneConv:            .quad sZoneConv
/********************************************************/
/*        File Include fonctions                        */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"