Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler] помогите с блок схемой 
:(
    Опции темы
ykpon3
Дата 21.12.2009, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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



PM MAIL   Вверх
dumb
Дата 22.12.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 6
Всего: 158



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0463 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.