Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по Организации ЭВМ и систем.doc
Скачиваний:
12
Добавлен:
06.05.2019
Размер:
290.82 Кб
Скачать

Лабораторная работа 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