![](/user_photo/2706_HbeT2.jpg)
Лабораторная работа 5
A * X^4 + B * X^3 + C div X + D div X
.MODEL small
.stack 100h
.data
msg db "ESC-exit",13,10,10,"A * X^4 + B * X^3 + C div X + D div X",13,10,"Enter digit (1-8) A,B,C,D,X",13,10,"$"
msg2 db "Calculation...",13,10,"$"
var_a dw ? ;переменные для хранения введенных чисел
var_b dw ?
var_c dw ?
var_d dw ?
var_x dw ?
temp dw ? ;переменная для промежуточных вычислений
number dw ? ;результат
buff db 15 dup (0) ;
.code
;=========================================================
;Enter_digit - процедура ввода чисел
;=========================================================
Enter_digit proc
;обнулим регистры участвующие в процедуре
xor si,si ;si-смещение для буфера и счетчик ввода
@enter:
mov ah,0 ; Ожидаем нажатия и
int 16h ; читаем код клавиши
cmp al,1bh ; если код равен 1bh -клавиша esc
je exit ; переходим на метку выхода из программы
cmp al,31h ; если код клавиши меньше 31h
jb @f ; переходим на очередной цикл ввода
cmp al,39h ; если больше 39h
jnb @f ; переходим на очередной цикл ввода
mov ah,0eh ; иначе выводим символ
int 10h ; на экран
mov [buff+si],al ; заносим код символа в буфер данных со смещением si
inc si ; увеличим значение регистра si на 1 для следующего символа
mov al,' ' ; заносим в al значение пробела
mov ah,0eh ; Выводим пробел
int 10h ; на экран
@@:
cmp si,5 ;если счетчик равен 5
je @f ;выйти из цикла ввода
jmp @enter ;иначе продолжить цикл
@@:
mov al,10 ;перевод курсора на следующую строку
mov ah,0eh ;
int 10h ;
ret
Enter_digit endp
;=========================================================
;StrToHex - процедура перевода введеных символов в числа
;=========================================================
StrToHex proc
xor di,di ;di-смещение для записи чисел в переменные и счетчик итераций
mov si,offset buff ;si-смещение буфера
@lp1: xor ax,ax ;обнулим ax
lodsb ;берем cимвол(байт) по адресу ds:si
sub ax,'0' ;отнимем значение кода "0" и получаем цифровое значение
mov [var_a+di],ax ;заносим в перменную -смещение di указывает на следующую переменную
add di,2 ;увеличить значение di на 2
cmp di,10 ;если значение не равно 10(10/2=5)то
jne @lp1 ;продолжить цикл
ret
StrToHex endp
;=========================================================
;Сalculation - процедура расчета по заданной формуле
;=========================================================
Calculation proc
xor dx,dx
mov ax,var_c ;ax=c
mov bx,var_x ;bx=x
div bx ;ax=c/x
mov var_c,ax ;c=c/x
xor dx,dx
mov ax,var_d ;ax=d
div bx ;ax=d/x
mov var_d,ax ;d=d/x
xor dx,dx
mov ax,var_x ;ax=x
mul bx ;ax=x*x=x^2
mul bx ;ax=x^2*x=x^3
mov temp,ax ;temp=x^3
mov bx,var_b ;bx=b
mul bx ;ax=x^3 * b
mov var_b,ax ;b=b*x^3
xor dx,dx
mov ax,temp ;ax=temp=x^3
mov bx,var_x ;bx=x
mul bx ;ax=x*x^3=x^4
mov bx,var_a ;bx=a
mul bx ;ax=x^4*a
mov var_a,ax ;a=a*x^4
mov ax,var_a ;ax=(a*x^4)
add ax,var_b ;ax=(a*x^4)+(b*x^3)
add ax,var_c ;ax=(ax*x^4)+(b*x^3)+(c/x)
add ax,var_d ;ax=(ax*x^4)+(b*x^3)+(c/x)+(d/x)
mov number,ax ;number=ax=(ax*x^4)+(b*x^3)+(c/x)+(d/x)
ret
Calculation endp
;=========================================================
;HexToStr - процедура перевода числа в строку
;=========================================================
HexToStr proc
xor cx, cx ;cx-счетчик разрядов = 0
mov bx, 10 ;основание 10 для десятеричной системы счисления
mov ax,number ;ax=число для преобразования
@@:
xor dx,dx ;dx=0
div bx ;Делим число(ax) на основание 10. В остатке (dx)получается последняя цифра.
push dx ;Сразу выводить её нельзя, поэтому сохраним остаток в стэке.
inc cx ;увеличим счетчик разрядов
test ax,ax ;проверяем равнение результат деления на 0
jnz @b ;если не равно 0,продолжаем цикл
mov ah, 02h ;вывод чисел в цикле
@@:
pop dx ;достаем цифру из стека
add dl, '0' ;добавляем код сивола '0'=30h
int 21h ;и выводим на экран
loop @b ;Повторим ровно столько раз, сколько цифр насчитали(в cx).
ret
HexToStr endp
;=========================================================
;программа ввода чисел,рачета и вывода результата
;=========================================================
start:
mov ax,@data ; взять адрес сегмента данных
mov ds,ax ; занести в сегментный регистр данных
mov dx,offset msg ; взять адрес строки msg
mov ah,9 ; функция 09h в AH запись строки в устройство стандартного вывода
int 21h ; вызов дос прерывания
call Enter_digit ; вызов подпрограммы ввода числовых значений
call StrToHex ; вызов функции перевода введеных значений в числа
mov dx,offset msg2 ; взять адрес msg2
mov ah,9 ; функция 09h в AH запись строки в устройство стандартного вывода
int 21h ; вызов дос прерывания
call Calculation ; вызов функции расчета
call HexToStr ; перевод результата в строку для вывода
mov ax,0C07h ; ожидание шажатия клавиши
int 21h
exit:
mov ax, 4C00h ; функция корректного выхода из программы
int 21h ;
end start