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

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

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

Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3 - В^2. Программа 1. Передача параметров через регистр. Тип процедуры – дальний. Программа 2. Передача параметров через глобальные переменные. Тип процедуры – дальний. Программа 3. Передача параметров через стек. Тип процедуры – ближний. В общем, начал я с первой задачи, но, так как рука не набита, не могу разобраться, как грамотно исполнить программу. В командной строке при запуске мной созданной программы выгружается бесконечный цикл символов. Собственно сам листинг:
Листинг программы
  1. ;Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3-В^2.
  2. .model small ;Количество занимаемой моделью памяти
  3. .stack 100h ;Задаем начальный адрес стека
  4. .data
  5. otvet dw 0;
  6. Mesg db "A^3-B^2= $"
  7. .code
  8. main:
  9. Vichislenie proc far
  10. mul ax; Заданное первое число в квадрате
  11. mul ax; Заданное первое число в кубе (Нужно поменять на значение в 3 степени)
  12. mul bx; Заданное второе число в квадрате
  13. sub ax,bx; A^3-B^2
  14. add otvet,ax; В переменную ответ передаем результат вычислений
  15. mov ah, 09
  16. mov dx, offset mesg ; вывод сообщения
  17. add dx, otvet;
  18. int 21h; Прерывание
  19. Vichislenie endp
  20. mov ax,3; В регистр ax записываем значение = 3
  21. mov bx,2; В регистр bx записываем значение = 2
  22. call Vichislenie
  23. mov ax,4c00h ; выход
  24. int 21h
  25. end main
Компилирую это дело через masm и doslnk.

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

textual
Листинг программы
  1. ;Ввести два 16-битовых целых числа А и В. Вычислить значение выражения: А^3-В^2.
  2. .model small    ;Количество используемых сегментов
  3. .stack 100h     ;Задаем размер стека
  4. .data
  5.     otvet dw 0;
  6.     Mesg db "A^3-B^2= $"
  7. .code
  8.     main:
  9. ;настройка сегментного регистра    
  10.         mov ax,@data
  11.         mov ds,ax
  12. ;остальная программа
  13.         mov bx,3;A
  14.         mov ax,2;B
  15.        
  16.         call Vichislenie
  17.        
  18.         mov ax,4c00h ; выход
  19.         int 21h
  20.  
  21.  
  22.  
  23.  
  24.         Vichislenie proc
  25.         mul ax;B*B
  26.         mov cx,ax
  27.         mov ax,bx
  28.         mul ax;A*A
  29.         mul bx;(A*A)*A
  30.         sub ax,cx; Вычитание A^3-B^2
  31.         mov otvet,ax; В переменную ответ передаем результат вычислений
  32.        
  33.         mov ah, 09
  34.         mov dx, offset Mesg ; вывод сообщения
  35.        
  36. ;        call Show_AX
  37.         int 21h;    Прерывание
  38. MOV AX,otvet
  39. CALL    Show_AX
  40.         ret
  41.         Vichislenie endp
  42.        
  43.         Show_AX proc
  44.         push    ax
  45. ;        push    bx - не используется
  46.         push    cx
  47.         push    dx
  48.         push    di
  49.  ;при выводе будет понятно почему
  50.         mov     di, 10          ; di - основание системы счисления
  51.         xor     cx, cx          ; cx - кол. цифр в числе
  52.  
  53.     @@Conv:
  54.         xor     dx, dx
  55.         div     di              ; dl = num mod 10
  56.         add     dl, '0'         ; перевод в символьный формат
  57.         inc     cx
  58.         push    dx              ; складываем в стэк
  59.         or      ax, ax
  60.         jnz     @@Conv
  61.         ; выводим из стэка на экран
  62.     @@Show:
  63.         pop     dx              ; dl = очередной символ
  64.         mov     ah, 2           ; ah - функция вывода символа на экран
  65.         int     21h
  66. ;вот тут
  67. ;        dec     di              ; повторяем пока di<>0
  68. ;        jnz     @@Show
  69. LOOP    @@Show
  70.  
  71.         pop     di
  72.         pop     dx
  73.         pop     cx
  74. ;        pop     bx - не используется
  75.         pop     ax
  76.     ret
  77.         Show_AX endp
  78.  
  79. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы