WMmail.ru - сервис почтовых рассылок

вторник, 30 ноября 2010 г.

RFpro.ru: Ассемблер? Это просто! Учимся программировать

Если выпуск не отображается корректно, то вы можете прочесть его на сайте

Реклама Отказаться от рекламы
Надоела сутулая спина и обвислый живот? Надоела сутулая спина и обвислый живот?
Тренажер Ab Rocket - великолепный пресс всего за несколько недель!

  Как увеличить продажи? Как увеличить продажи?
Зарегистрируйся в Бегуне и получай клиентов из Интернета уже сейчас!

  Вспомни детство! Вспомни детство!
Аппарат для приготовления сахарной ваты - отличное угощение!

 
 
Subscribe.Ru

RFpro.ru: Ассемблер? Это просто! Учимся программировать

    Мои подписки     Мои группы     Мои новости     Друзья     Избранное

Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2545
• повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2047
• повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1327
• повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1389
Дата выхода:01.12.2010, 08:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:221 / 67
Вопросов / ответов:2 / 2

Вопрос № 180942: Здравствуйте, уважаемые эксперты! Прошу Вас помочь с решением следуюшей задачи: - написать программу в среде MPLab для микроконтроллера PIC16F84. Требуется последовательно выводить числа от 0 до максимально возможного числа с использованием таймер...


Вопрос № 180947: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Здравствуйте еще раз, помоги те пожалуйста с решением задачи, связанную с сопроцессорами "Рассчитать и вывести значение выражения, при заданных пользователем значени...

Вопрос № 180942:

Здравствуйте, уважаемые эксперты! Прошу Вас помочь с решением следуюшей задачи:
- написать программу в среде MPLab для микроконтроллера PIC16F84. Требуется последовательно выводить числа от 0 до максимально возможного числа с использованием таймера прерываний на индикатор.
Прилагаю блок - схему, по которой пишется программа с точностью до обозначений (но в ней чего-то не хватает). Из этой блок - схемы удалять элементы нельзя и переобозначать переменные тоже. Однако, насколько я понимаю, необходимо добавить блок - схемы некоторых подпрограмм. Вот ссылка:

blok_shema.pdf (103.6 кб)

К ответу прошу также приложить и блок - схему с ДОПОЛНЕНИЯМИ!
Под индикатором, на который последовательно выводятся числа, понимается следующий приборчик:



Система команд микроконтроллера PIC16F84 такова :




Спасибо за Ваш труд!


Отправлен: 26.11.2010, 00:09
Вопрос задал: Dmitry (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Dmitry!
Вот, накидал программу.
Хотелось бы узнать, рабочая ли она...
Потом добавлю, чего не хватает.
Код:

LIST p=16F84
#include <p16f84.inc>

; Биты регистра PORTB
DAT EQU 04h ; бит данных
SYN EQU 05h ; бит синхронизации

CBLOCK 0CH ; блок рабочих регистров
X
WAIT
W1
W2
W3
CNT1
CNT2
W_TEMP
STATUS_TEMP
ENDC

org 00h ; начало исполняемого кода
GOTO START

org 04h ; программа обработки прерываний
MOVWF W_TEMP
MOVF STATUS,W
MOVWF STATUS_T EMP

CLRF TMR0 ;очистка таймера
BCF INTCON,T0IF ;сброс флага прерывания

COMF WAIT,F

MOVF STATUS_TEMP,W
SWAPF W_TEMP,F
SWAPF W_TEMP,W
retfie

; Основная программа
START
; Инициализация PORTB
MOVLW B'11001111' ; настройка порта В

BSF STATUS,RP0 ; выбор банка 1
MOVWF TRISB ; установка RB4, RB5 на вывод

MOVLW B'01110010'
MOVWF OPTION_REG

BCF STATUS,RP0 ; выбор банка 0
;
BSF PORTB,DAT ; установка битов DAT, SYN
BSF PORTB,SYN ; в регистр PORTB

CLRF X ;X = 0
CLRF WAIT ;WAIT = 0

CLRF TMR0
MOVLW B'10100000'
MOVWF INTCON

MAIN ;основной цикл
BTFSS WAIT,0
GOTO MAIN

CALL VYVOD ;рисуем X

COMF WAIT,F

INCF X,F
GOTO MAIN

VYVOD
MOVF X,W
MOVWF W1

MOVLW 4
MOVWF CNT1
DIGITS
MOVLW 10
CALL DIVIDE
CALL CODING
CALL OUT

DECFSZ CNT1,F ; по всем 4 цифрам
GOTO DIGITS

RETURN

;=============================================
; Преобразование BCD -> 7 сегментный код
; получаем в W сегменты индикатора
; 0 - горит
;=============================================
CODING
addwf PCL,F ; W + PC -> PC
retlw b'11000000' ; ..FEDCBA = '0'
retlw b'11111001' ; .....CB. = '1'
retlw b'10100100' ; .G.ED.BA = '2'
retlw b'10110000' ; .G..DCBA = '3'
retlw b'10011001' ; .GF..CB. = '4'
retlw b'10010010' ; .GF.DC.A = '5'
retlw b'10000010' ; .GFEDC.A = '6'
retlw b'11111000' ; .....CBA = '7'
retlw b'10000000' ; .GFEDCBA = '8'
retlw b'10010000' ; .GF.DCBA = '9'

; Подпрограмма вывода
OUT
MOVWF W2 ; сохраним в W2
MOVLW D'8' ; 8 бит
MOVWF CNT2 ; в счетчик CNT2
SEGMENTS
BCF P ORTB,DAT ; установка в 0 RB4 (чтобы горело)
BTFSC W2,0 ; если 0 бит в регистре W2 = 0, то пропускаем
BSF PORTB,DAT ; команду, если нет, то установка RB4 в 1 (чтобы потухло)

; синхронизация PORTB
BCF PORTB,SYN
BSF PORTB,SYN

RRF W2,F ; сдвиг вправо, через перенос
DECFSZ CNT2,F ; по всем 8 битам
GOTO SEGMENTS ; переход на метку SEGMENTS

RETURN ; возврат из подпрограммы

DIVIDE
MOVWF W2 ; сохраним в W2
MOVF W1,W
MOVWF W3 ; сохраним в W3
MOVF W2,W
CLRF W1
SUBLOOP
SUBWF W3,F
BTFSS STATUS,C
GOTO DIVRET
INCF W1,F
GOTO SUBLOOP
DIVRET
ADDWF W3,W

RETURN

END

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 26.11.2010, 17:54
Номер ответа: 264350
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264350 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 180947:

    Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
    Здравствуйте еще раз, помоги те пожалуйста с решением задачи, связанную с сопроцессорами
    "Рассчитать и вывести значение выражения, при заданных пользователем значениях x и a." и пример:

    Отправлен: 26.11.2010, 03:13
    Вопрос задал: Алексей Патрин (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, Алексей Патрин!
    Вот Вам программа...
    Считается все, как в формуле (без упрощений) ...
    Код:

    .model tiny, C
    .data
    sX db 'Enter x: $' ;приглашения для ввода
    sA db 0ah,'Enter a: $'
    sY db 0ah,'Y = $' ;результат
    sAny db 0dh,0ah,'Press any key$'

    x dq 0 ;переменные
    a dq 0

    num db 32 ;буфер для ввода строки
    len db 0
    String db 32 dup (0)

    .code
    .386
    .startup
    lea dx, sX
    mov ah, 9
    int 21h ;ждем Х

    lea dx, num
    mov ah, 0ah
    int 21h

    call str2float ;преобразуем строку в double
    fstp x
    lea dx, sA
    mov ah, 9
    int 21h ;ждем А

    lea dx, num
    mov ah, 0ah
    int 21h

    call str2float ;преобразуем строку в double
    fstp a

    call calcY, offset a, offset x ;считаем по формуле

    call float2str ;преобразуем в строку
    lea dx, sY
    mov ah, 9
    int 21h
    lea dx, String ;выведем
    mov ah, 9
    int 21h

    lea dx, sAny
    mov ah, 9
    int 21h ;ждем "any key"

    mov ah, 8
    int 21h

    mov ax, 4c00h
    int 21h

    ;експонента st=e^st
    exp proc
    fldl2e ;log(осн 2)e->st
    fmulp ;st(1)*log(осн 2)e->st
    fld st ;x*log[2]e->st(1)
    frndint ;округляем st до целого
    fsub st(1),st ;st(1)-=st
    fxch ;st(1)<->st
    f2xm1 ;st=(2 в степени st) - 1
    fld1 ;1->st
    fadd ;st+=1
    fscale ;exp = st * (2 в степени st(1))
    fstp st(1) ;чтобы убрать значение из st(1)
    ret
    exp endp

    ;считаем по формуле
    y=(3*4 +5*6-ae^x)/(7/2+4/3+12/3)*(16/2)*3*6*cos(a/x)
    calcY proc pa:word, px:word
    local c2:word, c3:word, c4:word, c5:word, c6:word, c7:word, c12:word, c16:word
    uses di, si
    mov di, pa ;адрес А
    mov si, px ;адрес Х
    mov c2, 2 ;константы
    mov c3, 3
    mov c4, 4
    mov c5, 5
    mov c6, 6
    mov c7, 7
    mov c12, 12
    mov c16, 16

    fild c3 ;3
    fimul c4 ;3*4
    fild c5 ;5
    fimul c6 ;5*6
    faddp ;3*4+5*6
    fld qword ptr [si] ;x
    call exp ;e^x
    fmul qword ptr [di] ;a*e^x
    fsubp st(1), st ;3*4+5*6-a*e^x

    fild c7 ;7
    fidiv c2 ;7/2
    fild c4 ;4
    fidiv c3 ;4/3
    faddp ;7/2+4/3
    fild c12 ;12
    fidiv c3 ;12/3
    faddp ;7/2+4/3+12/3

    fdivp ;y=(3*4+5*6-a*e^x)/(7/2+4/3+12/3)

    fimul c16 ;y*16
    fidiv c2 ;y*16/2
    fimul c3 ;y*16/2*3
    fimul c6 ;y*16/2*3*6

    fld qword ptr [di] ;a
    fdiv qword ptr [si] ;a/x
    fcos ;cos(a/x)
    fmulp ;y*16/2*3*6*cos(a/x)
    ret
    c alcY endp

    ;Преобразование строки в вещественное число в st сопроцессора
    str2float proc ;преобразование строки в вещественное число
    local ww:word ;для загрузки в сопроцессор
    local dcount:word ;число знаков после точки
    local wSign:word ;знак числа
    local c10:word ;10

    fldz ;подготовим st=0
    lea si, String ;числовая строка
    xor ax, ax ;0
    mov dcount, ax ;число знаков после точки = 0
    mov wSign, ax ;положительное
    mov c10, 10 ;10
    s2fStart: ;цикл обхода незначащих стартовых пробелов
    lodsb
    cmp al, 0dh
    je s2fRet ;по концу строки - выход
    cmp al, ' '
    je s2fStart ;на повтор
    cmp al, 9
    je s2fStart
    cmp al, '-'
    jne s2fCompare ;все остальное - на анализ
    inc wSign ;по минусу - взводим признак минуса
    s2fNext:
    lodsb ;очередной символ
    s2fCompare:
    cmp al, '.' ;точка
    je s2fInc
    cmp al, '0'
    jb s2fSign ;все, что не цифры - конец числа
    cmp al, '9'
    ja s2fSign

    and ax, 0fh ;иначе готовим разряд
    mov ww, ax ; для загрузки в сопроцессор
    cmp dcount , 0 ;если целая часть, то
    je s2fMul10 ; на умножение на 10
    mov cx, dcount ;иначе делим dcount раз на 10
    fild ww ; очередной разряд
    s2fdiv:
    fidiv c10 ;делим dcount раз
    loop s2fdiv
    faddp ;складываем разряд за точкой с формируемым числом
    s2fInc:
    inc dcount ;для точки только увеличиваем dcount
    jmp s2fNext ;пока не дойдем до конца

    s2fMul10: ;целое число
    fimul c10 ;умножаем старое на 10
    fiadd ww ;и прибавляем очередной разряд
    jmp s2fNext
    s2fSign:
    cmp wSign, 0 ;если bSign == 1
    je s2fRet
    fchs ;то меняем знак
    s2fRet:
    ret
    str2float endp

    ;преобразование вещественного числа из st в строку по адресу String
    float2str proc
    local c10:word ;10
    local wSign:word ;знак
    local dig:word ;буфер для извлечения целого из сопроцессора
    local sTemp:byte:64 ;временный буфер для строки

    mov c10, 10 ;10
    mov wSign, 0 ;пока считаем, что положительное
    lea di, sTemp ;здесь буде м формировать строку
    ftst ;Проверяем число
    fstsw ax ;флаги в ax
    sahf ;флаги в регистре флагов
    jnz f2s_notZero ;не 0
    mov ax, '$0' ;если 0, то выводим 0
    stosw
    jmp f2s_Ret ;на выход

    f2s_notZero: ;не 0
    jnc f2s_1 ;если отрицательное,
    inc wSign ; то помечаем минус
    fchs ; и оставляем модуль числа.
    ; Пояснение далее пойдёт на примере. ; ST(0) ST(1) ST(2) ST(3) ...
    ; Отделим целую часть от дробной. ; 73.25 ...
    f2s_1: fld1 ; 1 73.25 ...
    fld st(1) ; 73.25 1 73.25 ...
    ; Остаток от деления на единицу даст дробную часть.
    fprem ; 0.25 1 73.25 ...
    ; Если вычесть её из исходного числа, получится целая часть.
    fsub st(2), st ; 0.25 1 73 ...
    fxch st(2) ; 73 1 0.25 ...
    ; Сначала поработаем с целой частью. Считать количество цифр будем в CX.
    xor cx, cx
    ; Поделим целую часть на десять,
    f2s_2: fidiv c10 ; 7.3 1 0.25 ...
    fxch st(1) ; 1 7.3 0.25 ...
    fld st(1) ; 7.3 1 7.3 0.25 ...
    ; отделим дробную часть - очередную справа цифру целой части исходного числа,-
    fprem ; 0.3 1 7.3 0.25 ...
    ; от чатсного оставим только целую часть
    fsub st(2), st ; 0.3 1 7 0.25 ...
    ; и сохраним цифру
    fimul c10 ; 3 1 7 0.25 ...
    fistp dig ; 1 7 0.25 ...
    inc cx
    ; в стеке.
    push dig
    fxch st(1) ; 7 1 0.25 ...
    ; Так будем повторять, пока от целой части не останется ноль.
    ftst
    fstsw ax
    sahf
    jnz f2s_2
    ; Теперь выведем её.
    f2s_3: pop ax
    ; Вытаскиваем очередную цифру, переводим её в символ и выводим.
    add al, 30h
    stosb
    ; И так, пока не выведем все цифры.
    loop f2s_3 ; 0 1 0.25 ...
    ; Итак, теперь возьмёмся за дробную часть, для начала проверив её существование.
    fstp st(0) ; 1 0.25 ...
    fxch st(1) ; 0.25 1 ...
    ftst
    fstsw ax
    sahf
    jz f2s_5
    ; Если она всё- таки ненулевая, выведем точку
    lea ax, sTemp
    mov cx, di
    sub cx, ax
    sub cx, 63
    neg cx
    mov al, '.'
    stosb
    ; Помножим дробную часть на десять
    f2s_4: fimul c10 ; 2.5 1 ...
    fxch st(1) ; 1 2.5 ...
    fld st(1) ; 2.5 1 2.5 ...
    ; отделим целую часть - очередную слева цифру дробной части исходного числа,-
    fprem ; 0.5 1 2.5 ...
    ; оставим от произведения лишь дробную часть
    fsub st(2), st ; 0.5 1 2 ...
    fxch st(2) ; 2 1 0.5 ...
    ; сохраним полученную цифру во временной ячейке
    fistp dig ; 1 0.5 ...
    ; и сразу выведем.
    mov ax, dig
    add al, 30h
    stosb
    ; Теперь, если остаток дробной части ненулевой
    fxch st(1) ; 0.5 1 ...
    ftst
    fstsw ax
    sahf
    ; и мы вывели менее cx цифр, продолжим
    loopnz f2s_4 ; 0 1 ...
    ; Итак, число выведено. Осталось убрать мусор из стека.
    f2s_5: fstp st(0) ; 1 ...
    fstp st(0) ; ... mov byte ptr [di], '$'

    ; и скопировать в буфер String
    lea si, sTemp
    lea di, String
    xor cx, cx ;длина
    c mp wSign, 0 ;проверим на знак
    je f2s_6
    mov al, '-' ;отрицательное
    stosb
    f2s_6:
    lodsb
    stosb ;копируем 1 байт
    inc cx ;считаем
    cmp cx, 14 ;копируем только 14 байт !!! (если получится число
    ; с большим чем 14 байт знаков, то последние усекутся)
    je f2s_7 ;насильно закрываем $!
    cmp al, '$'
    jne f2s_6 ;копирование завершаем по $
    dec cx ;отнимем 1 (посчитался $)
    f2s_7:
    mov byte ptr [di], '$' ;закроем $ (для случая обрезания)
    f2s_Ret:
    ret
    float2str endp

    end

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 28.11.2010, 01:28
    Номер ответа: 264366
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Оценка ответа: 5

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264366 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.24 от 30.11.2010
    Обсудить выпуск
     
     Как вам этот выпуск ?  Дайте свой отзыв  или  Оцените   5    4    3    2    1,   можно письмом:  5    4    3    2    1
     
    Реклама Отказаться от рекламы
    Здоровая пища: миф или реальность? Здоровая пища: миф или реальность?
    Аэрогриль Flavorwave Turbo Oven - новое слово в кухонном досуге!

      Все дело в размере! Все дело в размере!
    Easy Curves - первый тренажер для женской груди!

      Скачай журнал "Всемирный следопыт" Скачай журнал "Всемирный следопыт"
    8 городов на воде. 5 открытий Моне. Химера Ремарка.

     
     
      Группы
    «Живая фотография»
    Группа для всех, кто любит фотографировать. Приветствуются фото, не имеющие коррекции и доработки в разного рода графических редакторах - "фото как есть". Единственно, допускаются надписи и водяные знаки - для защиты авторских прав.
    «Европа - это просто!»
    Иммиграция и жизнь в ЕС. Иммиграционные консультации по Европе. Общение участников рассылки Европа - это просто! и рассылки Греческий язык, Греция, греки. Вопросы, пожелания, предложения и конечно точная информация по Европе только от жителей.
    «Работа для студентов»
    Предложение работы с неполным рабочим днем. Работа для студентов
     
    Подписан адрес: admin10383.deep@blogger.com
    Код этой рассылки: comp.prog.assembler
    Архив рассылки
    Отписаться:  На сайте  Почтой
    Поддержка подписчиков
    Убрать рекламу
    Другие рассылки этой тематики
    Другие рассылки этого автора
    Рассылка производится: Subscribe.Ru / ЗАО «Интернет-Проекты» / О компании / Политика конфиденциальности

    Jose Bartley

    Images

    Reuters
     
    msnbc.com

     

    Toddler dies at Virginia mall, grandmother charged

    Reuters - ‎3 hours ago‎
    WASHINGTON (Reuters) - A 2-year-old girl died on Tuesday after being thrown off a balcony at a shopping mall in the Virginia suburbs of Washington, and her grandmother faces charges over her death, police said.

    238173238172238169238167238164

     
    tgyh7u8i9o

    понедельник, 29 ноября 2010 г.

    RFpro.ru: Ассемблер? Это просто! Учимся программировать

    Если выпуск не отображается корректно, то вы можете прочесть его на сайте

    Реклама Отказаться от рекламы
    Реклама
     
    Subscribe.Ru

    RFpro.ru: Ассемблер? Это просто! Учимся программировать

        Мои подписки     Мои группы     Мои новости     Друзья     Избранное

    Хостинг портала RFpro.ru:
    Московский хостер
    Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

    РАССЫЛКИ ПОРТАЛА RFPRO.RU

    Лучшие эксперты данной рассылки

    Boriss
    Статус: Академик
    Рейтинг: 2545
    • повысить рейтинг »
    Абаянцев Юрий Леонидович aka Ayl
    Статус: Профессионал
    Рейтинг: 2047
    • повысить рейтинг »
    vladisslav
    Статус: 8-й класс
    Рейтинг: 1327
    • повысить рейтинг »

    / КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

    Номер выпуска:1388
    Дата выхода:30.11.2010, 07:30
    Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
    Подписчиков / экспертов:221 / 67
    Вопросов / ответов:1 / 1

    Вопрос № 180935: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: "Заменить элементы главной диагонали на суммы элементов соответствующих строк, затем отсортировать получившийся массив по возрастанию элементов главной диагонали"Р...



    Вопрос № 180935:

    Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
    "Заменить элементы главной диагонали на суммы элементов соответствующих строк, затем отсортировать получившийся массив по возрастанию элементов главной диагонали"Размерность и элементы задавать с клавиатуры, при реализации использовать стек..
    Программная реализация на Tasme, com приложение. помогите

    Отправлен: 25.11.2010, 07:19
    Вопрос задал: MarinaRegreneva (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает Лысков Игорь Витальевич (Старший модератор) :
    Здравствуйте, MarinaRegreneva!
    А вот и программа "Прошу к столу, вскипело!"
    Полагаю, разберетесь самостоятельно в хитросплетениях алгоритма...
    Только замечу, что для сортировки вводится дополнительный вектор адресов строк.
    Сначала сортируется сам вектор, а затем формируется отсортированная матрица,
    для чего используетя временная матрица.
    Все матрицы и вектор строятся в стеке...
    Код:

    .model tiny, pascal

    .data
    sGetDim db 0ah,'Enter matrix dimension (2-10): $' ;пр иглашение для ввода размерности
    sMatrix db 0ah,'Enter matrix (row by row):',0dh,'$';приглашение для ввода элементов
    sSource db 0ah,0ah,'Source matrix:',0dh,0ah,'$'
    sSummed db 0ah,'Summed matrix:',0dh,0ah,'$'
    sSorted db 0ah,'Sorted matrix:',0dh,0ah,'$'
    sPress db 0ah,'Press any key for exit$'

    .data?
    ;буфер для ввода числовой строки (для функции 0ah)
    sNum db ? ;максимальный размер буфера
    sCount db ? ;реальный размер строки
    sBuf db 80 dup (?) ;сама строка

    N dw ? ;размерность матрицы

    .code
    .startup

    repeat:
    call GetDim ;введем размерность
    cmp ax, 2 ;проверим на корректность
    jb repeat
    cmp ax, 10
    ja repeat

    mov N, ax ;сохраняем размерность
    mul ax ;N * N
    shl ax, 1 ;по 2 байта
    sub sp, ax ;выделим место под матрицу в стеке
    mov bp, sp ;адрес матрицы

    call GetMatrix, bp ;введем матрицу
    lea dx, sSource
    call PrintMatrix, bp ;выведем исходную матрицу

    call SumMatrix, bp ;просуммируем
    lea dx, sSummed
    call PrintMatrix, bp ;выведем промежуточный результат (после суммирования)

    call SortMatrix, bp ;отсортируем
    lea dx, sSorted
    call PrintMatrix, bp ;выведем результат

    lea dx, sPress ;Press any key
    mov ah, 9
    int 21h

    mov ah, 0 ;ждем "any key"
    int 16h

    mov ax, 4c00h ;выход
    int 21h

    PrintMatrix proc pArray:word ;вывод матрицы NxN
    mov ah, 9
    int 21h ;вывод заголовока из dx

    mov si, pArray ;адрес массива
    mov cx, N ;число строк
    PrintRowLoop: ;вывод строк
    push cx ;сохраним счетчик строк
    mov cx, N ;чисо столбцов
    PrintColLoop: ;вывод одной строки
    lodsw ;очередное значение
    call PrintNum ;вывод числовой строки
    mov dl, 9 ;разделим табуляцией
    int 21h ;ah = 2
    loop PrintColLoop
    mov dl, 0dh ;переход на новую строку
    int 21h
    mov dl, 0ah
    int 21h
    pop cx ;восстановим счетчик строк
    loop PrintRowLoop
    ret
    PrintMatrix endp

    PrintNum proc ;вывод беззнакового числа из ax
    uses cx ;сохраним счетчик колонок
    mov bx, 10 ;будем делить на 10
    xor cx, cx ;счетчик цифр
    DivLoop:
    xor dx, dx ;готовимся к делению dx:ax / bx
    div bx ;ax - частное, dx - остаток=очередной младшей цифре
    push dx ;сохраним цифру в стеке
    inc cx ;посчитаем
    test ax, ax ;продолжим, пока не 0
    jnz DivLoop
    mov ah, 2 ;функция вывода
    PrintLoop: ;будем выводить в обратном порядке, начиная со старшей шифры
    pop dx ;восстановим очередной разряд
    or dl, '0' ;превратим в символ
    int 21h ;выведем
    loop PrintLoop
    ret
    PrintNum endp

    GetDim proc ;ввод числа - размерности матрицы
    lea dx, sGetDim
    mov ah, 9
    int 21h ;приглашение на ввод размерности матрицы

    mov sNum, 80 ;задаем максимальное значение
    lea dx, sNum
    mov ah , 0ah
    int 21h ;водим строку

    lea si, sBuf ;строка
    call stoi ;преобразовываем в число
    ;ax - введенное число
    ret
    GetDim endp

    GetMatrix proc pArray:word ;ввод матрицы
    local pLast:word ;переменная для сравнения на конец

    lea dx, sMatrix
    mov ah, 9
    int 21h ;приглашение на ввод элементов матрицы

    mov di, pArray ;адрес массива

    mov ax, N ;адрес за массивом (для контроля конца)
    mul ax
    shl ax, 1
    add ax, pArray
    mov pLast, ax ;сохраним
    GM_ask:
    mov ah, 2
    mov dl, 0ah
    int 21h ;переход на новую строку

    mov sNum, 80
    lea dx, sNum
    mov ah, 0ah
    int 21h
    lea si, sBuf ;строка с числами, разделенная разделителями

    GM_next:
    cmp di, pLast ;массив заполнен?
    je GM_ret

    call stoi ;[si] -> ax
    jcxz GM_ask ;дошли до конца строки?
    stosw ;сохраняем
    jmp GM_next ;на следующее число в строке
    GM_ret:
    ret
    GetMatrix endp

    ;функция преобразовывает числовую строку в число
    ;преобразование заканчивается по любому разделителю или концу строки (0dh)
    ;признаком конца стр оки является cx = 0
    stoi proc uses dx ;преобразование строки [si] в беззнаковое число AX
    xor bx, bx ;здесь будем стоить число
    xor cx, cx ;счетчик разрядов
    stoi_next:
    lodsb ;очередной символ
    cmp al, 0dh ;конец стоки?
    je stoi_eol
    cmp al, '0'
    jb stoi_sep ;любая нецифра - разделитель
    cmp al, '9'
    ja stoi_sep
    push ax ;сохраним новый разряд
    mov ax, 10
    mul bx ;умножим старшие на 10
    pop dx ;новый
    and dx, 0fh ;'0'-'9' -> 0-9
    add ax, dx ;добавляем новый разряд
    mov bx, ax ;сохраняем
    inc cx ;считаем
    jmp stoi_next ;продолжаем
    stoi_sep: ;встретили разделитель
    jcxz stoi_next ;были только разделители - на продолжение
    ; иначе - конец числа и выходим
    stoi_eol: ; если числа нет и встретили 0dh - конец строки
    mov ax, bx ;число возвращаем в ax
    dec si ;шаг назад, чтобы легче было проанализировать 0dh
    ret
    stoi endp

    ;запись на диаг ональные места сумм строк матрицы
    SumMatrix proc pArray:word
    mov bx, pArray ;адрес матрицы
    mov cx, N ;число строк
    xor si, si ;индекс для доступа к очередному элементу
    mov di, si ;индекс диагонального элемента
    mov dx, si ;приращение для следующего диагонального элемента
    RowLoop: ;цикл по строкам
    xor ax, ax ;начинаем складывать с 0
    push cx ;сохраним счетчик строк
    mov cx, N ;число столбцов
    ColLoop: ;цикл по столбцам
    add ax, [bx+si] ;складываем все элементы строки
    inc si
    inc si
    loop ColLoop
    mov [di+bx], ax ;сохраняем на месте диагонального элемента
    ;посчитаем индекс следующего диагонального элемента
    inc dx ;инкремент приращения
    inc dx
    mov di, si ;di - начало следующей строки
    add di, dx ;добавим приращение
    pop cx
    loop RowLoop ;по всем строкам
    ret
    SumMatrix endp

    ;сортировка матрицы
    SortMatrix proc pArray:word
    mov bx, pArray ;адрес матрицы
    ;выделим па мять под вектор индексов
    mov ax, N ;размерность вектора
    mov cx, ax ;число элементов
    shl ax, 1 ;по 2 байта
    sub sp, ax ;выделим место в стеке
    mov bp, sp ;адрес вектора индексов

    ;проинициализируем адресами по порядку 0, 1, 2, ...
    xor ax, ax
    mov si, ax
    InitIdx:
    mov [bp+si], ax
    inc ax
    inc si
    inc si
    loop InitIdx

    ;отсортируем вектор индексов методом пузырька
    mov cx, N
    dec cx ;число сравнений
    xor si, si ;индекс в векторе
    SortLoop:
    push cx ;сохраним число сравнений для текущего
    lea di, [si+1] ;начинаем со следующего
    SearchMinLoop: ;цикл по всем последующим
    ;сравниваем текущий со всеми последующими
    call CmpDiag, bx, bp, si, di
    jbe SortNext ;обходим обмен индексов
    ;меняем местами индексы
    call IdxChange, bx, bp, si, di
    SortNext:
    inc di ;на следующий последующий
    loop SearchMinLoop
    inc si ;на следующий текущий
    pop cx ;счетчик текущих
    loop SortLoo p

    ;формируем массив, используя результат сортировки индексов
    call FormSortedArray, bx, bp

    mov ax, N ;выбрасываем из ст ека вектор индексов
    shl ax, 1
    add sp, ax
    ret
    SortMatrix endp

    ;сравнение элементов
    CmpDiag proc pArray:word, pIdx:word, i1:word, i2:word
    uses bx, si, di
    mov bx, pIdx ;адрес вектора индексов
    mov si, i1 ;индекс в векторе
    shl si, 1 ;по два байта
    mov si, [bx+si] ;номер строки в матрице

    mov di, i2 ;аналогично для второго индекса
    shl di, 1
    mov di, [bx+di]

    mov bx, pArray ;матрица
    mov ax, N
    mul si ;начало строки
    add ax, si ;для диагонали номер строки равен номеру столбца
    shl ax, 1
    mov si, ax ;адрес диаглнального элемента

    mov ax, N
    mul di
    add ax, di
    shl ax, 1
    mov di, ax ;адрес второго элемента

    mov ax, [bx+si]
    cmp ax, [bx+di] ;сравниваем
    ret ;результат во флагах FZ, FC!
    CmpDiag endp

    ;обмен индексами
    IdxChange proc pArray:word, pIdx:word, i1:word, i2:word
    uses bx, si, di
    mov bx, pIdx ;вектор индексов
    mov si, i1
    shl si, 1 ;ад рес первого индекса

    mov di, i2
    shl di, 1 ;второго

    mov ax, [bx+di] ;меняем местами
    xchg ax, [bx+si]
    mov [bx+di], ax
    ret
    IdxChange endp

    ;формируем отсортированную матрицу
    FormSortedArray proc pArray:word, pIdx:word
    mov bx, pIdx ;адрес вектора индексов
    mov si, pArray ;адрес матрицы

    mov ax, N
    mul N
    shl ax, 1
    sub sp, ax ;выделяем в стеке место под новую матрицу
    mov di, sp ;адрес новой матрицы

    mov cx, N ;число строк
    RowsLoop:
    push cx ;сохраним число строк
    push si ;сохраним адрес матрицы
    mov ax, [bx] ;номер очередной строки
    mul N
    shl ax, 1 ;индекс начала
    add si, ax ;адрес начала исходной строки
    mov cx, N ;число элементов в строке
    rep movsw ;копируем
    pop si ;восстановим адрес начала матрицы
    inc bx ;на следующий элемент вектора индексов
    inc bx
    pop cx
    loop RowsLoop ;по всем строкам

    ;скопируем сформированную матрицу на исходное м есто
    mov di, si ;адрес куда писать
    mov si, sp ;откуда (адрес только что сформированной матрицы)
    mov ax, N
    mul N
    mov cx, ax ;N*N слов
    rep movsw ;копируем

    mov ax, N ;выбрасываем из стека временную матрицу
    mul N
    shl ax, 1
    add sp, ax
    ret
    FormSortedArray endp

    end

    -----
    Люби своего ближнего, как самого себя

    Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
    Ответ отправлен: 26.11.2010, 13:40
    Номер ответа: 264344
    Украина, Кировоград
    Тел.: +380957525051
    ICQ # 234137952
    Mail.ru-агент: igorlyskov@mail.ru

    Оценка ответа: 5

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264344 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.23 от 23.11.2010
    Обсудить выпуск
     
     Как вам этот выпуск ?  Дайте свой отзыв  или  Оцените   5    4    3    2    1,   можно письмом:  5    4    3    2    1
     
    Реклама Отказаться от рекламы
    Худеть не напрягаясь - легко! Худеть не напрягаясь - легко!
    Теряйте лишние килограммы с поясом для похудения Vibra Tone.

      Вспомни детство! Вспомни детство!
    Аппарат для приготовления сахарной ваты - отличное угощение!

      Как повысить эффективность продаж? Как повысить эффективность продаж?
    Используйте контекстную рекламу в Бегуне для привлечения новых клиентов из Интернета!

     
     
      Рассылки
    Рецепты Туфельки
    Даже ресторанный бизнес не отбил во мне охоту к готовке! Из рассылки вы узнаете очень много вкусных и простых блюд, для любого случая!

    Подписаться:   на сайте    по почте

     
      Группы
    «Полезные статьи о строительстве»
    Уважаемые друзья! Группа предназначена для людей, которые делают ремонт в своей квартире/доме, а так же для компаний которые продают качественные строит...
    «Единство всего мира и понимание его»
    Единство всего мира - это идея признанная наукой экологией более полувека. Однако, впервые эта идея была обнародована более 3300 лет тому назад в пятикн...
    «Клуб для людей, у которых дома живут Кошки»
    Я знаю всё о кошачьих повадках и вообще о кошках! Поэтому я решил создать свою группу о кошках где я смогу отвечать на ваши вопросы о кошках и т.д. и т.п. !
     
    Подписан адрес: admin10383.deep@blogger.com
    Код этой рассылки: comp.prog.assembler
    Архив рассылки
    Отписаться:  На сайте  Почтой
    Поддержка подписчиков
    Убрать рекламу
    Другие рассылки этой тематики
    Другие рассылки этого автора
    Рассылка производится: Subscribe.Ru / ЗАО «Интернет-Проекты» / О компании / Политика конфиденциальности