Ввести два 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
. - Завершаем программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д