Помогите найти ошибку в вычислении выражения - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д