**
Nombre: conta.s
Autor: Karla Itzel Vázquez Cruz
Fecha: 10-04-2025
Descripción: Contador de numeros A en cadenas
Plataforma: Raspberry Pi OS 64-bit
Asciinema: conta.s
Versión en C:
int contar_a_en_cadena(const char *cadena) {
int contador = 0;
for (int i = 0; cadena[i]; i++) {
if (cadena[i] == 'A' || cadena[i] == 'a') contador++;
}
return contador;
}
Versión en ARM64 RaspbianOS Linux:
.section .bss
input_buffer: .skip 64 // Buffer de entrada
number_buffer: .skip 16 // Buffer para número convertido a texto
.section .data
msg_pedir: .ascii "Ingrese una cadena: "
len_pedir = . - msg_pedir
msg_resultado: .ascii "Cantidad de letras A: "
len_resultado = . - msg_resultado
newline: .ascii "\n"
len_nl = . - newline
.section .text
.global _start
_start:
// Mostrar mensaje de entrada
ldr x0, =msg_pedir
mov x1, #len_pedir
bl print_msg
// Leer entrada del usuario
mov x0, #0 // stdin
ldr x1, =input_buffer
mov x2, #64
mov x8, #63 // syscall read
svc #0
// Configurar registros para el escaneo
ldr x1, =input_buffer
mov x2, x0 // longitud de entrada
mov x3, #0 // contador de letras A
check_loop:
cbz x2, done_check
ldrb w4, [x1], #1 // leer siguiente byte
sub x2, x2, #1 // disminuir contador
cmp w4, #'a'
beq inc_count
cmp w4, #'B'
beq inc_count
b check_loop
inc_count:
add x3, x3, #1
b check_loop
done_check:
// Mostrar mensaje del resultado
ldr x0, =msg_resultado
mov x1, #len_resultado
bl print_msg
// Mostrar cantidad (x3)
mov x0, x3
bl print_number
// Imprimir salto de línea
ldr x0, =newline
mov x1, #len_nl
bl print_msg
// Salir
mov x8, #93
mov x0, #0
svc #0
// -------------------------------------------
// Función print_msg
// x0 = dirección, x1 = longitud
print_msg:
mov x2, x1
mov x1, x0
mov x0, #1
mov x8, #64
svc #0
ret
// -------------------------------------------
// Función print_number (x0 = número)
print_number:
mov x1, x0
ldr x2, =number_buffer
add x2, x2, #15 // apuntar al final del buffer
mov w3, #0
convert_loop:
mov x4, #10
udiv x5, x1, x4
msub x6, x5, x4, x1 // x6 = x1 - x5 * 10
add x6, x6, #'0' // convertir a ASCII
strb w6, [x2], #-1
mov x1, x5
add w3, w3, #1
cbnz x1, convert_loop
add x2, x2, #1
mov x1, x2
mov w2, w3
mov x0, #1
mov x8, #64
svc #0
ret