Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на Ассемблере как общего так и конкретного характера.
 
важное примечание
для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ.
тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается...
ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям
вы сами избрали этот путь? вот и идите по нему сами, ножками... с ручками и с головой...
 
короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите
что-то сделать _за_ вас
если позарез надо и вы даже готовы заплатить, тогда вам сюда
удачи
 
некоторые ресурсы
http://www.wasm.ru/ Самый популярный русскоязычный ресурс. https://wasm.in/
Ассемблер - книги (ASM, Assembler)
 
Просьба все большие листинги оформлять тегом more.
 
если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:42 29-11-2006 | Исправлено: akaGM, 17:44 11-06-2020
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BSWAP занимает около 4 условных тактов, а вариант с ROL около 12

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 14:57 25-08-2012
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос про условное ассемблирование на Xcode.
По описанию единственный способ собрать отдельно 32бит от 64бит можно только при помощи .if, .else, .endif комбинации.

Код:
 
.text
.globl _sw1
 
_sw1:
.if x86_64
    movl $64, %edx
L1:
    rolq %rdi
    rcrq %rax
    decl %edx
    jg L1
    
    ret
 
.else
    pushl %esi
    movl 8(%esp), %esi
    pushl %edi
    movl 16(%esp), %edi
    movl $32, %ecx
L0:
    roll %edi
    rcrl %eax
    roll %esi
    rcrl %edx
    decl %ecx
    jg L0
 
    popl %edi
    popl %esi
    ret
 
.endif
 

 
Может кто знает, какое условие вместо x86_64 надо вписать, чтобы это заработало?

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 01:46 26-08-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
еще такой способ придумкал

Цитата:
    xchg bl, bh
    rol ebx, 16
    xchg bl, bh

но он не быстрее почему то, по крайней мере на пентиуме 4 нортвуд
 
и еще вот такой. но он тоже не оптимальный

Цитата:
    mov    ecx, dword ptr [value]
 
    mov    bx, word ptr [value]
    mov    ax, word ptr [value+2]
    xchg bl, bh
    xchg al, ah
    mov    word ptr [value], ax
    mov    word ptr [value+2], bx
 
    mov    edx, dword ptr [value]
 
    invoke    wsprintf,addr buffer,addr form,ecx,edx

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 14:01 26-08-2012 | Исправлено: bomzzz, 15:33 26-08-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
никто не может на пальцах работу prefetchnta объяснить? чета не могу нагуглить никакого простого описания

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 11:15 27-08-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz, оно тебе реально надо??? на пальцах это не объясняется...
http://forum.ixbt.com/topic.cgi?id=8:20266-4
http://www.cyberforum.ru/assembler/thread452084.html
http://www.wasm.ru/forum/viewtopic.php?pid=55381
http://lib.profi.net.ua/izone/release32/pub/pentium.htm

Цитата:
Для предварительного считывания областей памяти в кэш предназначены команды prefetcht0 (одновременное считывание в кэш первого и второго уровней), prefetcht1 и prefetcht2 (считывание только в кэш второго уровня), а также prefetchnta (считывание сразу в кэш первого уровня, минуя второй). Инструкция sfetch осуществляет принудительную синхронизацию данных в кэше и оперативной памяти. Это стоит сделать перед обработкой потенциально опасных фрагментов кода, которые могут вызвать уничтожение накопленных в кэше данных до того, как они попадут в оперативную память.

оно реально надо??? это ПРИВИЛЕГИРОВАННЫЕ команды...

Всего записей: 11553 | Зарегистр. 03-08-2008 | Отправлено: 18:18 28-08-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
конечно надо. чтоб кешем управлять научится

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 18:35 28-08-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
конечно... процессор ведь тупой и не знает, что ему в следующем такте понадобится...

Всего записей: 11553 | Зарегистр. 03-08-2008 | Отправлено: 18:54 28-08-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
у процессора и так забот полно, он по тридцать процессов и бог знает сколько потоков обслуживает. тут никакого кеша не напасешься.

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 18:56 28-08-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот именно... а тут еще и ты со своими указаниями спешишь помочь как Чип и Дейл... бедный процессор...

Всего записей: 11553 | Зарегистр. 03-08-2008 | Отправлено: 19:02 28-08-2012
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
если я из 512 кбайт, забью 128 байт процессор не обидится
 
Добавлено:

Цитата:
Предварительная загрузка(Prefetching)
 
Следующая оптимизация более тонкая. В добавление к SIMD инструкциям, SSE предоставляет инструкции, которые дают вам возможность управления обменом данными с кэшем. Intel SSE учебник предоставляет полное описание этих инструкций, но нас сейчас интересует только одна - prefetchnta инструкция. Она позволяет загружать(pre-load) адрес в специальную не временную(non-temporal) область L1 кэша, которая гарантирует, не заменять любые данные, загруженные в кэш. Мы используем prefetchnta чтобы указать, что нам нужно загрузить данные по определенному адресу в кэш, по которому можно читать (или писать).
 
Именно так нам и надо обращаться с потоками входных и выходных векторов - нам надо, чтобы вектор находился в кэше пока мы читаем из него (или замписываем). После нам надо, чтобы его НЕ БЫЛО, поэтому у нас есть много пространства в кэше для остальных векторов. Вставим пару prefetchnta инструкций в BatchMultiply - одна для входного потока, и вторая - для выходного:  
// BatchMultiply4 -- Модификация BatchMultiply3, использующая
// SSE prefetching инструкции для ускорения обработки больших
// наборов входных данных.
//
// Выполнение: 21 цикл/вектор
void BatchMultiply4(Matrix4f &m, Vector4f *vin, Vector4f *vout, int len)
{
    // транспонировать матрицу в xmm4-7
    m.TransposeIntoXMM();
    static const int vecSize = sizeof(Vector4f);
 
    __asm {
        mov            esi, vin
        mov            edi, vout
        mov            ecx, len
 
BM4_START:
        // загрузить следуюший входной вктор в xmm0, и передвинуть
        // входной указатель .  Загрузить остальные(upcoming) векторы
        // в кэш.
        movaps    xmm0, [esi]
        prefetchnta    [esi+0x30]
 
        // записать y в xmm1, z в xmm2, и w в xmm3 (оставляя
        // x в xmm0).
        movaps    xmm1, xmm0
        add            esi, vecSize
        movaps    xmm2, xmm0
        add            edi, vecSize
        movaps    xmm3, xmm0
        prefetchnta [edi+0x30]
        shufps    xmm0, xmm0, 0x00
        shufps    xmm1, xmm1, 0x55
        shufps    xmm2, xmm2, 0xAA
        shufps    xmm3, xmm3, 0xFF
        
        // умножить xmm0-3 на соответствующие столбцы матрицы
        // (hiding a pointer increment between the multiplies)
        mulps        xmm0, xmm4
        mulps        xmm1, xmm5
        mulps        xmm2, xmm6
        mulps        xmm3, xmm7
 
        // суммировать результаты в xmm1
        addps        xmm1, xmm0
        addps        xmm2, xmm3
        addps        xmm1, xmm2
 
        // записать результаты в vout и продолжить
        // выполнение цикла
        movaps    [edi-0x10], xmm1
        dec            ecx
        jnz            BM4_START
    }
}
 
Во-первых, выгода от использования загрузки в кэш не сильно видна - мы сэкономили всго один цикл! Но, как только мы начнем использовать большие потоки векторов (примерно 10000), эта версия функции будет работать заметно быстрее, чем предыдущая.
 
Можете поэкспериментировать, чтобы найти подходящее значние смещения prefetching'а, которое будет наилучшим для вашего приложения (для Pentium 3 48 байт подходит лучше всего). Еще может быть полезным использование movntps инструкции, используемой для записи содержимого SSE регистров напрямую в память минуя кэш (т.о. избегая загрязнения кэша). Более полезную информацию смотрите в учебнике Intel.
 
Чтобы увидеть результат использования prefetching'а, запустите simdtest.exe программу с -f флагом. Этот флаг очищеят кэш перед каждым тестом. Вы увидите, prefetching может удвоить скорость вашего кода в наихудшем случае. Это легко запоминающийся способ оптимизации, при том, что prefetching команды могут быть использованы даже в не-SIMD коде!  
 

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 19:03 28-08-2012 | Исправлено: bomzzz, 19:09 28-08-2012
pavel1978

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ДСВ!
 Братья и сестры! Отечество мое в опасности!
Не надо программу писАть, ниче не надо  подиалогался с преподом насчет проследить цепочку памяти МСВ:
 
 
Вопрос:
По программе peek.com :
1)    что всё-таки показывает столбец слева и поле по середине этой программы?
Столбец слева – это адрес дампа памяти, который состоит из двух частей: сегмент и смещение.
Столбец по середине – это содержимое (двоичные коды символов из правого столбца) 16 байт памяти, расположенных начиная с адреса указанного в левом столбце.
 
2)Я получил LoL = 00А7:0026, пытаюсь вычислить адрес MCB по формуле Addr = 16*seg + offset
                     Addr = 16*A7 + 26 = E80h   - правильно делаю?
Правильно, чтобы получить реальный физический адрес. Но по заданию лабораторной вам это нужно знать, но делать не обязательно.
3) База каждого последующего сегмента смещена относительно базы предыдущего на 16 байт (т. н. параграф), т.е. чтобы найти следующий блок мне надо просто добавить 16 (в нех, естесственно) - так?
Вам нужно искать не адреса следующих сегментов, а адреса следующих блоков памяти MCB.  
4) можно привести какой-нибудь конкретный пример вычисления блоков памяти? а то я запутался совсем
 
Чтобы найти адрес следующего блока памяти нужно к сегментному адресу текущего блока памяти (левая часть адреса до двоеточия) прибавить его размер (берется из второго столбца со смещением +3, размером два байта (см. структуру блока MCB), помните по LH-порядок следования байт ), заданный в параграфах и прибавить 1 (единица в сегментном адресе это 16 (10h) байт, величина шапки блока, см. структуру блока MCB, размер задан без этой шапки в параграфах).
 
дайте тупо эту цепочку, а?
LoL = 00a7:0026(h) Я с ума й....нусь с конкретно этого задания и такой "проги", как peek.com (ею надо проследить эту долбаную цепочку

Всего записей: 149 | Зарегистр. 13-03-2008 | Отправлено: 18:32 03-09-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Addr = 16*A7 + 26 = E80h   - правильно делаю?  

нет, не правильно

Цитата:
Отечество мое в опасности

аська есть? чип & дейл спешат на помощь...

Всего записей: 11553 | Зарегистр. 03-08-2008 | Отправлено: 18:47 03-09-2012
pavel1978

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хорошо, тогда как правильно-то? (глумиться не надо)
 
Добавлено:
Цитирую рецензию:
 
"2)Я получил LoL = 00А7:0026, пытаюсь вычислить адрес MCB по формуле Addr = 16*seg + offset
                     Addr = 16*A7 + 26 = E80h   - правильно делаю?
Препод:
Правильно, чтобы получить реальный физический адрес. Но по заданию лабораторной вам это нужно знать, но делать не обязательно."

Всего записей: 149 | Зарегистр. 13-03-2008 | Отправлено: 10:20 04-09-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pavel1978, ICQ 5семь293пять88ноль. могу с задержкой ответить, пользуюсь редко...

Всего записей: 11553 | Зарегистр. 03-08-2008 | Отправлено: 16:38 04-09-2012
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pavel1978

Цитата:
Addr = 16*A7 + 26 = E80h   - правильно делаю?

Как можно смешивать французский с нижегородским шестнадцатиричные числа с десятичными?
Addr = 10h*A7h + 26h = 0A96h

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:02 04-09-2012
pavel1978

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Addr = 10h*A7h + 26h = 0A96h

это правильно? (один из моих вариантов рассуждений был такой. А каков след МСВ, его сегмент и оффсет?
 
Добавлено:
и вот смотри, получили мы 0A96h. Был 00A7:0026h. А теперь 000А:0096h что ли? Я говорю, учебник наглухо мутный и сжатый, поэтому и спрашиваю...

Всего записей: 149 | Зарегистр. 13-03-2008 | Отправлено: 01:27 05-09-2012
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pavel1978

Цитата:
А теперь 000А:0096h что ли?

А подставить эти числа в ту же самую формулу и посмотреть, что из этого получается, никак нельзя?


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 01:42 05-09-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pavel1978, ЛоЛ - это еще НЕ МКБ, понимаете? Указатель на первый МКБ еще нужно найти внутри ЛоЛ, о чем вам было подробно расписано на прошлой странице. И как найти следующий МКБ по текущему - тоже было сказано. И зачем вообще ФИЗИЧЕСКИЕ адреса? Программист ими не оперирует. Он логическими оперирует - сегментами и смещениями. Зайдите в аську, если все-таки хотите сделать задачу. Живое общение гораздо полезнее, проверено

Всего записей: 11553 | Зарегистр. 03-08-2008 | Отправлено: 11:17 05-09-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Поздравляю с днём ПРОГРАММИСТА

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 18:30 12-09-2012
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ась? Ааа... Ага. Спасибо еще бы работу найти... Без диплома...

Всего записей: 11553 | Зарегистр. 03-08-2008 | Отправлено: 18:57 12-09-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru