Paste
Copy
Cut
Options
  • Pregunta: incluir emu8086.inc nombre "calc3" ; simplificado de clc2.asm con scan_num y print_num llamado directamente desde la biblioteca emu8086. ; calculadora simple basada en símbolo del sistema (+,-,*,/) para 8086. ; ejemplo de calculo: ; entrada 1 <- número: 10 ; entrada 2 <- operador: - ; entrada 3 <- número: 5 ; ------------------- ; 10 - 5 = 5 ; salida ->

    incluir emu8086.inc
    nombre "calc3"
    ; simplificado de clc2.asm con scan_num y print_num llamado directamente desde la biblioteca emu8086.
    ; calculadora simple basada en símbolo del sistema (+,-,*,/) para 8086.
    ; ejemplo de calculo:
    ; entrada 1 <- número: 10 
    ; entrada 2 <- operador: - 
    ; entrada 3 <- número: 5 
    ; ------------------- 
    ; 10 - 5 = 5 
    ; salida -> número: 5
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;; esta macro esta copiada de emu8086.inc ;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; esta macro imprime un char almacenado en AL y avanza
    ; la posición actual del cursor:
    CARÁCTER MACRO PUTC3
            HACHA DE EMPUJE
            MOV AL, char
            MOV AH, 0Eh
            INT 10h     
            HACHA POP
    PUTC3 ENDM
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    
    org 100h
    
    iniciar jmp
    
    
    ; definir variables:
    
    msg0 db "nota: la calculadora solo funciona con valores enteros".,0Dh,0Ah
         db "para aprender a generar el resultado de una división flotante, consulte float.asm en los ejemplos", 0Dh, 0Ah, '$'
    msg1 db 0Dh,0Ah, 0Dh,0Ah, 'ingrese el primer número: $'
    msg2 db "ingrese el operador: + - * / : $"
    msg3 db "ingrese el segundo número: $"
    msg4 db 0dh,0ah, 'el resultado aproximado de mis cálculos es: $' 
    msg5 db 0dh,0ah ,'¡gracias por usar la calculadora! presiona cualquier tecla... ', 0Dh,0Ah, '$'
    err1 db "¡operador incorrecto!", 0Dh,0Ah, '$'
    smth db "y algo.... $"
    
    ; El operador puede ser: '+', '-', '*', '/' o 'q' para salir en el medio.
    opr db '?'
    
    ; primer y segundo número:
    num1 dw?
    num2 dw?
    
    
    comenzar:
        mov dx, desplazar msg0
        mov ah, 9
        hasta las 21h
    
    
        lea dx, mensaje1
        mov ah, 09h ; cadena de salida en ds:dx
        hasta las 21h  
    
    
    ; obtenga el número firmado de varios dígitos del teclado, 
    ; y almacene el resultado en el registro cx:
    
        llamada scan_num
    
    ; almacenar el primer número:
        mov num1, cx 
    
    ; nueva línea:
        PUTC3 0Dh
        PUTC3 0Ah
    
        lea dx, mensaje2
        mov ah, 09h ; cadena de salida en ds:dx
        hasta las 21h  
    
    
    ; obtener operador:
        mov ah, 1 ; entrada de un solo carácter a AL.
        hasta las 21h
        mov opr, al
    
    ; nueva línea:
        PUTC3 0Dh
        PUTC3 0Ah
    
    
        cmp opr, 'q' ; q - salida en el medio.
        salida
    
        cmp opr, '*'
        jb mal_opr
        cmp opr, '/'
        ja mal_opr
    
    
    ; mostrar una cadena almacenada desde ds:dx
        lea dx, mensaje3
        mov ah, 09h
        hasta las 21h  
    
    
    ; obtenga el número firmado de varios dígitos del teclado, 
    ; y almacene el resultado en el registro cx:
    
        llamada scan_num
    
    
    ; almacenar el segundo número:
        mov num2, cx 
    
    
        lea dx, msg4
        mov ah, 09h ; cadena de salida en ds:dx
        hasta las 21h  
    
    
    ; calcular:
    
    
        cmp opr, '+'
        je do_plus
        
        cmp opr, '-'
        je do_minus
    
        cmp opr, '*'
        je do_mult
    
        cmp opr, '/'
        je do_div
    
    
    ; Ninguna de las anteriores....
    mal_opr:
        lea dx, err1
        mov ah, 09h ; cadena de salida en ds:dx
        hasta las 21h  
    
    
    salida:
    ; cadena de salida en ds:dx
        lea dx, mensaje5
        mov ah, 09h
        hasta las 21h  
    
    
    ; espera cualquier clave...
        mov ah, 0
        hasta las 16h
    
    
        ret; volver a os.
    
    
    do_plus:  
    
        hacha de movimiento, num1
        agregar hacha, num2
        llamar a imprimir_num; imprimir el valor del hacha.
    
        salida jmp
    
    
    
    hacer_menos:
    
        hacha de movimiento, num1
        eje secundario, num2
        llamar a imprimir_num; imprimir el valor del hacha.
    
        salida jmp
    
    
    
    hacer_mult:
    
        hacha de movimiento, num1
        imul num2 ; (dx hacha) = hacha * num2. 
        llamar a imprimir_num; imprimir el valor del hacha.
    ; dx se ignora (calc solo funciona con números pequeños).
    
        salida jmp
    
    
    
    hacer_div:
    ; dx se ignora (calc solo funciona con números enteros pequeños).
        mov dx, 0
        hacha de movimiento, num1
        idiv num2 ; hacha = (dx hacha) / num2.
        cmp dx, 0
        jnz aprox.
        llamar a imprimir_num; imprimir el valor del hacha.
        salida jmp
    aprox:
        llamar a imprimir_num; imprimir el valor del hacha.
        lea dx, algo
        mov ah, 09h ; cadena de salida en ds:dx
        hasta las 21h  
        salida jmp
    
    define_scan_num
    ; define_print_string
    define_print_num
    define_print_num_uns
    

    a) dibujar un diagrama de flujo del programa. el diagrama de flujo debe contener cuadros rectangulares para los cinco bloques y cuatro subrutinas antes mencionados y cuadros de diamantes con ramas y condiciones asociadas (por ejemplo, cómo una subrutina salta de regreso al programa principal)

    b) i) ¿Cuál es la dirección de 20 bits de la ubicación de memoria utilizada para almacenar el operador aritmético? (Se requiere captura de pantalla para justificar su respuesta).

    ii) ¿Cuáles son las direcciones de 20 bits de las ubicaciones de memoria utilizadas para almacenar los dos números con signo? (Se requiere captura de pantalla para justificar su respuesta).

    iii) ¿Cuáles son los rangos de ellos? ¿Por qué?

    iv) ¿Cómo detecta el programa un operador incorrecto (es decir, ninguno de +, -, *, /)?

    v) ¿Puede la detección ser correcta si un usuario escribe coma “,” o punto “.”?

    vi) ¿Cómo se determina e imprime el signo del resultado?

    c) Para las cuatro subrutinas: do_plus, do_minus, do_mult, do_div, responda la siguiente pregunta:

    ¿Por qué esas cuatro subrutinas tienen jmp exit como última instrucción?

  • Chegg Logo
    Esta pregunta aún no se resolvió!
    ¿No es lo que buscas?
    Envía tu pregunta a un experto en la materia.