section .bss
    input resb 20          ; Reserve 20 bytes for input
    result resb 20         ; buffer for result string

section .data
    prompt db "Enter Operations String: ", 0
    result_msg db " = ", 0
    newline db 10, 0

section .text
    global _start

_start:
    ; Print prompt
    mov rax, 1             ; syscall: write
    mov rdi, 1             ; file descriptor: stdout
    mov rsi, prompt        ; message to write
    mov rdx, 26            ; message length (including space)
    syscall

    ; Read input
    mov rax, 0             ; syscall: read
    mov rdi, 0             ; file descriptor: stdin
    mov rsi, input         ; buffer to store input
    mov rdx, 20            ; buffer size
    syscall

    ; Parse and calculate
    mov rsi, input         ; pointer to input buffer
    call parse_and_calculate

    ; Print newline
    mov rax, 1             ; syscall: write
    mov rdi, 1             ; file descriptor: stdout
    mov rsi, newline       ; message to write
    mov rdx, 1             ; message length
    syscall

    ; Print input string
    mov rax, 1             ; syscall: write
    mov rdi, 1             ; file descriptor: stdout
    mov rsi, input         ; message to write (input string)
    mov rdx, 20            ; message length
    syscall

    ; Print result message and result on the same line
    mov rax, 1             ; syscall: write
    mov rdi, 1             ; file descriptor: stdout
    mov rsi, result_msg    ; message to write
    mov rdx, 3             ; message length
    syscall

    ; Print result
    mov rax, 1             ; syscall: write
    mov rdi, 1             ; file descriptor: stdout
    mov rsi, result        ; message to write (result string)
    mov rdx, 20            ; message length
    syscall

    ; Exit
    mov rax, 60            ; syscall: exit
    xor rdi, rdi           ; status: 0
    syscall

parse_and_calculate:
    ; Initialize registers
    xor rax, rax           ; clear rax
    xor rbx, rbx           ; clear rbx
    xor rcx, rcx           ; clear rcx
    xor rdx, rdx           ; clear rdx

    ; Parse first number
    call parse_number
    mov rbx, rax           ; store first number in rbx

parse_loop:
    ; Parse operator
    call parse_operator
    cmp al, 0              ; check for end of string
    je calculate_done

    ; Parse next number
    call parse_number

    ; Perform operation
    cmp byte [rsi-1], '+'
    je do_add
    cmp byte [rsi-1], '-'
    je do_sub
    cmp byte [rsi-1], '*'
    je do_mul
    cmp byte [rsi-1], '/'
    je do_div

do_add:
    add rbx, rax
    jmp parse_loop

do_sub:
    sub rbx, rax
    jmp parse_loop

do_mul:
    imul rbx, rax
    jmp parse_loop

do_div:
    xor rdx, rdx           ; clear rdx for division
    div rax
    mov rbx, rax
    jmp parse_loop

calculate_done:
    ; Convert result to string
    mov rax, rbx
    call int_to_string
    ret

parse_number:
    xor rax, rax           ; clear rax
    mov al, byte [rsi]
    sub al, '0'            ; convert ASCII to integer
    inc rsi                ; move to next character
    ret

parse_operator:
    mov al, byte [rsi]
    inc rsi                ; move to next character
    ret

int_to_string:
    ; Convert integer in rax to string in result
    mov rdi, result        ; pointer to result buffer
    add rdi, 19            ; move to end of buffer
    mov byte [rdi], 0      ; null-terminate string
    dec rdi

    test rax, rax          ; check if rax is zero
    jnz int_to_string_loop

    ; Handle zero case
    mov byte [rdi], '0'    ; store '0' for zero
    jmp int_to_string_done

int_to_string_loop:
    xor rdx, rdx           ; clear rdx
    mov rcx, 10
    div rcx                ; divide rax by 10
    add dl, '0'            ; convert remainder to ASCII
    mov byte [rdi], dl     ; store character
    dec rdi
    test rax, rax          ; check if rax is zero
    jnz int_to_string_loop

int_to_string_done:
    inc rdi                ; move to first character
    mov rsi, rdi           ; pointer to result string
    sub rdi, result        ; calculate length
    mov rbx, rdi           ; store length in rbx
    ret

this code prints out that 1 = 209, can you fix the output to display 1 = 1?