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?
- Esta pregunta aún no se resolvió!¿No es lo que buscas?Envía tu pregunta a un experto en la materia.
Estudia mejor, ¡ahora en español!
Entiende todos los problemas con explicaciones al instante y pasos fáciles de aprender de la mano de expertos reales.