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

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

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

A/B - 42, если A>B -11, если А=В (A*A - 8)/A, если А<В Первые два случая работают нормально, а третий случай программа не видит. Помогите найти ошибку
EXTRN WRITE:FAR, READ:FAR
STAK        SEGMENT     PARA STACK 'STACK'
            DW          256 DUP(?)
STAK        ENDS
 
DATA        SEGMENT     PARA PUBLIC 'DATA'
A           DW          ?
B           DW          ?
 
D           DW          -11       ; VAR2
S           DW          ?       ; РЕЗУЛЬТАТ
BR          DB          10,13,10,13,'$'
MSG00       DB          10,13,'VYCHISLIT: A/B-42, ESLI A>B; -11, ESLI A=B; (A*A-8)/A, ESLI A<B',10,13,'$'
MSG01       DB          10,13,'VVEDITE A: ','$'
MSG02       DB          10,13,'VVEDITE B: ','$'
 
MSG_ERROR01 DB          'ERROR: DELENIE NA 0','$'
MSG_ERROR02 DB          'ERROR: PEREPOLNENIE','$'
MSG_RESET   DB          10,13,'VVEDITE DANNYE ZANOVO:',10,13,'$'
MSG_OTVET   DB          'RESULTAT: ','$'
STROKA      DB          100,101 DUP('$'),'$'
DATA        ENDS
 
CODE        SEGMENT     PARA PUBLIC 'CODE'
BEGIN:      ASSUME      CS:CODE, DS:DATA, SS:STAK
 
            MOV         AX,DATA
            MOV         DS,AX
 
; ВВОД ДАННЫХ:
            LEA         DX,MSG00
            MOV         AH,9H
            INT         21H
           
RESET:      LEA         DX,MSG01
            MOV         AH,9H
            INT         21H
            CALL        READ
            MOV         A,AX
           
            LEA         DX,MSG02
            MOV         AH,9H
            INT         21H
            CALL        READ
            MOV         B,AX

            LEA         DX,BR
            MOV         AH,9H
            INT         21H
           
;ВЫЧИСЛЕНИЯ
           MOV        AX,A
           SUB        AX,B
           CMP        AX,0
           JNBE       VAR1
           JNAE       VAR3
           MOV        AX,D
           MOV        S,AX
           JMP         FINISH

VAR1:
          MOV         AX,A
          MOV         D,AX
          MOV         AX,B
          CMP         AX,0
          JE            ERROR01
          CWD
          XOR         AX,AX
          MOV         AX,A
          IDIV         B
          CWD
          SUB         AX,42
          MOV         S,AX
          JMP          FINISH
 
VAR3:
         MOV       AX,A
         CMP       AX,0
         JE          ERROR01
         IMUL      A
         JO          ERROR02
         JC          ERROR02
         SUB       AX,8
         IDIV       A
         CWD
         MOV       S,AX
         JMP        FINISH

; ОШИБКА: ДЕЛЕНИЕ НА 0
ERROR01:    LEA         DX,MSG_ERROR01
            MOV         AH,9H
            INT         21H
            LEA         DX,MSG_RESET
            MOV         AH,9H
            INT         21H
            JMP         RESET
 
; ОШИБКА: ПЕРЕПОЛНЕНИЕ
ERROR02:    LEA         DX,MSG_ERROR02
            MOV         AH,9H
            INT         21H
            LEA         DX,MSG_RESET
            MOV         AH,9H
            INT         21H
            JMP         RESET
 
; ВЫВОД РЕЗУЛЬТАТА:
FINISH:     LEA         DX,MSG_OTVET
            MOV         AH,9H
            INT         21H
            MOV         AX,S
            CALL        WRITE
            MOV         AH,4CH
            INT         21H
CODE        ENDS
            END         BEGIN

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

textual
Листинг программы
;ВЫЧИСЛЕНИЯ
           MOV        AX,A
           SUB        AX,B
           CMP        AX,0
           JNBE       VAR1
           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