Цитата:
Сообщение от 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
но все же что за фигня с оптимизацией?
подобная проблема начала появляться в других местах.