После добавления проверки перестало выводить результат формулы
Начал делать лабораторные работы по асемблеру и уже на 3 лабе столкнулся с непреодолимой для себя стеной. Говорю сразу что асемблер вообще не понимаю, а изучаю C++.
По условиям задания нужно написать код который сохраняет целочисленные значения a=? b=1 c=0 d=9. Нужно решить формулу y=4+ab-c/d. Также в коде должно быть сравнения этих чисел и если они совпадают сказать об этом. После добавления проверки перестало выводить результат формулы.
.model small
.stack 100h
.data
msgLab db 'Лаб 3', 0Dh, 0Ah, '$' ; Строка - Лаб 3
msgInput db 'Input a:', '$' ; Строка - Input a:
msgB db 0Dh, 0Ah, ' b=1', 0Dh, 0Ah, '$' ; Строка - b=1
msgC db ' c=0', 0Dh, 0Ah, '$' ; Строка - c=0
msgD db ' d=9', 0Dh, 0Ah, '$' ; Строка - d=9
msgR db 'y = 4 + ab - c/d = ', '$' ; Строка - Результат:
msgDuplicateNumbers db 'Числа совпадают', 0Dh, 0Ah, '$' ; Строка - Числа совпадают
a db ? ; Переменная a
b db 1 ; Переменная b
c db 0 ; Переменная c
d db 9 ; Переменная d
x1 dw ? ; Переменная x1
x2 dw ? ; Переменная x2
.code
org 100h
start:
mov ax, @data
mov ds, ax
mov dx, OFFSET msgLab ; Вывод на экран - Лаб 3
mov ah, 09h ; Функция печати строки
int 21h
mov dx, OFFSET msgInput ; Вывод на экран - Input a:
mov ah, 09h ; Функция печати строки
int 21h
mov ah, 01h ; Считывание символа
int 21h ; Результат сохраняется в регистре AL
sub al, 30h ; Конвертация из ASCII в десятичное число
mov a, al ; Сохранение значения в переменную a
mov dx, OFFSET msgB ; Вывод на экран - b=1
mov ah, 09h ; Функция печати строки
int 21h
mov dx, OFFSET msgC ; Вывод на экран - c=0
mov ah, 09h ; Функция печати строки
int 21h
mov dx, OFFSET msgD ; Вывод на экран - d=9
mov ah, 09h ; Функция печати строки
int 21h
mov b, 1 ; Присвоение значения 1 переменной b
mov c, 0 ; Присвоение значения 0 переменной c
mov d, 9 ; Присвоение значения 9 переменной d
mov al, a
cmp al, b
je duplicate_numbers
cmp al, c
je duplicate_numbers
cmp al, d
je duplicate_numbers
mov al, b
cmp al, c
je duplicate_numbers
cmp al, d
je duplicate_numbers
mov al, c
cmp al, d
je duplicate_numbers
; Если код достигает этого места, значит числа не равны друг другу
; Продолжайте обычное выполнение программы
normal_flow:
mov al, a
mul b
mov x1, ax
mov al, c
cwd
idiv d
mov x2, ax
mov ax, x1 ; Загрузка значения x1 в регистр AX
add ax, 4 ; Добавление 4 к AX
mov dx, x2 ; Загрузка значения x2 в регистр DX
sub ax, dx ; AX - DX
mov dx, OFFSET msgR ; Вывод на экран - Результат:
mov ah, 09h ; Функция печати строки
int 21h
add ax, 30h ; Конвертация из десятичного числа в ASCII
mov dl, ah ; Загрузка значения AH в регистр DL
mov ah, 02h ; Функция печати символа
int 21h
mov ax, 4c00h ; Завершение программы
int 21h
duplicate_numbers:
; Обработка ситуации, когда числа равны друг другу
mov dx, OFFSET msgDuplicateNumbers ; Вывод на экран - Числа совпадают
mov ah, 09h ; Функция печати строки
int 21h
mov ax, 4c00h ; Завершение программы
int 21h
mov ax, 4c00h ; Завершение программы
int 21h
end start
Помогите починить код пожалуйста, против объяснений против не буду но желательно с примером как правильно.
Источник: Stack Overflow на русском