section .data
    prompt1 db "Enter number of black-and-white pages:", 10
    len1 equ $ - prompt1

    prompt2 db "Enter number of colored pages:", 10
    len2 equ $ - prompt2

    msg1 db "Black-and-White Cost: "
    len3 equ $ - msg1

    msg2 db "Colored Cost: "
    len4 equ $ - msg2

    msg3 db "Total Printing Cost: "
    len5 equ $ - msg3

    newline db 10

section .bss
    buffer resb 64

section .text
    global _start

_start:
    ; Display prompt for B&W pages
    mov rax, 1
    mov rdi, 1
    mov rsi, prompt1
    mov rdx, len1
    syscall

     ; Read all input at once
    mov rax, 0
    mov rdi, 0
    mov rsi, buffer
    mov rdx, 64
    syscall

    ; Save number of bytes read
    mov r15, rax

    ; Start parsing from beginning of buffer
    xor r13, r13

    ; Read B&W pages
    call parse_int
    mov r8, rax

    ; Read colored pages
    call parse_int
    mov r9, rax

      ; Calculate B&W cost = pages * 3
    mov rax, r8
    imul rax, 3
    mov r12, rax

    ; Calculate colored cost = pages * 5
    mov rax, r9
    imul rax, 5
    mov r14, rax

    ; Calculate total cost
    mov r15, r12
    add r15, r14

     ; Display B&W cost
    mov rax, 1
    mov rdi, 1
    mov rsi, msg1
    mov rdx, len3
    syscall

    mov rax, r12
    call print_int
    call print_newline

    ; Display colored cost
    mov rax, 1
    mov rdi, 1
    mov rsi, msg2
    mov rdx, len4
    syscall

    mov rax, r14
    call print_int
    call print_newline

    ; Display total cost
    mov rax, 1
    mov rdi, 1
    mov rsi, msg3
    mov rdx, len5
    syscall

    mov rax, r15
    call print_int
    call print_newline

    ; Exit program
    mov rax, 60
    mov rdi, 0
    syscall


; --------------------------------
; PARSE INTEGER FROM INPUT BUFFER
; Returns number in RAX
; --------------------------------
parse_int:
    xor rax, rax

skip_non_digit:
    cmp r13, r15
    jae parse_done

    movzx rbx, byte [buffer + r13]

    cmp bl, '0'
    jl skip_next
    cmp bl, '9'
    jg skip_next

    jmp convert_digits

skip_next:
    inc r13
    jmp skip_non_digit

convert_digits:
    imul rax, 10
    sub rbx, '0'
    add rax, rbx

    inc r13

    cmp r13, r15
    jae parse_done

    movzx rbx, byte [buffer + r13]

    cmp bl, '0'
    jl parse_done
    cmp bl, '9'
    jg parse_done

    jmp convert_digits

parse_done:
    ret


; --------------------------------
; PRINT INTEGER IN RAX
; --------------------------------
print_int:
    mov rbx, 10
    xor r13, r13

    cmp rax, 0
    jne divide_loop

    mov byte [buffer], '0'

    mov rax, 1
    mov rdi, 1
    mov rsi, buffer
    mov rdx, 1
    syscall
    ret

divide_loop:
    xor rdx, rdx
    div rbx
    add dl, '0'
    push rdx
    inc r13
    cmp rax, 0
    jne divide_loop

print_loop:
    pop rdx
    mov [buffer], dl

    mov rax, 1
    mov rdi, 1
    mov rsi, buffer
    mov rdx, 1
    syscall

    dec r13
    cmp r13, 0
    jne print_loop

    ret

; --------------------------------
; PRINT NEWLINE
; --------------------------------
print_newline:
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    ret

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: