Так проблема то с чем, с алгоритмом, или тебе прямо вот код подавай?
чесноговоря проблема прям с тем что код подавай просто это часть моей курсовой всего курсовых у мя 3 я вот эту не могу сделать потому что такой препод что приходится разбираа в ассемблере самой а я блин если и начну щас это делать то все моя башка взорвется поэтому вот помощи прошу, т.к. я думаю что здесь же люди кот. пишут на ассемблере и для кот, эта задачка- просто задачка а мне она может стоить не знаю каких напрягов Добавлено спустя 46 секунд
Nova_il писал(а):
Lafuma Уважаемый, Вам же сказали - читайте Правила !
я девушка.. Добавлено спустя 1 минуту, 27 секунд
Nova_il писал(а):
Lafuma Уважаемый, Вам же сказали - читайте Правила !
это я к тому что уважаемая..
ну бывают же из правил исключения...
я хочу быть в их числе очень уж мне это важно
j1 и ost1 имеют тип __int64, значения всех переменных заведомо положительны.
Похоже, при исполнении этого кода изменяются значения некоторых переменных, которые я не планировал трогать. В результате получаю неадекватный результат работы программы. Подскажите, пожалуйста, что не так.
Member
Статус: Не в сети Регистрация: 05.06.2005 Откуда: Н. Новгород Фото: 0
Root Просто переменные типа __int64. Я заменил строчку кода на си ассемблерной вставкой, думал, они эквивалентны, ан нет. Боюсь, я не понял, к чему вопрос.
Member
Статус: Не в сети Регистрация: 05.06.2005 Откуда: Н. Новгород Фото: 0
Root То есть я, конечно, могу описать весь текст программы, но это долго, т. к. исходник 38 кил. Какого сорта информацию необходимо предоставить? Что скравается за "и не только"?
_tonis А может все проще ? Просто сохранять регистры в стеке перед вызовом, а после извлекать (Может перед вызовом процедуры в них что-то важное хранится =) ?
Member
Статус: Не в сети Регистрация: 05.06.2005 Откуда: Н. Новгород Фото: 0
CCCP Не помогло, результат тот же. Вообще, не знаю, как в си, а в Borland Pascal разрешается свободно менять ecx,eax и edx, а остальные действительно надо сохранять. Добавлено спустя 4 минуты, 14 секунд Может, нужно поменять какие-то настройки компилятора перед вставкой асма в код?
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
_tonis нет, никакой компайлер не любит, если ты меняешь содержимое каких бы то нибыло регистров, нужно сохранить _все_ РОН и регистры флагов.
pushad
pushf
...
popf
popad
Member
Статус: Не в сети Регистрация: 05.06.2005 Откуда: Н. Новгород Фото: 0
Daemon ничего не поменялось Добавлено спустя 10 минут, 11 секунд Daemon
Daemon писал(а):
никакой компайлер не любит
из дельфлвого хелпа:
Цитата:
Object Pascal Language Guide The asm statement
<...>
Register use
In general, the rules of register use in an asm statement are the same as those of an external procedure or function. An asm statement must preserve the EDI, ESI, ESP, EBP, and EBX registers, but can freely modify the EAX, ECX, and EDX registers. On entry to an asm statement, EBP points to the current stack frame and ESP points to the top of the stack. Except for ESP and EBP, an asm statement can assume nothing about register contents on entry to the statement.
Member
Статус: Не в сети Регистрация: 05.06.2005 Откуда: Н. Новгород Фото: 0
nickyoz я оптимизацию вроде отключил, ибо с ней только тормознее. Добавлено спустя 43 минуты, 56 секунд -----------
стало интереснее... дебаг показал, что глюк вызывает неправильная работа кода, стоящего несколько поодаль асм вставки. Вставка стоИт в цикле, после цикла несколько строк кода на си, дальше цикл, который работает неверно. Добавлено спустя 1 час, 4 минуты, 41 секунду --------------------------------
стало совсем интересно. похоже, с некоторого момента в программе перестают меняться все переменные кроме счётчиков...
и уж совсем прикольно... вставил ту же асм-вставку в версию программы, написанную в дельфи (в своё время из дельфи в си конвертировал) - там всё прекрасно работает! причём, без всяких pop и push! Сходить что ли повеситься? Добавлено спустя 11 минут, 18 секунд Ну как, есть идеи, почему си глючит?
Дык хочу, кто бы научил... я смотрел пошагово работу программы и ничего понять не могу. Та асм вставка в цикле расположена, так вот этот цикл, а вместе с ним и последующие с какого-то момента почему-то не выполняет никаких действий кроме изменения счётчиков. Или я с ума сошёл?.. И главное, что та же вставка в Delphi 7 ведёт себя совершенно нормально.
_tonis Билдером я не увлекаюсь, поэтому не могу сказать как там, а в VC++ есть окошко дизассемблера, где при отладке можно посмотреть, во что каждая операция скомпилировалась.
Прогу твою посмотрел... Что она делать-то должна? Боюсь, кроме разве что тебя самого в ней не разберётся никто: мало того, что плохо отформатировано, так ещё и названия у переменных абсолютно ничего не говорящие. Зачем тебе вообще эта вставка понадобилась? Что-то мне кажется (даже не зная задачи), что всё можно сделать намного проще.
Member
Статус: Не в сети Регистрация: 05.06.2005 Откуда: Н. Новгород Фото: 0
Билли Бонс прога вот отсюда http://forums.overclockers.ru/viewtopic.php?p=2694911 Вставка понадобилась для того, чтобы программа быстрее работала и чаще читала данные из памяти/кэша. Без неё компилятор вставляет ненужные операции в код. Как выяснилось, компилятор дельфи тоже этим страдает.
В общем, прога не очень нужная. Я об этом сразу не писал, каюсь, потому что искренне полагал, что где-то по мелочи напортачил, где-то надо сохранить регистр или что-то там ещё, и решение будет быстро найдено... но проблемы оказались глубже. Прогу я сам для себя использую скорее как инструмент исследования различных возможностей оптимизации кода, в том числе и без использования асма. Кое-что на этом поприще мне удалось. Этим объясняется половина лохматости кода. Вторая половина вызвана тем, что в самом начале прога писалась вообще ни для чего, и при написании был допущен ряд стратегических ошибок. Сейчас у меня 2 её версии, исходная на Дельфи и переведённая на Си. Я хотел дальше Сишный вариант продолжить, в нём удобнее те стратегические ошибки фиксить. Но программа в си работает медленнее, чем в Дельфи. Очень похоже, что в том месте, где у меня асм вставка, компилятор Си использовал вызов функции. Собственно, хотел обойти эту фичу, попутно порезав лишние операции, а потом спокойно писать в свободное время Си вариант. И тут откуда не возьмись бага. Главное, что в точности та же вставка на том же месте в Дельфи прекрасно работает и экономит время! Добавлено спустя 1 час, 55 минут, 10 секунд Я в шоке! после исполнения строк
МЕНЯЕТСЯ адрес переменной co1! поскольку выше явно значится
Код:
__int64 &co1 = co1low.v;
, поэтому после этого действа переменные имеют разные адреса. Скорее всего, это не единственный косяк... видел ещё пару странно выполняющихся операций умножения.
Я не понял, как такое может быть? Почему-то в Дельфи таких проблем ну никак нету!
ЗЫ: переустановил билдер, не помогло. Добавлено спустя 13 минут, 42 секунды причём, чтобы не было скучно, адрес co1 совпадает после этого с адресом ost1, что, вероятно, доводит программу до ручки.
_tonis в С++ нужно чётко отличать переменную от указателя. Выше ты привёл пример изменения именно указателя.
Вообще, если ты пишешь программу, требующую максимальной скорости выполнения, используй VC++, а не билдер. У микрософта компилятор оптимизирует намного лучше борланда, там тебе и вставки ассемблерные скорее всего не понадобятся. Да и глюков у VC замечено (мною) не было. Вот я тут небольшой пример для сравнения написал:
unsigned n, count = 1; // count - количество ненулевых элементов в factor[] cout << "Enter natural number: "; cin >> n;
// засекаем время и приступаем к вычислению cout << "Calculating now. Please, wait...\n"; DWORD time = ::GetTickCount();
union { struct { unsigned low, high; }; unsigned __int64 product; }; for ( unsigned k = 1; k <= n; ++k ) { unsigned carry = 0; for ( unsigned q = 0; q < count; ++q ) { product = ( unsigned __int64 ) factor[q] * k + carry; factor[q] = low; carry = high; } if ( high ) factor[count++] = high; }
// считаем миллисекунды time = ::GetTickCount() - time; cout << "Calculation complete. " << time << " ms passed.\n\n"; }
Компилирую MSVC.NET 2003, результат: 100000! считает за 19.268 сек против 51.344 сек твоей проги (на дельфе?). Правда у меня результат в 16-ричном виде получается, но тем не менее... Добавлено спустя 4 минуты, 11 секунд Кстати, _tonis, твоя программа почему-то не правильно считает факториал числа меньшего 10...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения