0

I am trying to make a calculator using x86 assembly language but in addition it didn't ask for input of first value i am new in assembly so kindly guide me. Here's my code

    section .data
    mes1: db "Enter YOUR CHOICE" , 0xA , 0x20
    len1: equ $-mes1
    mes2: db "1.ADD", 0xA,0x20
    len2: equ $-mes2
    mes3: db "2.SUBTRACT", 0xA,0x20
    len3: equ $-mes3
    mes4: db "3.MULTIPLE", 0xA,0x20
    len4: equ $-mes4
    mes5: db "4.DEVISON", 0xA,0x20
    len5: equ $-mes5
    mes6: db "result : "
    len6: equ $-mes6
    mes7: db "Enter first value : " , 0xA
    len7: equ $-mes7
    mes8: db "Enter Second value : " , 0xA
    len8: equ $-mes8
    a: dd '1'
    b: dd '2'
    c: dd '3'
    d: dd '4'
section .bss
    choose resb 1
    val1 resw 5
    val2 resw 5
    res resw 10

section .text
    global _start
_start:
    MENU:
        mov eax , 0x4
        mov ebx , 0x1
        mov ecx , mes1
        mov edx , len1
            int 0x80
        mov eax , 0x4
        mov ebx , 0x1
        mov ecx , mes2
        mov edx , len2
            int 0x80
        mov eax , 0x4
        mov ebx , 0x1
        mov ecx , mes3
        mov edx , len3
            int 0x80
        mov eax , 0x4
        mov ebx , 0x1
        mov ecx , mes4
        mov edx , len4
            int 0x80
        mov eax , 0x4
        mov ebx , 0x1
        mov ecx , mes5
        mov edx , len5
            int 0x80
    choice:
        mov eax , 0x3
        mov ebx , 0x2
        mov ecx , choose
        mov edx , 1
        int 0x80
        
        ;compare 1 
        mov ecx , [choose]
        cmp ecx , [a]
        JE ADDITION
        ;compare 2 
        mov ecx , [choose]
        cmp ecx , [b]
        JE SUBTRACT
        ;compare 3 
        mov ecx , [choose]
        cmp ecx , [c]
        JE MULTIPLE
        ;compare 4 
        mov ecx , [choose]
        cmp ecx , [d]
        JE DEVISON
        ;else choice again
        jmp choice
;
    ADDITION:

    ;input for value 1 
        mov eax , 0x4       
        mov ebx , 0x1
        mov ecx , mes7
        mov edx , len7
          int 0x80
        
        mov eax , 0x3       
        mov ebx , 0x2
        mov ecx , val1
        mov edx , 5
          int 0x80

    ;input for value  2 
        mov eax , 0x4       
        mov ebx , 0x1
        mov ecx , mes8
        mov edx , len8
          int 0x80

        mov eax , 0x3       
        mov ebx , 0x2
        mov ecx , val2
        mov edx , 5
        int 0x80
    ;calculation
            mov eax , [val1]
            sub eax , '0'
            mov ebx , [val2]
            sub ebx , '0'
            add eax , ebx 
            add eax , '0'
            mov [res] , eax
    ;print result
    mov eax , 0x4
        mov ebx , 0x1
        mov ecx , mes6
        mov edx , len6
          int 0x80
        mov eax , 0x4
        mov ebx , 0x1
        mov ecx , res
        mov edx , 10
          int 0x80
        jmp end
    SUBTRACT:
        mov eax , 0x4
        mov ebx , 0x1
        mov ecx , mes6
        mov edx , len6
        int 0x80
        jmp end
    MULTIPLE:
        mov eax , 0x4
        mov ebx , 0x1
        mov ecx , mes6
        mov edx , len6
        int 0x80
        jmp end
    DEVISON:
        mov eax , 0x4
        mov ebx , 0x1
        mov ecx , mes6
        mov edx , len6
        int 0x80
        jmp end
    end:
        mov eax , 0x1
        int 0x80
phuclv
  • 37,963
  • 15
  • 156
  • 475
ES JOKER
  • 9
  • 3
  • 1
    Run your program under `strace` to trace the system calls and decode the args you pass. If you're only reading 1 byte at a time, you probably left the newline unread from the previous line of input. See Q&As like [How do I ignore line breaks in input using NASM Assembly?](https://stackoverflow.com/q/18780927) and [Remove Trailing Line-Breaking Characters from Read Input in Assembly](https://stackoverflow.com/q/10271159). Yeah, I see a `mov edx, 1` in one of the reads, so that's probably it. If not, format your code into a proper `code block` and include some debugging details. – Peter Cordes Feb 10 '23 at 20:18

0 Answers0