Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3 - В^2 - Assembler
Формулировка задачи:
Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3 - В^2.
Программа 1. Передача параметров через регистр. Тип процедуры – дальний.
Программа 2. Передача параметров через глобальные переменные. Тип процедуры – дальний.
Программа 3. Передача параметров через стек. Тип процедуры – ближний.
В общем, начал я с первой задачи, но, так как рука не набита, не могу разобраться, как грамотно исполнить программу. В командной строке при запуске мной созданной программы выгружается бесконечный цикл символов. Собственно сам листинг:
Компилирую это дело через masm и doslnk.
Листинг программы
- ;Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3-В^2.
- .model small ;Количество занимаемой моделью памяти
- .stack 100h ;Задаем начальный адрес стека
- .data
- otvet dw 0;
- Mesg db "A^3-B^2= $"
- .code
- main:
- Vichislenie proc far
- mul ax; Заданное первое число в квадрате
- mul ax; Заданное первое число в кубе (Нужно поменять на значение в 3 степени)
- mul bx; Заданное второе число в квадрате
- sub ax,bx; A^3-B^2
- add otvet,ax; В переменную ответ передаем результат вычислений
- mov ah, 09
- mov dx, offset mesg ; вывод сообщения
- add dx, otvet;
- int 21h; Прерывание
- Vichislenie endp
- mov ax,3; В регистр ax записываем значение = 3
- mov bx,2; В регистр bx записываем значение = 2
- call Vichislenie
- mov ax,4c00h ; выход
- int 21h
- end main
Решение задачи: «Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3 - В^2»
textual
Листинг программы
- ;Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3-В^2.
- .model small ;Количество используемых сегментов
- .stack 100h ;Задаем размер стека
- .data
- otvet dw 0;
- Mesg db "A^3-B^2= $"
- .code
- main:
- ;настройка сегментного регистра
- mov ax,@data
- mov ds,ax
- ;остальная программа
- mov bx,3;A
- mov ax,2;B
- call Vichislenie
- mov ax,4c00h ; выход
- int 21h
- Vichislenie proc
- mul ax;B*B
- mov cx,ax
- mov ax,bx
- mul ax;A*A
- mul bx;(A*A)*A
- sub ax,cx; Вычитание A^3-B^2
- mov otvet,ax; В переменную ответ передаем результат вычислений
- mov ah, 09
- mov dx, offset Mesg ; вывод сообщения
- ; call Show_AX
- int 21h; Прерывание
- MOV AX,otvet
- CALL Show_AX
- ret
- Vichislenie endp
- Show_AX proc
- push ax
- ; push bx - не используется
- push cx
- push dx
- push di
- ;при выводе будет понятно почему
- mov di, 10 ; di - основание системы счисления
- xor cx, cx ; cx - кол. цифр в числе
- @@Conv:
- xor dx, dx
- div di ; dl = num mod 10
- add dl, '0' ; перевод в символьный формат
- inc cx
- push dx ; складываем в стэк
- or ax, ax
- jnz @@Conv
- ; выводим из стэка на экран
- @@Show:
- pop dx ; dl = очередной символ
- mov ah, 2 ; ah - функция вывода символа на экран
- int 21h
- ;вот тут
- ; dec di ; повторяем пока di<>0
- ; jnz @@Show
- LOOP @@Show
- pop di
- pop dx
- pop cx
- ; pop bx - не используется
- pop ax
- ret
- Show_AX endp
- end main
Объяснение кода листинга программы
- Задаем переменные:
otvet
(результат выражения) с начальным значением 0;Mesg
(сообщение) со значениемA^3-B^2= $
.
- Движение к сегментному регистру:
- Перемещаем значение
@data
в регистр AX; - Передаем значение из регистра AX в регистр DS.
- Перемещаем значение
- Присваиваем значения переменным:
- BX получает значение 3 (переменная А);
- AX получает значение 2 (переменная B).
- Вызываем процедуру
Vichislenie
. - Устанавливаем значение регистра AX в 4c00h для завершения программы.
- В процедуре
Vichislenie
:- Умножаем AX на себя, получаем B*B;
- Помещаем результат в регистр CX;
- AX получает значение BX;
- Умножаем AX на себя, получаем A*A;
- Умножаем AX на BX, получаем (AA)A;
- Вычитаем CX из AX, получаем A^3 - B^2;
- Передаем значение из AX в переменную otvet.
- Выводим сообщение:
- Загружаем 09 в регистр AH;
- Помещаем адрес Mesg в регистр DX;
- Вызываем прерывание 21h.
- Запускаем процедуру
Show_AX
для вывода значения переменной otvet на экран. - Процедура
Show_AX
:- Помещаем значение регистра AX (ответ) в стек;
- Инициализируем регистры, задаем основание системы счисления;
- Проводим конверсию числа в символьный формат;
- Выводим символы на экран;
- Повторяем действия, пока не выведем все цифры из стека.
- Завершаем процедуру
Show_AX
. - Завершаем программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д