Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №41

.doc
Скачиваний:
11
Добавлен:
02.05.2014
Размер:
76.29 Кб
Скачать

Министерство Образования Российской Федерации

Уфимский Государственный Авиационный Технический Университет

Кафедра ТК

Отчет по лабораторным работам

по предмету «Организация ЭВМ»

На тему «Программирование операций ввода-вывода»

Выполнила: студентка

Проверил: Даринцев О.В.

Уфа, 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

7