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
To embed this project on your website, copy the following code and paste it into your website's HTML: