Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с матрицей 
:(
    Опции темы
volnorez
Дата 12.10.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 22.9.2007

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



Помогите пожалуйста с такой задачей.  я уже просто не знаю что делать  smile 
В двумерном массиве 4х4 найти сумму самых больших элементов в столбце.
кто знает как это сделать если можна с коментариями 
PM MAIL   Вверх
THandle
Дата 12.10.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 1
Всего: 372



volnorez, тебе надо на ассемблере??? Или же ты просто ошибся разделом и тебе уже написали на Делфи:

http://forum.vingrad.ru/forum/topic-231890...y1666092/0.html

Или тебе и то и то требуется?
PM   Вверх
volnorez
Дата 13.10.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 22.9.2007

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



Мне на ассемблере а с Делфи я ошибся:(
PM MAIL   Вверх
Mikl_
Дата 16.10.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



Цитата

Помогите пожалуйста с такой задачей.  я уже просто не знаю что делать  smile 
В двумерном массиве 4х4 найти сумму самых больших элементов в столбце.
кто знает как это сделать если можна с коментариями
1) Сперва просто рассуждаем. В памяти двухмерный массив (матрица) представляет собой одномерный массиив из 16 (4х4) элементов. Элементы первого столбца -- это элементы с номерами 0(a[1,1]), 4(a[2,1]), 8(a[3,1]), 12(a[4,1]);  элементы второго столбца -- это элементы с номерами 1, 5, 9, 13; третий столбец -- 2, 6, 10, 14 элементы; четвертый столбец 3, 7, 10, 15 элементы. Теперь сравниваем между собой 0, 4, 8, 12 элементы и выбираем наибольший, то же со 2-ым, 3-им и 4-ым столбцом. Выбранные элементы складываем. 
2) Для того что бы писать что-то на ассемблере требуется указать какой из ассемблеров требуется, а их более десятка (самые распространенные masm, fasm, nasm, tasm, yasm, a86, hla) и под какую операционную систему требуется написать задачу DOS, Windows (от 3.11 до Vista) Linux (и прочие -nix) 
ничего этого ты не пишешь, а я не экстрасенс smile 
3) допустим, тебе требуется masm и com под DOS и массив состоит из беззнаковых целых чисел размером в байт (а мог состоять из целых чисел со знаком или из вещественных чисел или символов ASCII или Unicode и это были бы разные программы но раз ты об этом не пишешь значит и мне на это насрать)
Код

.286
.model tiny
.code
start: mov bx,0; счетчик 
          mov si,0; счетчик  столбцов 
          mov ah,0       
a0:    mov al,array[bx][si]; помещаем в al первый элемент столбца
a1:    add bx,4; переходим к следующему элементу столбца
          cmp al,array[bx][si]; ищем максимальный элемент в столбце
          jna a2
          mov al,array[bx][si]; если находим, тогда помещаем в al очередной максимальный элемент
a2:    cmp bx,12; столбец закончился?
          jb a1
          add sum,ax; складываем максимальный элемент столбца
          mov bx,0; обнуляем счетчик          
          inc si; переходим к следующему столбцу
          and si,3; это последний столбец?
          jnz a0
;в переменной sum сумма самых больших элементов в столбце
          . . . ;в этом месте выводишь значение sum на экран или в файл
          retn; выходим из программы - 
array db 16 dup(?); здесь место под массив, предполагаем, что массив уже заполнен
sum dw 0; здесь место под сумму максимальных элементов
end start
как видишь от паскалевско/дельфийского варианта отличия не очень большие smile 

Это сообщение отредактировал(а) Mikl_ - 20.10.2008, 03:50
PM MAIL   Вверх
volnorez
Дата 17.10.2008, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 22.9.2007

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



Спасибо тебе большое это то что надо!!! smile 
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



ИМХО, если тебе нужна высокая производительность (а зачем еще нужен ассемблер?), то тут нужно применять бинарный поиск и раскручивание циклов. Можно и векторизацию, но не факт, что на таком маленьком массиве от этого будет большой выйгрыш.

Учитывая все это, я бы не советовал ассемблер - слижком много повторяющегося кода, легко сделать ошибку, которую потом хрен найдешь. С такой задачей лучше справится C/Fortran, если компилятор хороший.
PM MAIL   Вверх
Mikl_
Дата 12.11.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



Kallikanzarid, явно лабораторная работа из серии сдать и забыть -- ассемблер это не только скорость но и короткий код для поиска максимума/минимума можно и SSE-инструкции использовать  smile 
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



Понимаю, но не мог не поворчать про ущербность подхода  smile 
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



Сейчас посмотрел список инструкций SSE. Получается вообще здорово:
1) храним матрицу в формате фортрана (по столбцам)
2) 4 инструкции на занесение столбцов в xmm0-xmm3
3) 4 инструкции на вычисление максимумов
4) 3 (6?) инструкций на занесения результатов из xmm1, xmm2, xmm3 в xmm0
5) одна инструкция на суммирование
6) одна инструкция на извлечение результата
Итого: 13-16 инструкций, никаких циклов  smile 
PM MAIL   Вверх
volnorez
Дата 16.11.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 22.9.2007

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



Это конечно все супер только я не знаю что такое инструкции SSE и так как нам надо делать лабы по конкретным данным (которые показаны в лабораторных) я не могу использовать такой метод.  Да кстати та прога Mikl_ у меня как то не правельно работало и пришлось писать совершенно другую согласно лабораторной методичке и вот что у меня получилось (кстати с циклами) и тоже не большая.
Код

 STAS  SEGMENT  PARA STACK  'Stack'
         DW  256  DUP("?")
       STAS  ENDS

       SSG  SEGMENT  PARA  'Data'
         mas    dw   65,48,79,5,25,6,113,17,77,34,35,57,14,90,65,79
       SSG  ENDS

       SCG  SEGMENT  PARA  'Code'
        BEGIN      PROC     FAR
        ASSUME  CS:SCG,DS:SSG,SS:STAS,ES:NOTHING
        PUSH     DS            
        SUB      AX,AX         
        PUSH     AX            
        MOV      AX,SSG        
        MOV      DS,AX         
        SUB      AX,AX     
        
        xor di,di
        mov si, offset mas
        add si,30
    T1:    
        sub si,30
        mov ax,[si]
        mov bx,mas[si]
        mov cx,4
    q1:
        mov dx,mas[si]
        cmp dx,bx
        JB q2
        mov bx,dx
    q2:
        add si,8
        mov ax,[si]
        loop q1

        add di,bx

        mov dx,offset mas
        add dx,38 
        cmp si,dx
        JB T1

        mov dx,di
    
        RET                                  
        BEGIN      ENDP
        SCG  ENDS
        END    BEGIN

PM MAIL   Вверх
Kallikanzarid
Дата 16.11.2008, 18:06 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



ИМХО, мелко берешь. Простое задание "для самых маленьких", а ты делаешь его по написанному. Настоящий опыт так ты не получишь.
PM MAIL   Вверх
volnorez
Дата 22.11.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 22.9.2007

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



А есть еще какие то варианты написания?
Просто эта программа тоже работает не совсем правильно я там немного схитрил когда писал.
PM MAIL   Вверх
Mikl_
Дата 24.11.2008, 04:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



volnorez, что конкретно не правильно работало? судя по твоему листингу, требовалось  
mas    dw   65,48,79,5,25,6,113,17,77,34,35,57,14,90,65,79 поменять на
mas    db   65,48,79,5,25,6,113,17,77,34,35,57,14,90,65,79 размеры чисел это позволяют, у тебя ни одно число не больше 255
Код
.286
.model tiny
.code
start:    mov bx,0; счетчик 
          mov si,0; счетчик  столбцов 
          mov ah,0       
a0:       mov al,mas[bx][si]; помещаем в al первый элемент столбца
a1:       add bx,4; переходим к следующему элементу столбца
          cmp al,mas[bx][si]; ищем максимальный элемент в столбце
          jna a2
          mov al,mas[bx][si]; если находим, тогда помещаем в al очередной максимальный элемент
a2:       cmp bx,12; столбец закончился?
          jb a1
          add sum,ax; складываем максимальный элемент столбца
          mov bx,0; обнуляем счетчик          
          inc si; переходим к следующему столбцу
          and si,3; это последний столбец?
          jnz a0;в переменной sum сумма самых больших элементов в столбце
          . . . ;в этом месте выводишь значение sum на экран или в файл
          retn; выходим из программы - 
mas db 65,48,79,5,25,6,113,17,77,34,35,57,14,90,65,79 ; здесь место под массив
sum dw 0; здесь место под сумму максимальных элементов
end start
если, по условию задачи, элементы массива должны быть словами, тогда учитываем, что размеры элементов матрицы увеличились вдвое и пишем так
Код
.286
.model tiny
.code
start:    mov bx,0; счетчик 
          mov si,0; счетчик  столбцов
a0:       mov ax,mas[bx][si]; помещаем в ax первый элемент столбца
a1:       add bx,8; переходим к следующему элементу столбца 8=4*2
          cmp ax,mas[bx][si]; ищем максимальный элемент в столбце
          jna a2
          mov ax,mas[bx][si]; если находим, тогда помещаем в ax очередной максимальный элемент
a2:       cmp bx,24; столбец закончился? 24=12*2
          jb a1
          add sum,ax; складываем максимальный элемент столбца
          mov bx,0; обнуляем счетчик          
          add si,2; переходим к следующему столбцу 2=1*2
          cmp si,6; это последний столбец? 6=3*2
          jbe a0;в переменной sum сумма самых больших элементов в столбце
          . . . ;в этом месте выводишь значение sum на экран или в файл
          retn; выходим из программы - 
mas dw 65,48,79,5,25,6,113,17,77,34,35,57,14,90,65,79 ; здесь место под массив
sum dw 0; здесь место под сумму максимальных элементов
end start


Это сообщение отредактировал(а) Mikl_ - 24.11.2008, 12:12
PM MAIL   Вверх
volnorez
Дата 24.11.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 22.9.2007

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



А конкретно оно считает не правильно. Результат выдает какойто странный. Mikl_ А ты можешь сказать что не так в моем листинге?
PM MAIL   Вверх
Mikl_
Дата 25.11.2008, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 8
Всего: 14



volnorez, намудрил ты там, похоже, что находишь минимальный элемент jb q2 вместо jae q2 много лишних операций smile , в общем, у меня считает нормально smile , разбирайся сам  smile , а я не нянька   smile 
Код

        xor di,di; место под сумму
        mov si,offset mas
t1:    mov ax,[si]
        mov cx,3; достаточно проверить три оставшихся элемента столбца
q1:  cmp ax,[si+8]
        jae q2; <-- вот здесь ошибка
        mov ax,[si+8]; находим максимальный элемент
q2:  add si,8; переходим к следующему элементу столбца
        loop q1
        add di,ax; суммируем максиальные элементы столбцов
        sub si,22; переходим к первому элементу следующего столбца
        cmp si,offset mas+8; проверены все столбцы? если нет возвращаемся
        JB t1
; содержимое di на экран di=359 
         retn
;     0   2   4  6   8 10  12  14   16 18 20 22   24 26 28 30 смещения относительно адреса mas
mas dw 65,48,79, 5,  25, 6,113,17,  77,34,35,57,  14,90,65,79; элементы матрицы
;mas1   dw   65, 25,77,14  элементы 1-го столбца максимум=77
;mas2   dw   48,   6,34,90  элементы 2-го столбца максимум=90
;mas3   dw   79,113,35,65 элементы 3-го столбца максимум=113
;mas4   dw    5, 17,57,79    элементы 4-го столбца максимум=79
;                         сумма максимальных элементов =359



Это сообщение отредактировал(а) Mikl_ - 25.11.2008, 10:05
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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