Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 12 из 33<  1 ... 9  10  11  12  13  14  15 ... 33  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 31.10.2002
Откуда: МО, Балашиха
Так проблема то с чем, с алгоритмом, или тебе прямо вот код подавай?

_________________
*Незаслуженный ископаемый форума, он же динозавр конференции*



Партнер
 

Caesar писал(а):
Так проблема то с чем, с алгоритмом, или тебе прямо вот код подавай?

чесноговоря проблема прям с тем что код подавай просто это часть моей курсовой всего курсовых у мя 3 я вот эту не могу сделать потому что такой препод что приходится разбираа в ассемблере самой а я блин если и начну щас это делать то все моя башка взорвется поэтому вот помощи прошу, т.к. я думаю что здесь же люди кот. пишут на ассемблере и для кот, эта задачка- просто задачка а мне она может стоить не знаю каких напрягов
Добавлено спустя 46 секунд
Nova_il писал(а):
Lafuma
Уважаемый, Вам же сказали - читайте Правила !

я девушка..
Добавлено спустя 1 минуту, 27 секунд
Nova_il писал(а):
Lafuma
Уважаемый, Вам же сказали - читайте Правила !

это я к тому что уважаемая..
ну бывают же из правил исключения...
я хочу быть в их числе очень уж мне это важно


 

Member
Статус: Не в сети
Регистрация: 02.03.2006
Откуда: Новочебоксарск
помогите найти tasm32.exe и tlink32.exe


 

Member
Статус: Не в сети
Регистрация: 05.06.2005
Откуда: Н. Новгород
Фото: 0
прошу прощения за ламерский вопрос... писал ассемблерную вставку в код СИ. Заменил
Код:
co1=(*a)[i-1]*j1+ost1

на
Код:
        long __x=(*a)[i-1];
        asm {
          mov eax,dword ptr [&j1+4]
          mul __x
          mov ecx,eax
          mov eax,dword ptr [&j1]
          mul __x
          add edx,ecx
          add eax,dword ptr [&ost1]
          adc edx,dword ptr [&ost1+4]
          mov dword ptr [&co1],eax
          mov dword ptr [&co1+4],edx
        }

j1 и ost1 имеют тип __int64, значения всех переменных заведомо положительны.

Похоже, при исполнении этого кода изменяются значения некоторых переменных, которые я не планировал трогать. В результате получаю неадекватный результат работы программы. Подскажите, пожалуйста, что не так.


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
_tonis
ну, неплохо рассказать что же такое j1 и ost1... и не только ;)

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 05.06.2005
Откуда: Н. Новгород
Фото: 0
Root
Просто переменные типа __int64. Я заменил строчку кода на си ассемблерной вставкой, думал, они эквивалентны, ан нет. Боюсь, я не понял, к чему вопрос.


 

Member
Статус: Не в сети
Регистрация: 05.06.2005
Откуда: Н. Новгород
Фото: 0
Root
То есть я, конечно, могу описать весь текст программы, но это долго, т. к. исходник 38 кил. Какого сорта информацию необходимо предоставить? Что скравается за "и не только"?


 

Member
Статус: Не в сети
Регистрация: 09.11.2004
_tonis
А может все проще ? Просто сохранять регистры в стеке перед вызовом, а после извлекать (Может перед вызовом процедуры в них что-то важное хранится =) ?
Код:
asm {
          PUSHA
          mov eax,dword ptr [&j1+4]
          mul __x
          mov ecx,eax
          mov eax,dword ptr [&j1]
          mul __x
          add edx,ecx
          add eax,dword ptr [&ost1]
          adc edx,dword ptr [&ost1+4]
          mov dword ptr [&co1],eax
          mov dword ptr [&co1+4],edx
          POPA
        }


 

Member
Статус: Не в сети
Регистрация: 20.12.2005
Откуда: Волгоград
Интересно, чем тут народ компилирует код. И вообще чем он пользуется?

_________________
Все в этом Мире имеет какой то смысл. В нем нет ничего бесполезного или случайного...


 

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
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
_tonis вообще тама может быть такая путаница при оптимищации... так спроста и не скажешь что он куда пихает

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Member
Статус: Не в сети
Регистрация: 05.06.2005
Откуда: Н. Новгород
Фото: 0
nickyoz я оптимизацию вроде отключил, ибо с ней только тормознее.
Добавлено спустя 43 минуты, 56 секунд
-----------
стало интереснее... дебаг показал, что глюк вызывает неправильная работа кода, стоящего несколько поодаль асм вставки. Вставка стоИт в цикле, после цикла несколько строк кода на си, дальше цикл, который работает неверно.
Добавлено спустя 1 час, 4 минуты, 41 секунду
--------------------------------
стало совсем интересно. похоже, с некоторого момента в программе перестают меняться все переменные кроме счётчиков...
и уж совсем прикольно... вставил ту же асм-вставку в версию программы, написанную в дельфи (в своё время из дельфи в си конвертировал) - там всё прекрасно работает! причём, без всяких pop и push! Сходить что ли повеситься?
Добавлено спустя 11 минут, 18 секунд
Ну как, есть идеи, почему си глючит?


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
А компилируешь чем? Да вывесь что ли прогу свою, раз сам дизассемблировать её не хочешь...


 

Member
Статус: Не в сети
Регистрация: 05.06.2005
Откуда: Н. Новгород
Фото: 0
Компилирую C builder 6. Проект здесь: http://cp.people.overclockers.ru/cgi-bi ... rCount.rar

Билли Бонс писал(а):
раз сам дизассемблировать её не хочешь...

Дык хочу, кто бы научил... я смотрел пошагово работу программы и ничего понять не могу. Та асм вставка в цикле расположена, так вот этот цикл, а вместе с ним и последующие с какого-то момента почему-то не выполняет никаких действий кроме изменения счётчиков. Или я с ума сошёл?.. И главное, что та же вставка в Delphi 7 ведёт себя совершенно нормально.


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
_tonis Билдером я не увлекаюсь, поэтому не могу сказать как там, а в VC++ есть окошко дизассемблера, где при отладке можно посмотреть, во что каждая операция скомпилировалась.
Прогу твою посмотрел... Что она делать-то должна? Боюсь, кроме разве что тебя самого в ней не разберётся никто: мало того, что плохо отформатировано, так ещё и названия у переменных абсолютно ничего не говорящие. :insane:
Зачем тебе вообще эта вставка понадобилась? Что-то мне кажется (даже не зная задачи), что всё можно сделать намного проще. :)


 

Member
Статус: Не в сети
Регистрация: 05.06.2005
Откуда: Н. Новгород
Фото: 0
Билли Бонс прога вот отсюда http://forums.overclockers.ru/viewtopic.php?p=2694911
Вставка понадобилась для того, чтобы программа быстрее работала и чаще читала данные из памяти/кэша. Без неё компилятор вставляет ненужные операции в код. Как выяснилось, компилятор дельфи тоже этим страдает.

В общем, прога не очень нужная. Я об этом сразу не писал, каюсь, потому что искренне полагал, что где-то по мелочи напортачил, где-то надо сохранить регистр или что-то там ещё, и решение будет быстро найдено... но проблемы оказались глубже. Прогу я сам для себя использую скорее как инструмент исследования различных возможностей оптимизации кода, в том числе и без использования асма. Кое-что на этом поприще мне удалось. Этим объясняется половина лохматости кода. Вторая половина вызвана тем, что в самом начале прога писалась вообще ни для чего, и при написании был допущен ряд стратегических ошибок. Сейчас у меня 2 её версии, исходная на Дельфи и переведённая на Си. Я хотел дальше Сишный вариант продолжить, в нём удобнее те стратегические ошибки фиксить. Но программа в си работает медленнее, чем в Дельфи. Очень похоже, что в том месте, где у меня асм вставка, компилятор Си использовал вызов функции. Собственно, хотел обойти эту фичу, попутно порезав лишние операции, а потом спокойно писать в свободное время Си вариант. И тут откуда не возьмись бага. Главное, что в точности та же вставка на том же месте в Дельфи прекрасно работает и экономит время!
Добавлено спустя 1 час, 55 минут, 10 секунд
Я в шоке! после исполнения строк
Код:
          mov dword ptr [&co1],eax
          mov dword ptr [&co1+4],edx

МЕНЯЕТСЯ адрес переменной co1! поскольку выше явно значится
Код:
__int64 &co1 = co1low.v;
, поэтому после этого действа переменные имеют разные адреса. Скорее всего, это не единственный косяк... видел ещё пару странно выполняющихся операций умножения.

Я не понял, как такое может быть? Почему-то в Дельфи таких проблем ну никак нету!

ЗЫ: переустановил билдер, не помогло.
Добавлено спустя 13 минут, 42 секунды
причём, чтобы не было скучно, адрес co1 совпадает после этого с адресом ost1, что, вероятно, доводит программу до ручки.


 

Member
Статус: Не в сети
Регистрация: 05.06.2005
Откуда: Н. Новгород
Фото: 0
Похоже, я проблему решил. Хотя в чём дело, так и не понял. Позже отпишусь.


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
_tonis в С++ нужно чётко отличать переменную от указателя. Выше ты привёл пример изменения именно указателя.
Вообще, если ты пишешь программу, требующую максимальной скорости выполнения, используй VC++, а не билдер. У микрософта компилятор оптимизирует намного лучше борланда, там тебе и вставки ассемблерные скорее всего не понадобятся. Да и глюков у VC замечено (мною) не было. Вот я тут небольшой пример для сравнения написал:
Код:
#include <windows.h>
#include <iostream>

using namespace std;

unsigned int factor[262144];

void main( )
{
    // инициализация: 0! = 1
    ::memset( factor, 0, sizeof( factor ) );
    factor[0] = 1;

    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...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 12 из 33<  1 ... 9  10  11  12  13  14  15 ... 33  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan