Поиск:

Ответ в темуСоздание новой темы Создание опроса
> 10 строк ассемблера. Кто поможет понять? вставка в с++  
:(
    Опции темы
motoden
Дата 2.3.2014, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот такая вставка в с++ код мною обнаружена в проекте, в котором мне предстоит разобраться.
Код

    __asm__ __volatile__
        (
                "movl $2,%%ebx;"
                "cycle2:;"
                "    xorl %%eax,%%eax;"
                "    movw (%%edi),%%ax;"
                "   roll $2,%%eax; "
                "   addl %%esi,%%eax;"
                "   addl %%ebx,%%edi;"
                "   incl (%%eax);"
                "   decl %%ecx;"        // ecx - счетчик
                "jnz cycle2;"
                 ::"D"(bufIn),"S"(bufOut),"c"(dsize)
        );

Товарищи-программисты, пожалуйста, помогите понять что здесь происходит?
PM MAIL   Вверх
_zorn_
Дата 4.3.2014, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

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



Могу ошибаться (плохо шарю в AT&T синтаксисе), но думаю что то вроде этого
Код
char* bufIn;
char* bufOut;
int dsize;
....
int seek = 0;
for(int i=0;i<dsize;++i)
{
  int a = 0;
  a = (WORD)bufIn[seek];
  a <<=2; //a *=4; хз roll в AT&T - это циклический сдвиг или обычный, но в данном случае это не имеет значения
  ++bufOut[a];
  seek += 2;
}


PM MAIL   Вверх
_zorn_
Дата 5.3.2014, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

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



Напутал с размерностью указателей. Все можно записать проще.
Код

unsigned short bufIn[0x100]; // Размер произвольный
int bufOut[0x10000]; //Если меньше 0x10000, то будет вероятность вылететь за границы. Больше не имеет смысла.
for(unsigned i=0;i<dsize;++i)
{
  ++bufOut[bufIn[i]];
}

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

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

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


 




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


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

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