.include "../includeConstantesARM64.inc"
.data
sMessResultByte: .asciz "===Byte Length=== : @ \n"
sMessResultChar: .asciz "===Character Length=== : @ \n"
szString1: .asciz "møøse€"
szCarriageReturn: .asciz "\n"
.bss
sZoneConv: .skip 24
.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
.include "../includeARM64.inc"