Помогите найти ошибку в вычислении выражения - Assembler

Узнай цену своей работы

Формулировка задачи:

A/B - 42, если A>B -11, если А=В (A*A - 8)/A, если А<В Первые два случая работают нормально, а третий случай программа не видит. Помогите найти ошибку
Листинг программы
  1. EXTRN WRITE:FAR, READ:FAR
  2. STAK SEGMENT PARA STACK 'STACK'
  3. DW 256 DUP(?)
  4. STAK ENDS
  5. DATA SEGMENT PARA PUBLIC 'DATA'
  6. A DW ?
  7. B DW ?
  8. D DW -11 ; VAR2
  9. S DW ? ; РЕЗУЛЬТАТ
  10. BR DB 10,13,10,13,'$'
  11. MSG00 DB 10,13,'VYCHISLIT: A/B-42, ESLI A>B; -11, ESLI A=B; (A*A-8)/A, ESLI A<B',10,13,'$'
  12. MSG01 DB 10,13,'VVEDITE A: ','$'
  13. MSG02 DB 10,13,'VVEDITE B: ','$'
  14. MSG_ERROR01 DB 'ERROR: DELENIE NA 0','$'
  15. MSG_ERROR02 DB 'ERROR: PEREPOLNENIE','$'
  16. MSG_RESET DB 10,13,'VVEDITE DANNYE ZANOVO:',10,13,'$'
  17. MSG_OTVET DB 'RESULTAT: ','$'
  18. STROKA DB 100,101 DUP('$'),'$'
  19. DATA ENDS
  20. CODE SEGMENT PARA PUBLIC 'CODE'
  21. BEGIN: ASSUME CS:CODE, DS:DATA, SS:STAK
  22. MOV AX,DATA
  23. MOV DS,AX
  24. ; ВВОД ДАННЫХ:
  25. LEA DX,MSG00
  26. MOV AH,9H
  27. INT 21H
  28. RESET: LEA DX,MSG01
  29. MOV AH,9H
  30. INT 21H
  31. CALL READ
  32. MOV A,AX
  33. LEA DX,MSG02
  34. MOV AH,9H
  35. INT 21H
  36. CALL READ
  37. MOV B,AX
  38.  
  39. LEA DX,BR
  40. MOV AH,9H
  41. INT 21H
  42. ;ВЫЧИСЛЕНИЯ
  43. MOV AX,A
  44. SUB AX,B
  45. CMP AX,0
  46. JNBE VAR1
  47. JNAE VAR3
  48. MOV AX,D
  49. MOV S,AX
  50. JMP FINISH
  51.  
  52. VAR1:
  53. MOV AX,A
  54. MOV D,AX
  55. MOV AX,B
  56. CMP AX,0
  57. JE ERROR01
  58. CWD
  59. XOR AX,AX
  60. MOV AX,A
  61. IDIV B
  62. CWD
  63. SUB AX,42
  64. MOV S,AX
  65. JMP FINISH
  66. VAR3:
  67. MOV AX,A
  68. CMP AX,0
  69. JE ERROR01
  70. IMUL A
  71. JO ERROR02
  72. JC ERROR02
  73. SUB AX,8
  74. IDIV A
  75. CWD
  76. MOV S,AX
  77. JMP FINISH
  78.  
  79. ; ОШИБКА: ДЕЛЕНИЕ НА 0
  80. ERROR01: LEA DX,MSG_ERROR01
  81. MOV AH,9H
  82. INT 21H
  83. LEA DX,MSG_RESET
  84. MOV AH,9H
  85. INT 21H
  86. JMP RESET
  87. ; ОШИБКА: ПЕРЕПОЛНЕНИЕ
  88. ERROR02: LEA DX,MSG_ERROR02
  89. MOV AH,9H
  90. INT 21H
  91. LEA DX,MSG_RESET
  92. MOV AH,9H
  93. INT 21H
  94. JMP RESET
  95. ; ВЫВОД РЕЗУЛЬТАТА:
  96. FINISH: LEA DX,MSG_OTVET
  97. MOV AH,9H
  98. INT 21H
  99. MOV AX,S
  100. CALL WRITE
  101. MOV AH,4CH
  102. INT 21H
  103. CODE ENDS
  104. END BEGIN

Решение задачи: «Помогите найти ошибку в вычислении выражения»

textual
Листинг программы
  1. ;ВЫЧИСЛЕНИЯ
  2.            MOV        AX,A
  3.            SUB        AX,B
  4.            CMP        AX,0
  5.            JNBE       VAR1
  6.            JNAE       VAR3

Объяснение кода листинга программы

  1. MOV AX, A — Перемещает значение регистра A в регистр AX.
  2. SUB AX, B — Вычитает значение регистра B из регистра AX.
  3. CMP AX, 0 — Сравнивает значение регистра AX с нулём.
  4. JNBE VAR1 — Если значение регистра AX больше или равно нулю, то переход к метке VAR1.
  5. JNAE VAR3 — Если значение регистра AX меньше нуля, то переход к метке VAR3.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут