После добавления проверки перестало выводить результат формулы
Начал делать лабораторные работы по асемблеру и уже на 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
Помогите починить код пожалуйста, против объяснений против не буду но желательно с примером как правильно.
Ответы (1 шт):
Автор решения: ᅠWoulker
→ Ссылка
Вот что получилось в итоге
.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