После добавления проверки перестало выводить результат формулы

Рейтинг: 0Ответов: 1Опубликовано: 16.05.2023

Начал делать лабораторные работы по асемблеру и уже на 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

Помогите починить код пожалуйста, против объяснений против не буду но желательно с примером как правильно.

Ответы

▲ 0Принят

Вот что получилось в итоге

.model small
.stack 100h
.data
msgLab db 'Lab 3', 0Dh, 0Ah, '$' ; Строка - Lab 3
msgInput db Inputa:', '$' ; Строка - Inputa:
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 = ', '$' ; Строка - y = 4 + ab - c/d =
msgDuplicateNumbers db 'Числа совпадают', 0Dh, 0Ah, '$' ; Строка - Числа совпадают
a db ? ; Переменная a
b db 1 ; Переменная b со значением 1
c db 0 ; Переменная c со значением 0
d db 9 ; Переменная d со значением 9
x1 dw ? ; Переменная x1
x2 dw ? ; Переменная x2
y dw ?

.code
org 100h

start:
mov ax, @data
mov ds, ax

mov dx, OFFSET msgLab ; Вывод строки - Лабораторная работа 3
mov ah, 09h ; Функция вывода строки
int 21h

mov dx, OFFSET msgInput ; Вывод строки - Введите 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 ; Инициализация переменной b значением 1
mov c, 0 ; Инициализация переменной c значением 0
mov d, 9 ; Инициализация переменной d значением 9

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
mov bl,Переменная c со значением 0
mov bl, d
cwd
idiv bl ; Деление AX на BL
mov x2, ax

mov ax, x1 ; Сохранение результата x1 в регистре AX
add ax, 4 ; Добавить 4 к AX

sub ax, x2 ; AX - x2

mov y, ax ; Сохранение результата в переменную y

mov dx, OFFSET msgR ; Вывод строки msgR в регистре DX для вывода
mov ah, 09h ; Функция вывода строки
int 21h

mov ax, y ; Сохранение результата в переменную y в регистре AX для вывода
mov bl, 10 ; Сохранение числа 10 в регистре BL для деления
div bl ; Деление AX на BL
; Результат: остаток (цифра единиц) в AL, частное (цифра десятков) в AH

add al, 48 ; Добавить 48 для преобразования в ASCII
push ax ; Сохранение цифры в стеке
mov dl, al ; Загрузка цифры в регистр DL для вывода
mov ah, 02h ; Функция вывода символа в DL
int 21h

pop ax ; Восстановление цифры из стека
add ah, 48 ; Добавить 48 для преобразования в ASCII
mov dl, ah ; Загрузка цифры в регистр DL для вывода
mov ah, 02h ; Функция вывода символа в DL
int 21h

mov ax, 4c00h ; Завершение программы
int 21h

duplicate_numbers:
; Если есть совпадение чисел, вывести сообщение об этом
mov dx, OFFSET msgDuplicateNumbers ; Вывод строки - Числа совпадают
mov ah, 09h ; Функция вывода строки
int 21h

mov ax, 4c00h ; Завершение программы
int 21h
end start