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