GNU/Linux
β’
xterm-256color
β’
bash
155 views
π¨βπ» Autor: Rojas Garcia Kevin Argenis ποΈ Fecha: 2025-04-09 π Campus: TECNM Instituto TecnolΓ³gico de Tijuana π½οΈ Demo en Asciinema
1.- Imprimir los enteros del 9 al 43 en ARM64 Assembly para RaspbianOS.
.global _start
.section .data
mensaje: .asciz "%d\n"
.section .text
_start:
mov x19, #9 // Inicializamos en 9
mov x20, #43 // LΓmite superior
loop:
// Preparar argumentos para printf
ldr x0, =mensaje // Formato "%d\n"
mov x1, x19 // NΓΊmero actual
bl printf // Llamar a printf
add x19, x19, #1 // Incrementar contador
cmp x19, x20 // Comparar con el lΓmite
ble loop // Si no hemos llegado al final, repetir
// Salida limpia
mov x8, #93 // syscall: exit
mov x0, #0 // CΓ³digo de salida 0
svc #0
.extern printf
2.- Imprimir los enteros impares del 7 al 51 en ARM64 Assembly para RaspbianOS.
.global _start
.section .data
mensaje: .asciz "%d\n"
.section .text
_start:
mov x19, #7 // Inicializamos en 7 (primer impar)
mov x20, #51 // LΓmite superior
loop:
// Preparar argumentos para printf
ldr x0, =mensaje // Formato "%d\n"
mov x1, x19 // NΓΊmero actual
bl printf // Llamar a printf
add x19, x19, #2 // Incrementar en 2 (nΓΊmeros impares)
cmp x19, x20 // Comparar con el lΓmite
ble loop // Si no hemos llegado al final, repetir
// Salida limpia
mov x8, #93 // syscall: exit
mov x0, #0 // CΓ³digo de salida 0
svc #0
.extern printf
3.- Imprimir los enteros pares del 2 al 48 en ARM64 Assembly para RaspbianOS.
.global _start
.section .data
mensaje: .asciz "%d\n"
.section .text
_start:
mov x19, #2 // Inicializamos en 2 (primer par)
mov x20, #48 // LΓmite superior
loop:
// Preparar argumentos para printf
ldr x0, =mensaje // Formato "%d\n"
mov x1, x19 // NΓΊmero actual
bl printf // Llamar a printf
add x19, x19, #2 // Incrementar en 2 (nΓΊmeros pares)
cmp x19, x20 // Comparar con el lΓmite
ble loop // Si no hemos llegado al final, repetir
// Salida limpia
mov x8, #93 // syscall: exit
mov x0, #0 // CΓ³digo de salida 0
svc #0
.extern printf
4.- Sumar los primeros 35 enteros positivos (del 1 al 35).
.global _start
.section .data
fmt: .asciz "Suma total: %d\n"
.section .text
_start:
mov x19, #1 // contador = 1
mov x20, #35 // lΓmite superior
mov x21, #0 // acumulador = 0
loop:
add x21, x21, x19 // suma += contador
add x19, x19, #1 // contador++
cmp x19, x20
ble loop // mientras contador <= 35
// Mostrar resultado con printf
ldr x0, =fmt
mov x1, x21 // argumento: suma
bl printf
// Salida limpia
mov x8, #93 // syscall: exit
mov x0, #0
svc #0
.extern printf
5.- Imprimir una tabla de potencias de 2 que no exceda 1,000.
.global _start
.section .data
mensaje: .asciz "%d\n"
.section .text
_start:
mov x19, #1 // Comenzamos con 2^0 = 1
mov x20, #1000 // LΓmite superior
loop:
// Preparar argumentos para printf
ldr x0, =mensaje // Formato "%d\n"
mov x1, x19 // Valor actual de la potencia
bl printf // Llamar a printf
lsl x19, x19, #1 // Multiplicar por 2 usando desplazamiento a la izquierda
cmp x19, x20 // Comparar con el lΓmite
ble loop // Si no hemos llegado al final, repetir
// Salida limpia
mov x8, #93 // syscall: exit
mov x0, #0 // CΓ³digo de salida 0
svc #0
.extern printf
6.- Convertir pulgadas a yardas, y pies a pulgadas.
.global _start
.section .data
mensaje_intro: .asciz "Ingresa una cantidad en pulgadas:\n"
mensaje_yardas: .asciz "Yardas: %d\n"
mensaje_pies: .asciz "Pies: %d\n"
buffer: .skip 16
.section .text
_start:
ldr x0, =mensaje_intro
bl printf
mov x0, #0
ldr x1, =buffer
mov x2, #16
mov x8, #63
svc #0
ldr x1, =buffer
bl atoi
mov x19, x0 // pulgadas
// Calcular yardas
mov x1, x19
mov x2, #36
udiv x1, x1, x2
ldr x0, =mensaje_yardas
bl printf
// Calcular pies
mov x1, x19
mov x2, #12
udiv x1, x1, x2
ldr x0, =mensaje_pies
bl printf
// Salida limpia
mov x8, #93
mov x0, #0
svc #0
// FunciΓ³n atoi
atoi:
mov x0, #0
mov x3, #10
atoi_loop:
ldrb w2, [x1], #1
cmp w2, #10
beq atoi_fin
cmp w2, #0
beq atoi_fin
sub w2, w2, #'0'
madd x0, x0, x3, x2
b atoi_loop
atoi_fin:
ret
.extern printf
7.- Determinar si un nΓΊmero dado es divisible entre 14.
.global _start
.section .data
msg_si: .asciz "Es divisible entre 14\n"
msg_no: .asciz "No es divisible entre 14\n"
.section .text
_start:
mov x19, #84 // NΓΊmero que vamos a verificar
mov x2, #14 // Divisor
udiv x1, x19, x2 // Cociente = x19 / 14
msub x3, x1, x2, x19 // Resto = x19 - (cociente * 14)
cmp x3, #0 // ΒΏEl resto es 0?
beq es_divisible // Si sΓ, saltamos a mensaje positivo
// No divisible
ldr x0, =msg_no
bl printf
b salir
es_divisible:
ldr x0, =msg_si
bl printf
salir:
// Salida limpia
mov x8, #93 // syscall: exit
mov x0, #0 // CΓ³digo de salida 0
svc #0
.extern printf
8.- Determinar si un entero dado es mΓΊltiplo de 6.
.global _start
.section .data
msg_intro: .asciz "Ingresa un nΓΊmero para verificar si es mΓΊltiplo de 6:\n"
msg_si: .asciz "Es mΓΊltiplo de 6\n"
msg_no: .asciz "No es mΓΊltiplo de 6\n"
buffer: .skip 16
.section .text
_start:
ldr x0, =msg_intro
bl printf
mov x0, #0
ldr x1, =buffer
mov x2, #16
mov x8, #63
svc #0
ldr x1, =buffer
bl atoi
mov x19, x0
mov x2, #6
udiv x1, x19, x2
msub x3, x1, x2, x19
cmp x3, #0
beq es_multiplo
ldr x0, =msg_no
bl printf
b salir
es_multiplo:
ldr x0, =msg_si
bl printf
salir:
mov x8, #93
mov x0, #0
svc #0
// FunciΓ³n atoi
atoi:
mov x0, #0
mov x3, #10
atoi_loop:
ldrb w2, [x1], #1
cmp w2, #10
beq atoi_fin
cmp w2, #0
beq atoi_fin
sub w2, w2, #'0'
madd x0, x0, x3, x2
b atoi_loop
atoi_fin:
ret
.extern printf
9.- Introducir un nΓΊmero para determinar si es par o impar.
.global _start
.section .data
msg_intro: .asciz "Ingresa un nΓΊmero para saber si es par:\n"
msg_par: .asciz "Es par\n"
msg_impar: .asciz "Es impar\n"
buffer: .skip 16
.section .text
_start:
// Mostrar mensaje inicial
ldr x0, =msg_intro
bl printf
// Leer entrada
mov x0, #0
ldr x1, =buffer
mov x2, #16
mov x8, #63
svc #0
ldr x1, =buffer
bl atoi
and x1, x0, #1
cmp x1, #0
beq es_par
ldr x0, =msg_impar
bl printf
b salir
es_par:
ldr x0, =msg_par
bl printf
salir:
mov x8, #93
mov x0, #0
svc #0
// FunciΓ³n atoi
atoi:
mov x0, #0
mov x3, #10
atoi_loop:
ldrb w2, [x1], #1
cmp w2, #10
beq atoi_fin
cmp w2, #0
beq atoi_fin
sub w2, w2, #'0'
madd x0, x0, x3, x2
b atoi_loop
atoi_fin:
ret
.extern printf
10.- Escribir un programa que acepte 25 enteros positivos como datos y describa cada uno como βimparβ o βparβ.
.global _start
.section .data
msg_par: .asciz "Es par\n"
msg_impar: .asciz "Es impar\n"
prompt: .asciz "Ingrese un nΓΊmero:\n"
buffer: .skip 16 // Espacio para input
.section .text
_start:
mov x20, #25 // contador de iteraciones (25 nΓΊmeros)
loop:
// Mostrar prompt
ldr x0, =prompt
bl printf
// Leer input desde stdin
mov x0, #0 // stdin
ldr x1, =buffer // buffer
mov x2, #16 // mΓ‘ximo 16 bytes
mov x8, #63 // syscall: read
svc #0
// Convertir string a entero
ldr x1, =buffer
bl atoi // convierte input a entero β resultado en x0
// Verificar si es par o impar
and x1, x0, #1 // bit menos significativo
cmp x1, #0
beq mostrar_par
// Es impar
ldr x0, =msg_impar
bl printf
b siguiente
mostrar_par:
ldr x0, =msg_par
bl printf
siguiente:
subs x20, x20, #1 // decrementar contador
b.ne loop // si no es cero, repetir
salir:
mov x8, #93 // syscall: exit
mov x0, #0
svc #0
// FunciΓ³n atoi: convierte cadena ASCII numΓ©rica a entero
// Resultado en x0
atoi:
mov x0, #0 // acumulador resultado
atoi_loop:
ldrb w2, [x1], #1 // cargar byte y avanzar puntero
cmp w2, #10 // '\n'
beq atoi_fin
cmp w2, #0 // fin de string
beq atoi_fin
sub w2, w2, #'0' // ASCII β nΓΊmero
madd x0, x0, #10, x2 // x0 = x0 * 10 + x2
b atoi_loop
atoi_fin:
ret