Лабораторная работа №41
.docМинистерство Образования Российской Федерации
Уфимский Государственный Авиационный Технический Университет
Кафедра ТК
Отчет по лабораторным работам
по предмету «Организация ЭВМ»
На тему «Программирование операций ввода-вывода»
Выполнила: студентка
Проверил: Даринцев О.В.
Уфа, 2005
Лабораторная работа №4
Программирование операций ввода-вывода
5. Найти сумму всех отрицательных элементов двухмерного массива, а среди положительных найти максимальный и указать его местоположение:
а) элементы массива однобайтовые;
б) элементы массива двухбайтовые.
а)
.486
dseg segment para public 'data'
source db -8h, 3h, 48h,12h
db 5h, 6h,-10h,56h
db 7h,-3h, -2h, 9h
db 0h,-8h, 12h,-5h,'$'
len db 0h
hexdigits db '0123456789ABCDEF'
SumMessage db 'Summ of negative is ','$'
MaxMessage db 'Max of positive is ','$'
IndexMessage db ' index is ','$'
Ent db 13,10,'$'
negative_sum dw 0
positive_max db 0
temp db 0
max_index dw 0
dseg ends
stack segment para stack 'stack'
dw 10 dup (0FFFFh)
stack ends
cseg segment use16
assume cs:cseg,ds:dseg,ss:stack
main proc
jmp begin
OutputByte proc;Выводит на экран байтовую беззнаковую величину.
;Вход - В ds:dx адрес числовой переменной
push ax
push bx
push cx
push dx
push si
push di
pushf
mov di,dx
mov ax,[di]
mov ah,0
mov dl,10h
div dl ;al - частное ah - остаток
push ax
mov ah,0
mov si,ax
mov dl,byte ptr hexdigits[si]
mov ah,2h
int 21h
pop ax
xchg ah,al
mov ah,0
mov si,ax
mov dl,byte ptr hexdigits[si]
mov ah,2h
int 21h
popf
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
endp OutputByte
OutputWord proc;Выводит на экран беззнаковое слово.
;Вход - В ds:dx адрес слова
push dx
add dx,1
call OutputByte
sub dx,1
call OutputByte
pop dx
ret
endp OutputWord
begin:
mov ax,dseg
mov ds,ax
mov negative_sum, 0000h
mov di,0
LenCalculation:
mov dh,source[di]
cmp dh,'$'
mov ax,0
setnz ah
pushf
add len,ah
;Заодно и массив распечатаем
mov bl,source[di]
mov temp, bl
cmp bl,0
jge PositiveNumber
;А тут можно еще сумму отрицательных пощитать
neg bl
mov bh,0
add negative_sum,bx
mov temp,bl
mov dl,45; '-'
mov ah,2h
int 21h
PositiveNumber:
lea dx,temp
call OutputByte
mov dl,104; буква 'h'
mov ah,2h
int 21h
mov dl,20h; пробел
mov ah,2h
int 21h
add di,1
popf
jnz LenCalculation
xor ax,ax
mov positive_max, al
mov max_index, ax
mov cl,len
dec cl
mov ch,0h
xor di,di
MainTask:
mov al,source[di]
cmp al,0h
jge GetMaxPositive
jmp EndCmpVars
GetMaxPositive:
cmp positive_max,al
jna SetNewMaxValue
jmp EndCmpVars
SetNewMaxValue:
mov max_index, di
mov positive_max, al
EndCmpVars:
inc di
loop MainTask
;Вывод
lea dx,ent
mov ah,9h
int 21h
lea dx,ent
mov ah,9h
int 21h
lea dx,SumMessage
mov ah,9h
int 21h
mov dl,45; '-'
mov ah,2h
int 21h
lea dx,negative_sum
call OutputWord
mov dl,104; буква 'h'
mov ah,2h
int 21h
mov dl,20h; пробел
mov ah,2h
int 21h
lea dx,ent
mov ah,9h
int 21h
lea dx,MaxMessage
mov ah,9h
int 21h
lea dx,positive_max
call OutputByte
mov dl,104; буква 'h'
mov ah,2h
int 21h
mov dl,20h; пробел
mov ah,2h
int 21h
lea dx,IndexMessage
mov ah,9h
int 21h
lea dx,max_index
call OutputByte
mov dl,104; буква 'h'
mov ah,2h
int 21h
mov dl,20h; пробел
mov ah,2h
int 21h
mov ah,4ch
int 21h
main endp
cseg ends
end main
б)
.486
dseg segment para public 'data'
source dw -8h, 3h, 48h,12h
dw 5h, 6h,-10h,56h
dw 7h,-3h, -2h, 9h
dw 0h,-8h, 12h,-5h,'$'
len db 0h
hexdigits db '0123456789ABCDEF'
SumMessage db 'Summ of negative is ','$'
MaxMessage db 'Max of positive is ','$'
IndexMessage db ' index is ','$'
Ent db 13,10,'$'
negative_sum dw 0
positive_max dw 0
temp dw 0
max_index dw 0
dseg ends
stack segment para stack 'stack'
dw 10 dup (0FFFFh)
stack ends
cseg segment use16
assume cs:cseg,ds:dseg,ss:stack
main proc
jmp begin
OutputByte proc;Выводит на экран байтовую беззнаковую величину.
;Вход - В ds:dx адрес числовой переменной
push ax
push bx
push cx
push dx
push si
push di
pushf
mov di,dx
mov ax,[di]
mov ah,0
mov dl,10h
div dl ;al - частное ah - остаток
push ax
mov ah,0
mov si,ax
mov dl,byte ptr hexdigits[si]
mov ah,2h
int 21h
pop ax
xchg ah,al
mov ah,0
mov si,ax
mov dl,byte ptr hexdigits[si]
mov ah,2h
int 21h
popf
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
endp OutputByte
OutputWord proc;Выводит на экран беззнаковое слово.
;Вход - В ds:dx адрес слова
push dx
add dx,1
call OutputByte
sub dx,1
call OutputByte
pop dx
ret
endp OutputWord
begin:
mov ax,dseg
mov ds,ax
mov negative_sum, 0000h
mov di,0
LenCalculation:
mov dx,source[di]
cmp dx,'$'
mov ax,0
setnz ah
pushf
add len,ah
;Заодно и массив распечатаем
mov bx,source[di]
mov temp, bx
cmp bx,0
jge PositiveNumber
;А тут можно еще сумму отрицательных пощитать
neg bx
add negative_sum,bx
mov temp,bx
mov dl,45; '-'
mov ah,2h
int 21h
PositiveNumber:
lea dx,temp
call OutputWord
mov dl,104; буква 'h'
mov ah,2h
int 21h
mov dl,20h; пробел
mov ah,2h
int 21h
add di,2
popf
jnz LenCalculation
xor ax,ax
mov positive_max, ax
mov max_index, ax
mov cl,len
mov ch,0h
xor di,di
MainTask:
mov ax,source[di]
cmp ax,0h
jge GetMaxPositive
jmp EndCmpVars
GetMaxPositive:
cmp positive_max,ax
jna SetNewMaxValue
jmp EndCmpVars
SetNewMaxValue:
mov max_index, di
mov positive_max, ax
EndCmpVars:
inc di
inc di
loop MainTask
xor ax,ax
mov ax,max_index
mov ch,2
div ch
mov ah,0
mov max_index,ax
;Вывод
lea dx,ent
mov ah,9h
int 21h
lea dx,ent
mov ah,9h
int 21h
lea dx,SumMessage
mov ah,9h
int 21h
mov dl,45; '-'
mov ah,2h
int 21h
lea dx,negative_sum
call OutputWord
mov dl,104; буква 'h'
mov ah,2h
int 21h
mov dl,20h; пробел
mov ah,2h
int 21h
lea dx,ent
mov ah,9h
int 21h
lea dx,MaxMessage
mov ah,9h
int 21h
lea dx,positive_max
call OutputWord
mov dl,104; буква 'h'
mov ah,2h
int 21h
mov dl,20h; пробел
mov ah,2h
int 21h
lea dx,IndexMessage
mov ah,9h
int 21h
lea dx,max_index
call OutputWord
mov dl,104; буква 'h'
mov ah,2h
int 21h
mov dl,20h; пробел
mov ah,2h
int 21h
mov ah,4ch
int 21h
main endp
cseg ends
end main