Помогите найти ошибку в вычислении выражения - 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
Объяснение кода листинга программы
- MOV AX, A — Перемещает значение регистра A в регистр AX.
- SUB AX, B — Вычитает значение регистра B из регистра AX.
- CMP AX, 0 — Сравнивает значение регистра AX с нулём.
- JNBE VAR1 — Если значение регистра AX больше или равно нулю, то переход к метке VAR1.
- JNAE VAR3 — Если значение регистра AX меньше нуля, то переход к метке VAR3.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д