GNU/Linux xterm-256color bash 144 views

// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Dibuja la copa de un pino
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 07-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/zIWoe2uge5CIILIy0bNGWOjeb
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en C
// *void print_char(char c) {
// *    putchar(c);
// *}
// *void print_spaces(int n) {
// *    for(int i = 0; i < n; i++) {
// *        print_char(' ');
// *    }
// *}
// *void print_asterisks(int n) {
// *    for(int i = 0; i < n; i++) {
// *        print_char('*');
// *    }
// *}
// *int main() {
// *    int altura = 5;          // * Altura del pino
// *    // * Generar copa del pino
// *    for(int fila = 1; fila <= altura; fila++) {
// *        // * Espacios antes de los asteriscos
// *        print_spaces(altura - fila);
// *
// *        // * Asteriscos (2n-1 por fila)
// *        print_asterisks(2 * fila - 1);
// *
// *        print_char('\n');
// *   }
// *    return 0;
// *}
// ****************************************************************************
.section .data
asterisco: .ascii "*"
espacio: .ascii " "
newline: .ascii "\n"

.section .text
.global _start

_start:
    mov x20, #1         // cantidad de asteriscos por fila (empieza en 1)
    mov x21, #4         // cantidad de niveles totales
    mov x22, #0         // contador de fila actual

loop_niveles:
    cmp x22, x21
    b.eq fin_programa

    // Calcular espacios: espacios = niveles - fila_actual - 1
    mov x23, x21
    sub x23, x23, x22
    sub x23, x23, #1

    // Imprimir espacios
print_espacios:
    cbz x23, print_asteriscos
    ldr x0, =espacio
    mov x1, #1
    bl print
    sub x23, x23, #1
    b print_espacios
print_asteriscos:
    mov x24, x20      // número de asteriscos en esta línea

asterisco_loop:
    cbz x24, salto_linea
    ldr x0, =asterisco
    mov x1, #1
    bl print
    sub x24, x24, #1
    b asterisco_loop

salto_linea:
    ldr x0, =newline
    mov x1, #1
    bl print

    add x20, x20, #2     // siguiente fila tiene 2 más asteriscos
    add x22, x22, #1     // fila actual +1
    b loop_niveles

fin_programa:
    mov x8, #93
    mov x0, #0
    svc #0

// Función print: (x0 = ptr, x1 = len)
print:
    mov x2, x1
    mov x1, x0
    mov x0, #1
  mov x8, #64
    svc #0
    ret