
		Stheffany26
		
		(usa Outra)
		
		Enviado em 08/11/2016 - 14:17h 
		Estou com dúvida tenho Criar um programa escrito em Assembly para executar a função de uma calculadora com as quatro operações fundamentais. A calculadora deverá executar operações binárias de soma, subtração, divisão e multiplicação permitindo ao usuário decidir quando devem continuar ou finalizar as operações. Tenho isso ate agora, sendo que não sei como passa pra binario e digita mais de um digito
section .data
    ; Messages
    msg1        db        10,'-Calculator-',10,0
    lmsg1        equ        $ - msg1
    msg2        db        10,'Number 1: ',0
    lmsg2        equ        $ - msg2
    msg3        db        'Number 2: ',0
    lmsg3        equ        $ - msg3
    msg4        db        10,'1. Add',10,0
    lmsg4        equ        $ - msg4
    msg5        db        '2. Subtract',10,0
    lmsg5        equ        $ - msg5
    msg6        db        '3. Multiply',10,0
    lmsg6        equ        $ - msg6
    msg7        db        '4. Divide',10,0
    lmsg7        equ        $ - msg7
    msg8        db        'Operation: ',0
    lmsg8        equ        $ - msg8
    msg9        db        10,'Result: ',0
    lmsg9        equ        $ - msg9
    msg10        db        10,'Invalid Option',10,0
    lmsg10        equ        $ - msg10
    nlinea        db        10,10,0
    lnlinea        equ        $ - nlinea
section .bss
     ;Espaços reservados para armazenar os valores fornecidos pelo usuário.
    opc:        resb     2
    num1:        resb    2
    num2:        resb     2
    result:        resb     2
section .text
    global _start
_start:
    ;  Imprimir na tela a mensagem 1
    mov eax, 4
    mov ebx, 1
    mov ecx, msg1
    mov edx, lmsg1
    int 80h
    ; Imprimir na tela a mensagem 2
    mov eax, 4
    mov ebx, 1
    mov ecx, msg2
    mov edx, lmsg2
    int 80h
   ; obter o valor num1.
    mov eax, 3
    mov ebx, 0
    mov ecx, num1
    mov edx, 2
    int 80h
    ;  Imprimir na tela a mensagem 3
    mov eax, 4
    mov ebx, 1
    mov ecx, msg3
    mov edx, lmsg3
    int 80h
    ; obter o valor num2
    mov eax, 3
    mov ebx, 0
    mov ecx, num2
    mov edx, 2
    int 80h
    ; Imprimir na tela a mensagem 4
    mov eax, 4
    mov ebx, 1
    mov ecx, msg4
    mov edx, lmsg4
    int 80h
    ; Imprimir na tela a mensagem 5
    mov eax, 4
    mov ebx, 1
    mov ecx, msg5
    mov edx, lmsg5
    int 80h
    ; Imprimir na tela a mensagem 6
    mov eax, 4
    mov ebx, 1
    mov ecx, msg6
    mov edx, lmsg6
    int 80h
    ; Imprimir na tela a mensagem 7
    mov eax, 4
    mov ebx, 1
    mov ecx, msg7
    mov edx, lmsg7
    int 80h
    ; Imprimir na tela a mensagem 8
    mov eax, 4
    mov ebx, 1
    mov ecx, msg8
    mov edx, lmsg8
    int 80h
    ; opção selecionada.
    mov ebx,0
    mov ecx,opc
    mov edx,2
    mov eax,3
    int 80h
    mov ah, [opc]        ; Mover a opção selecionada para o registro ah
    sub ah, '0'        ; Converso de ascii para decimal
    ; comparar o valor digitado pelo usuário para saber o que operação para executar.
    cmp ah, 1
    je add
    cmp ah, 2
    je subtract
    cmp ah, 3
    je multiply
    cmp ah, 4
    je divide
    ; Se o valor digitado pelo usuário não cumprir alguma das situações acima
    ; condições, então vamos mostrar uma mensagem de erro e fechar o programa.
    mov eax, 4
    mov ebx, 1
    mov ecx, msg10
    mov edx, lmsg10
    int 80h
    jmp exit
add:
    ; manter os números nos registros al e bl
    mov al, [num1]
    mov bl, [num2]
    ; Converso de ascii para decimal
    sub al, '0'
    sub bl, '0'
    ; Add
    add al, bl
    ; Converso de ascii para decimal
    add al, '0'
    ;  mover o resultado
    mov [result], al
	
; Imprimir na tela a mensagem 9
    mov eax, 4
    mov ebx, 1
    mov ecx, msg9
    mov edx, lmsg9
    int 80h
    ;  Imprimir na tela o resultado
    mov eax, 4
    mov ebx, 1
    mov ecx, result
    mov edx, 2
    int 80h
    ; terminar o programa
    jmp exit
subtract:
    ;manter os números nos registros al e bl
    mov al, [num1]
    mov bl, [num2]
    ; Converso de ascii para decimal
    sub al, '0'
    sub bl, '0'
    ; Subtract
    sub al, bl
    ; Converso de ascii para decimal
    add al, '0'
    ; mover o resultado
    mov [result], al
    ; Imprimir na tela a mensagem 9
    mov eax, 4
    mov ebx, 1
    mov ecx, msg9
    mov edx, lmsg9
    int 80h
    ; Imprimir na tela o resultado
    mov eax, 4
    mov ebx, 1
    mov ecx, result
    mov edx, 1
    int 80h
    ; terminar o programa
    jmp exit
multiply:
    ;  armazenar os números em registos al e bl
    mov al, [num1]
    mov bl, [num2]
    ; Converso de ascii para decimal
    sub al, '0'
    sub bl, '0'
    ; Multiply. AX = AL x BL
    mul bl
    ; Converso de ascii para decimal
    add ax, '0'
    ; mover o resultado
    mov [result], ax
    ; Imprimir na tela a mensagem 9
    mov eax, 4
    mov ebx, 1
    mov ecx, msg9
    mov edx, lmsg9
    int 80h
    ; Imprimir na tela o resultado
    mov eax, 4
    mov ebx, 1
    mov ecx, result
    mov edx, 1
    int 80h
    ; terminar o programa
    jmp exit
divide:
    ;guarde os números nas machado registos e bx
    mov al, [num1]
    mov bl, [num2]
    mov dx, 0
    mov ah, 0
    ; Converso de ascii para decimal
    sub al, '0'
    sub bl, '0'
    ; Division. AL = AX / BX
    div bl
    ; Converso de ascii para decimal
    add ax, '0'
    ; We move the result
    mov [result], ax
    ; Imprimir na tela a mensagem 9
    mov eax, 4
    mov ebx, 1
    mov ecx, msg9
    mov edx, lmsg9
    int 80h
    ; Imprimir na tela o resultado
    mov eax, 4
    mov ebx, 1
    mov ecx, result
    mov edx, 1
    int 80h
    ; guarde os números nas machado registos e bx
    jmp exit
exit:
    ;Imprimir na tela duas novas linhas
    mov eax, 4
    mov ebx, 1
    mov ecx, nlinea
    mov edx, lnlinea
    int 80h
    ; Feche o programa
    mov eax, 1
    mov ebx, 0
    int 80h