**
Nombre: who.s
Autor: Karla Itzel Vázquez Cruz
Fecha: 07-04-2025
Descripción: Determina si un número ingresado es par o impar
Asciinema: who.s
**
Versión en C:
int x;
scanf("%d", &x);
if (x % 2 == 0) printf("Par\n");
else printf("Impar\n");
Versión en ARM64 RaspbianOS Linux:
.global _start
.section .data
msg: .asciz "Ingresa un número: "
par: .asciz "Par\n"
impar: .asciz "Impar\n"
.section .bss
buffer: .skip 12
.section .text
_start:
// Mostrar mensaje
mov x0, #1
ldr x1, =msg
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// Leer desde teclado
mov x0, #0
ldr x1, =buffer
mov x2, #12
mov x8, #63
svc 0
// Convertir texto a entero
ldr x0, =buffer
bl atoi
// Verificar si es par o impar (w0 = número)
and w1, w0, #1 // w1 = w0 & 1
cbz w1, es_par // Si resultado es 0, es par
// Es impar
ldr x1, =impar
b imprimir
es_par:
ldr x1, =par
imprimir:
// Imprimir mensaje (en x1)
bl strlen
mov x2, x0
mov x0, #1
mov x8, #64
svc 0
// Salida del programa
mov x8, #93
mov x0, #0
svc 0
//-------------------------------------------------
// strlen(x1) → x0 (devuelve longitud del string)
//-------------------------------------------------
strlen:
mov x0, #0
.strlen_loop:
ldrb w2, [x1, x0]
cbz w2, .strlen_fin
add x0, x0, #1
b .strlen_loop
.strlen_fin:
ret
//-------------------------------------------------
// atoi(x0) → w0 (convierte string a int)
//-------------------------------------------------
atoi:
mov w1, #0 // acumulador
mov w2, #0 // signo
ldrb w3, [x0], #1
cmp w3, #'-'
bne .atoi_loop
mov w2, #1 // negativo
b .atoi_loop
.atoi_loop:
ldrb w3, [x0], #1
cmp w3, #'0'
blt .atoi_end
cmp w3, #'9'
bgt .atoi_end
sub w3, w3, #'0'
mov w4, #10
mul w1, w1, w4
add w1, w1, w3
b .atoi_loop
.atoi_end:
cmp w2, #0
csel w0, w1, w1, eq
neg w0, w1
ret