![](/user_photo/2706_HbeT2.jpg)
Лабораторная работа 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