Лабораторные работы №1-4 / lab4
.docМинистерство Образования Российской Федерации
Уфимский Государственный Авиационный Технический Университет
Кафедра ТК
Отчет по лабораторным работам
по предмету «Организация ЭВМ»
На тему «Программирование операций ввода-вывода»
Выполнила: студент
Проверил: Даринцев О.В.
Уфа, 2005
Лабораторная работа №4
Программирование операций ввода-вывода
а) Найти первый (последний) максимальный (минимальный) элемент вектора и указать его местоположение. Элементы вектора однобайтовые;
.486
dseg segment para public 'data'
source db 8h,3h,48h,12h,5h,6h,10h,56h,7h,3h,'$'
len db 0h
index dw 0
hexdigits db '0123456789ABCDEF'
MinMessage db 'Min is ','$'
MaxMessage db 'Max is ','$'
IndexMessage db ' index is ','$'
Ent db 13,10,'$'
temp_min db 0
temp_max db 0
temp_all db 0
min_index 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 di,0
LenCalculation:
mov dh,source[di]
cmp dh,'$'
mov ax,0
setnz ah
pushf
add len,ah
;Заодно и массив распечатаем
lea dx,source[di]
call OutputByte
mov dl,104
mov ah,2h
int 21h
mov dl,20h
mov ah,2h
int 21h
add di,1
popf
jnz LenCalculation
xor ax,ax
mov al,source
mov temp_max,al
mov temp_min,al
mov temp_all,al
mov di,1
mov ch,0
mov cl,len
MainTask:
;максимум
jmp MaxSetVarsEnd
MaxSetVars:
mov max_index, di
mov al, source[di]
mov temp_max, al
jmp MaxSetVarsRet
MaxSetVarsEnd:
mov al,source[di]
cmp al,temp_max
jnbe MaxSetVars
MaxSetVarsRet:
;минимум
jmp MinSetVarsEnd
MinSetVars:
mov min_index, di
mov al, source[di]
mov temp_min, al
jmp MinSetVarsRet
MinSetVarsEnd:
mov al,source[di]
cmp al,temp_min
jb MinSetVars
MinSetVarsRet:
add di,1
loop MainTask
;Вывод
lea dx,ent
mov ah,9h
int 21h
lea dx,ent
mov ah,9h
int 21h
lea dx,MinMessage
mov ah,9h
int 21h
lea dx,temp_min
call OutputByte
mov dl,104
mov ah,2h
int 21h
lea dx,IndexMessage
mov ah,9h
int 21h
lea dx,min_index
call OutputWord
mov dl,104
mov ah,2h
int 21h
lea dx,ent
mov ah,9h
int 21h
lea dx,MaxMessage
mov ah,9h
int 21h
lea dx,temp_max
call OutputByte
mov dl,104
mov ah,2h
int 21h
lea dx,IndexMessage
mov ah,9h
int 21h
lea dx,max_index
call OutputWord
mov dl,104
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,5h,6h,10h,56h,7h,3h,'$'
len db 0h
index dw 0
hexdigits db '0123456789ABCDEF'
MinMessage db 'Min is ','$'
MaxMessage db 'Max is ','$'
IndexMessage db ' index is ','$'
Ent db 13,10,'$'
temp_min dw 0
temp_max dw 0
temp_all dw 0
min_index 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 di,0
LenCalculation:
mov dx,source[di]
cmp dx,'$'
mov ax,0
setnz ah
pushf
add len,ah
;Заодно и массив распечатаем
lea dx,source[di]
call OutputWord
mov dl,104
mov ah,2h
int 21h
mov dl,20h
mov ah,2h
int 21h
add di,2
popf
jnz LenCalculation
xor ax,ax
mov ax,source
mov temp_max,ax
mov temp_min,ax
mov temp_all,ax
mov di,0
mov ch,0
mov cl,len
MainTask:
;максимум
jmp MaxSetVarsEnd
MaxSetVars:
mov max_index, di
mov ax, source[di]
mov temp_max, ax
jmp MaxSetVarsRet
MaxSetVarsEnd:
mov ax,source[di]
cmp ax,temp_max
jnbe MaxSetVars
MaxSetVarsRet:
;минимум
jmp MinSetVarsEnd
MinSetVars:
mov min_index, di
mov ax, source[di]
mov temp_min, ax
jmp MinSetVarsRet
MinSetVarsEnd:
mov ax,source[di]
cmp ax,temp_min
jb MinSetVars
MinSetVarsRet:
add di,2
loop MainTask
mov ax,min_index
mov dx,2h
div dl
mov ah,0
mov min_index,ax
mov ax,max_index
div dl
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,MinMessage
mov ah,9h
int 21h
lea dx,temp_min
call OutputWord
mov dl,104
mov ah,2h
int 21h
lea dx,IndexMessage
mov ah,9h
int 21h
lea dx,min_index
call OutputWord
mov dl,104
mov ah,2h
int 21h
lea dx,ent
mov ah,9h
int 21h
lea dx,MaxMessage
mov ah,9h
int 21h
lea dx,temp_max
call OutputWord
mov dl,104
mov ah,2h
int 21h
lea dx,IndexMessage
mov ah,9h
int 21h
lea dx,max_index
call OutputWord
mov dl,104
mov ah,2h
int 21h
mov ah,4ch
int 21h
main endp
cseg ends
end main