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

Лабораторная работа 6

Sum(A * Bi) * X + Sum(Ci) * Y

.MODEL small

.stack 100h

.data

msg db "ESC-exit",10,10,"Sum(A+Bi)*X+Sum(Ci)*Y",10,10,"Massive A,B,C ",10,"$"

msg2 db "Enter digit X,Y",10,"$"

msg3 db "Calculation...",10,"$"

massA db 10 dup (0) ;резервируем место для массивов по 10 байт и переменным x и y

massB db 10 dup (0)

massC db 10 dup (0)

X db 0

Y db 0

i db 1 ;i-счетчик итераций

temp dw 0 ;переменная временных результатов

number dw ? ;результат вычисления

.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 [X+si],al ; заносим код символа в буфер данных со смещением si

inc si ; увеличим значение регистра si на 1 для следующего символа

mov al,' ' ; заносим в al значение пробела

mov ah,0eh ; Выводим пробел

int 10h ; на экран

@@:

cmp si,2 ;если счетчик равен 2

je @f ;выйти из цикла ввода

jmp @enter ;иначе продолжить цикл

@@:

mov al,10 ;перевод курсора на следующую строку

mov ah,0eh ;

int 10h ;

ret

Enter_digit endp

Calculation proc

;A=(A+Bi)

xor si,si ;обнуление регистров si ,di

xor di,di

c2:

mov al,[massB+si] ;al=B[si]

add [massA+di],al ;A[di]=A[di]+al

inc i ;увеличить значение i

inc si ;инкремент si,di

inc di

cmp i,5 ;если i не равно 5

jbe c2 ;продолжить сложение

mov i,1 ;i=1

xor si,si ;si=0

cmp di,10 ;если di не равно 10

jne c2 ;продолжить сложение

;sum(A+Bi)

xor si,si

mov cx,10 ;счетчик на 10

xor ax,ax

c3:

mov al,[massA+si] ;al=элемент массива A[si]

add temp,ax ;во временной переменной Sum(A+Bi)

inc si

loop c3 ;выполнить 10 раз

sub X,'0' ;получит числовое значение X

mov ax,temp ;ax=Sum(A+Bi)

mul X ;ax=Sum(A+Bi)*x

;перекинем в bx

mov bx,ax ;bx=Sum(A+Bi)*x

;sum (Ci)

mov temp,0

xor ax,ax

xor si,si

c4:

mov al,[massC+si] ;al=C[si]

add temp,ax ;temp=temp+al

inc si

inc i

cmp i,5 ;если i нерано 5

jbe c4 ;продолжить сложение

sub Y,'0' ;y перевести в число

mov ax,temp ;ax=sum(Ci)

mul Y ;ax=sum(Ci)*y

add ax,bx ;сложить Sum(A+Bi)*x + sum(Ci)*y

mov number,ax ;результат

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

;=========================================================

;Mass - процедура заполнение массивов.размер массива = 10 элементов

;=========================================================

Mass proc

xor si,si ;смещение в массиве =0

xor ax,ax ;значение для записи в массив

mov cx,30 ;счетчик циклов =30раз

cicle:

mov [massA+si],al ;занести в массив al

inc ax ;увеличить значение на 1

cmp ax,10 ;сравнить равно ли 10

jne @f ;если нет продолжим заполнение

xor ax,ax ;иначе обнулить

@@:

inc si ;увеличить смещение для записи в массив

loop cicle ;цикл 30 раз

Ret

Mass EndP

start:

mov ax,@data ; взять адрес сегмента данных

mov ds,ax ; занести в сегментный регистр данных

mov dx,offset msg ; взять адрес строки msg

mov ah,9 ; функция 09h в AH запись строки в устройство стандартного вывода

int 21h ; вызов дос прерывания

call Mass ;вызов процедуры заполнения массивов

;==========вывод массивов на экран циклом=========

mov si,offset massA ;занести в si смещение массива

mov bx,3 ;количество массивов

cicle:

mov cx,10 ;счетчик циклов=количество элементов массива

c1:

xor ax,ax ;ax=0

lodsb ;берем число из массива-занесли в ax

add ax,'0' ;получаем цифровое значение

mov ah, 02h ;выводим символ

mov dl, al

int 21h

loop c1 ;выполнить 10 раз

mov ah, 02h ;переместить курсор на другую строку

mov dl, 10

int 21h

dec bx ;отнять bx

jnz cicle ;если не равен0,то продоллжить цикл

mov dx,offset msg2 ; взять адрес msg2

mov ah,9 ; вывести строку

int 21h

call Enter_digit ;процедура ввода значений x и y

mov dx,offset msg3 ; взять адрес msg3

mov ah,9 ; вывести строку

int 21h

call Calculation ;процедура просчета по заданной формуле

call HexToStr ;процедура перевода числа в строку

mov ax,0C07h ; ожидание шажатия клавиши

int 21h

exit:

mov ax, 4C00h ; функция корректного выхода из программы

int 21h

end start