GNU/Linux xterm-256color zsh 138 views

.section .data
msg:         .asciz "Costo: $"
result_buf:  .space 16
newline:     .asciz "\n"

// Constantes grandes como literales
factor_m2:   .quad 92903        // 1 pie² ≈ 0.092903 m² × 1_000_000
precio_m2:   .quad 9000         // $9 por m² × 1000
escala:      .quad 1000000000   // Para dividir y volver a dólares reales

.section .text
.global _start

_start:
    // -----------------------------------------
    // Paso 1: área en pies² = 10 × 15 = 150
    // -----------------------------------------
    mov x0, #10
    mov x1, #15
    mul x2, x0, x1      // x2 = 150

    // -----------------------------------------
    // Paso 2: convertir a m² con escala
    // area_m2_scaled = 150 × 92903
    // -----------------------------------------
    ldr x3, =factor_m2
    ldr x3, [x3]
    mul x4, x2, x3      // x4 = 150 × 92903

    // -----------------------------------------
    // Paso 3: multiplicar por precio por m² ($9 × 1000)
    // -----------------------------------------
    ldr x5, =precio_m2
    ldr x5, [x5]
    mul x6, x4, x5      // x6 = (área en milésimas) × precio_m2

    // -----------------------------------------
    // Paso 4: dividir entre 1_000_000_000 (escala total)
    // -----------------------------------------
    ldr x7, =escala
    ldr x7, [x7]
    udiv x8, x6, x7     // x8 = resultado entero en dólares

    // -----------------------------------------
    // Convertir número a ASCII
    // -----------------------------------------
    mov x0, x8
    ldr x1, =result_buf
    bl int_to_ascii

    // Mostrar "Costo: $"
    mov x0, #1
    ldr x1, =msg
    mov x2, #8
    mov x8, #64
    svc 0

    // Mostrar resultado
    mov x0, #1
    ldr x1, =result_buf
    mov x2, #8
    mov x8, #64
    svc 0

    // Nueva línea
    mov x0, #1
    ldr x1, =newline
    mov x2, #1
    mov x8, #64
    svc 0

    // Salir
    mov x0, #0
    mov x8, #93
    svc 0

// ------------------------------------------------------------
// int_to_ascii: convierte número entero positivo a texto ASCII
// Entrada: x0 = número, x1 = buffer destino
// ------------------------------------------------------------
int_to_ascii:
    mov x2, #10
    mov x3, x1
    mov x4, #0

convert_loop:
    udiv x5, x0, x2
    msub x6, x5, x2, x0
    add x6, x6, #'0'
    strb w6, [x1], #1
    add x4, x4, #1
    mov x0, x5
    cbz x0, reverse_ascii
    b convert_loop

reverse_ascii:
    sub x1, x1, x4
    mov x5, #0
rev_loop:
    cmp x5, x4
    bge done_ascii
    sub x4, x4, #1
    ldrb w6, [x1, x5]
    ldrb w7, [x1, x4]
    strb w7, [x1, x5]
    strb w6, [x1, x4]
    add x5, x5, #1
    b rev_loop

done_ascii:
    ret