Ввести два 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 - Assembler»

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

8   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ