Показать сообщение отдельно
  #5  
Старый 19.11.2015, 12:03
Аватар для a.n.d.r.e.w
a.n.d.r.e.w a.n.d.r.e.w вне форума
Прохожий
 
Регистрация: 01.07.2015
Сообщения: 28
Версия Delphi: delphi xe7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
В коде нового поста используется ebp + X, в старом - ebp - X. В [ebp + 4] по идее вообще адрес возврата, а туда записывается eax?. Что-то с этим новым кодом не так.

все верно эт я по памяти писал снова ошибся, говорю ж не специалист в асм )), конечно смещение отрицательное. исправил пост.

Попробую сначала.

Разрабатываю класс для работы с большими числами до нескольких сотен десятичных знаков. Такие используются в криптографии.
Хранится такое число кусками размером 4 байта, а методы класса оперируют этими кусками выполняя математические, логические, операции сравнения, копирования итд. по сути это массив.
но так как операции эти математические очень медленные на деле получаются, длинные циклы с длинными циклами, поэтому появилось желание оптимизировать базовые методы работы с массивом: доступ к элементами, изменение длины массива, копирование и.т.д.
раньше использовал простой массив Blocks: array of LongWord, Blocks[i], getLength(Blocks), setLength(Blocks) итд..
потом сделал через указатель меняю длину ReallocMem, блоки получаю смещаясь от базового указателя. Производительность выросла в несколько раз.
теперь решил пойти дальше обратиться к ассемблеру, заодно попрактиковаться. не помешает.

В общем в классе объявлена только один указатель fMemory
от него
по смещению 0 храню счетчик блоков 2байта
по смещению 2 храню параметры (знак числа, положение десятичной точки) тоже 2 байта
по смещению 4 первый блок

да в первом посте код кривой, не спорю, но работает
вопрос мой вот в чем:
внутри асм блока я хочу обращаться к передаваемой переменной Pos напрямую mul Pos , но так не всегда получается

вот так работает
Код:
procedure TFGInt.Assign(aUnit: TFGInt; Pos: Word=0; Cnt: Word=0);
 begin
  asm
   ....
    mul Pos
   ....
  end;
 end;

вот так нет
Код:
procedure TFGInt.Assign(aUnit: TFGInt; Pos: Word=0; Cnt: Word=0);
  asm
   ....
    mul Pos
   ....
  end;

во втором случае умножение eax происходит на произвольное число
а в вотчлисте E2171 Variable 'Pos' inaccessible here due to optimization

обойти проблему у меня в итоге получилось, разобрался
Pos передается в регистре cx и в первом и втором случае как оказалось в старшем слове ecx видимо вычисления предыдущей функции,
а счетчик передается в стеке по положительному смещению от esp, но со счетчиком нет проблем обращаясь явно к переменной Cnt

но все же что за фигня с оптимизацией?
подобная проблема начала появляться в других местах.
Ответить с цитированием