Новичок
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 21.12.2009
Репутация: нет Всего: нет
|
помогите составить блок схему по программме | Код | ;2) Представить алгоритм и программу. В заданной в программе матрице найти сумму ; максимального и минимального элементов указанной строки и столбца. .model small .286; для команды shl di,2 нужен проц мин 80286, можно заменить на 2 ком - shl di,1
.data About db 10,13,"Program 2",10,13,'$';заголовки Input_Stl db "Vvedite nomer stolbca ",10,13,'$';заголовк для ввода номера столбца Input_Str db "Vvedite nomer stroki ",10,13,'$';заголовк для ввода номера строки Summ_elem db 10,13,"Summa",10,13,'$';заголовок для вывода суммы Error_Mes db 10,13,"Error input",10,13,'$'; сообщение при ошибке ввода Endl db 10,13,'$' outbuf db 6 dup(0),'$' ; буфер для вывода чисел массива на экран inbuf db 4,0,4 dup(0) ; буфер для ввода чисел массива N=10;размер матрицы индекс столбца 0..9 минимальный размер 2х2 иначе ошибка Matr db 1,1,2,4,5,6,7,8,9,0 db 1,2,3,4,5,5,7,8,9,0 db 1,2,3,4,5,5,7,8,9,0 db 1,2,3,4,4,5,9,8,9,1 db 1,2,3,5,5,5,7,8,9,0 db 1,2,4,4,5,6,7,8,9,0 db 1,2,3,4,8,5,7,9,9,0 db 1,2,3,4,5,5,7,8,9,0 db 1,2,1,4,5,5,7,8,9,0 db 1,2,1,4,5,5,7,8,9,0
min1 db 0 min2 db 0 max1 db 0 max2 db 0
.stack 100h
.code ;Вывод числа, размер числа слово, параметр в ax WriteWord proc push ax dx si bx cx ; поместить используемые регистры в стек mov si, offset outbuf[5]; адрес буфера для вывода mov bx, 10 ; коэффициент для деления mov cx,5 ; счетчик символов make_str1: xor dx,dx div bx or dx,0030h ; преобразовать цифру в символ dec si ; перейти к следующему символу dec cx ; увеличить счетчик символов mov [si],dl ; сохранить в строке test ax, ax jnz make_str1
; добавить пробелов add_space: dec si ; перейти к следующему символу mov byte ptr [si],' ' ; сохранить в строке loop add_space
; вывести число mov ax,0900h ; читать из файла mov dx,si ; адрес буфера для приема данных int 21h pop cx bx si dx ax ; извлечь используемые регистры из стека ret ; возврат из процедуры WriteWord endp
;Ввод числа, размер числа слово, результат в bx ReadWord proc push ax cx dx si di bp ; поместить используемые регистры в стек mov si, offset inbuf ; адрес буфера ввода mov ax,0a00h ; ввести строку mov dx, si ; буфер ввода int 21h
xor cx,cx inc si ; перейти к следующему символу в буфере mov cl,byte ptr [si] ; получить количество введенных символов jcxz convert_word_err ; если ничего не введено то ошибка add si, cx ; встаем на символ(цифру) младшего разряда числа mov ax, 1 ; множитеь разряда mov bp, 10 ; вес 1 разряда xor bx, bx ; результат mov di, ax
make_word: mov dl,byte ptr [si] ; проверить символ на допустимый диапазон [0..9] cmp dl,'0' jb convert_word_err ; < cmp dl,'9' ja convert_word_err ; > and dx,000fh ; преобразовать символ в цифру mul dx ; dx:ax=ax*dx цифру на вес разряда
test dx,dx ; проверить число превысило слово? jnz convert_word_err ; если введенное число превысило слово, то ошибка
add bx, ax ; суммировать к результату jc convert_word_err ; если введенное число превысило слово, то ошибка
mov ax, di ; вычислить вес следующего разряда mul bp ; dx:ax=ax*10 mov di,ax ; сохранить вес разряда dec si ; перейти к следующему символу (цифре) loop make_word clc ; сбросить флаг ошибки все успешно pop bp di si dx cx ax ; извлечь используемые регистры из стека ret convert_word_err: stc ; установить флаг ошибки pop bp di si dx cx ax ; извлечь используемые регистры из стека ret ReadWord endp
.startup mov ax,0900h; вывести строку на экран mov dx, offset About; адрес строки int 21h
mov ax,0900h;вывод строки на экран mov dx,offset Endl; переход на новую строку int 21h
;вывод массива на экран mov cx,N; кол-во строк mov si,0; индекс в массиве cstr: push cx mov cx,N;кол-во столбцов cstl: mov al,Matr[si]; взять элемент массива xor ah,ah call WriteWord inc si; перейти к следующему элементу loop cstl mov ax,0900h;вывод строки на экран mov dx,offset Endl; переход на новую строку int 21h pop cx loop cstr
mov ax,0900h;вывод строки на экран mov dx,offset Endl; переход на новую строку int 21h
; ввод номера столбца rep_str: mov ax,0900h; вывести строку mov dx,offset Input_Stl; заголовок для ввода столбца int 21h
call ReadWord ; ввести число jc rep_str cmp bx,N ; сравнить введенный индекс столбца с размерностью массива jg rep_str cmp bx,0 ; сравнить введенный индекс столбца с 0 je rep_str dec bx mov si,bx; индекс первого элемента столбца
mov al,Matr[si] mov min1,al mov max1,al
mov ax,0900h;вывод строки на экран mov dx,offset Endl; переход на новую строку int 21h
; ввод номера строки rep_stl: mov ax,0900h; вывести строку mov dx,offset Input_Str; заголовок для ввода строки int 21h
call ReadWord ; ввести число jc rep_stl cmp bx,N ; сравнить введенный индекс строки с размерностью массива jg rep_stl cmp bx,0 ; сравнить введенный индекс строки с 0 je rep_stl dec bx int 3 mov ax,N ; расчет начального индекса строки mul bx mov di,ax; индекс первого элемента строки
mov al,Matr[di] mov min2,al mov max2,al lea si,si[N]; индекс второго элемента столбца add di,1 ; индекс второго элемента строки
mov cx, N-1;кол-во элементов в столбце для сравнения
find_: mov bl,Matr[di];получить элементы матрицы mov bh,Matr[si] cmp min1,bh ; сравнить с минимумом jae no_min1 ; если больше или равно mov min1,bh ; заменить минимум no_min1: cmp max1,bh ; сравнить с максимумом jbe no_max1 ; если больше или равно mov max1,bh ; заменить максимум no_max1:
cmp min2,bl ; сравнить с минимумом jae no_min2 ; если больше или равно mov min2,bl ; заменить минимум no_min2: cmp max2,bl ; сравнить с максимумом jbe no_max2 ; если больше или равно mov max2,bl ; заменить максимум no_max2: add si,N ; перейти к следующиму элементу столбца add di,1 ; перейти к следующему элементу строки loop find_ xor ax,ax add al,max1 ; расчитать сумму adc ah,0 add al,max2 ; расчитать сумму adc ah,0 add al,min1 ; расчитать сумму adc ah,0 add al,min2 ; расчитать сумму adc ah,0
Mov bx,ax ; сохранить в bx
mov ax,0900h; вывести строку на экран mov dx, offset Summ_elem; адрес строки int 21h mov ax,bx ; восстановить сумму call WriteWord ; вывести mov ax,0c07h ; ожидаем нажатие клавиши int 21h ; вызов DOS mov ax, 4c00h ; закончить программу int 21h ; вызов DOS
exit: mov ax,4c00h; завершить программу int 21h end
|
|