Помогите найти ошибку в вычислении выражения - 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.