Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3 - В^2 - Assembler

Узнай цену своей работы

Формулировка задачи:

Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3 - В^2. Программа 1. Передача параметров через регистр. Тип процедуры – дальний. Программа 2. Передача параметров через глобальные переменные. Тип процедуры – дальний. Программа 3. Передача параметров через стек. Тип процедуры – ближний. В общем, начал я с первой задачи, но, так как рука не набита, не могу разобраться, как грамотно исполнить программу. В командной строке при запуске мной созданной программы выгружается бесконечный цикл символов. Собственно сам листинг:
;Ввести два 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
Компилирую это дело через masm и doslnk.

Решение задачи: «Ввести два 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

Объяснение кода листинга программы

  1. Задаем переменные:
    • otvet (результат выражения) с начальным значением 0;
    • Mesg (сообщение) со значением A^3-B^2= $.
  2. Движение к сегментному регистру:
    • Перемещаем значение @data в регистр AX;
    • Передаем значение из регистра AX в регистр DS.
  3. Присваиваем значения переменным:
    • BX получает значение 3 (переменная А);
    • AX получает значение 2 (переменная B).
  4. Вызываем процедуру Vichislenie.
  5. Устанавливаем значение регистра AX в 4c00h для завершения программы.
  6. В процедуре Vichislenie:
    • Умножаем AX на себя, получаем B*B;
    • Помещаем результат в регистр CX;
    • AX получает значение BX;
    • Умножаем AX на себя, получаем A*A;
    • Умножаем AX на BX, получаем (AA)A;
    • Вычитаем CX из AX, получаем A^3 - B^2;
    • Передаем значение из AX в переменную otvet.
  7. Выводим сообщение:
    • Загружаем 09 в регистр AH;
    • Помещаем адрес Mesg в регистр DX;
    • Вызываем прерывание 21h.
  8. Запускаем процедуру Show_AX для вывода значения переменной otvet на экран.
  9. Процедура Show_AX:
    • Помещаем значение регистра AX (ответ) в стек;
    • Инициализируем регистры, задаем основание системы счисления;
    • Проводим конверсию числа в символьный формат;
    • Выводим символы на экран;
    • Повторяем действия, пока не выведем все цифры из стека.
  10. Завершаем процедуру Show_AX.
  11. Завершаем программу.

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы