-
>SergP © (03.06.16 13:49) [59] Delphi 2010 and XE support up to the SSE4.2 instruction sets
-
Rouse_ © (03.06.16 13:06) [56] А как пользоваться SintaxHighlighter ? Не пойму никак )
-
> dmk © (03.06.16 13:59) [61] кнопочка "D" ))
Rouse_ , коль пошла такая пьянка, расскажи о выравнивании стека перед CALL - как правильно, нужно/не нужно, насколько критично, сколько резервировать для регистровых параметров, сразу 20h или ? Спасибо.
-
> NoUser © (03.06.16 15:08) [62]
в 64 битах стек должен быть выравнен по 16 байтной границе, требуется резервирование стека под дополнительные 4 64-битных параметра (даже если в этом нет необходимости - так написано в документации)
> Вызывающая функция отвечает за выделение пространства для > параметров вызываемой функции и должна всегда выделять достаточное > пространство для 4 параметров, даже если вызываемая функция > не содержит такого количества параметров. Это помогает упростить > поддержку функций без прототипов и функций с переменным > количеством аргументов (vararg) C/C++. Для функций с переменным > количеством аргументов или для функций без прототипов любое > значение типа float должно быть продублировано в соответствующем > регистре общего назначения. Любые параметры, следующие после > первых 4, до вызова должны сохраняться в стеке над резервным > хранилищем для первых четырех. Сведения о функции с переменным > количеством аргументов представлены в разделе Функции с > переменным количеством аргументов (Varargs). Сведения о > функции без прототипов представлены в разделе Функции без > прототипа. > Выравнивание > > Большинство структур выровнены естественным выравниванием. > Главными исключениями являются указатели стека и функции > распределения памяти malloc или alloca, которые выровнены > на 16 байт для сохранения производительности. Выравнивание > свыше 16 байт должно выполняться вручную, но начиная с 16 > байт выполняется общее выравнивание размера для операций > XMM, которого должно хватать для большей части кода. Дополнительные > сведения о структуре и выравнивании см. в разделе Типы и > хранилище. Дополнительные сведения о стеке см. в разделе > Использование стека.
-
Ну и тогда еще несколько вопросов: Если допустим я захочу полностью переписать процедуру/функцию на ассемблере: 1. Как работать с глобальными переменными? 2. Как функция должна возвращать результат, если например это запись? 3. Если мне понадобится память для локальных переменных: как лучше делать: не описывать переменные в секуии var, а просто уменьшать указатель стека на нужную величину, использовать этот кусок памяти, а перед выходом возвращать указатель стека в исходное состояние? или как-то по другому? 4. Если у меня WinXP, то использовать 64-битные РОН (rax, rbx....) я не могу?
-
1. mov rax, GlobalVar 2.
TSomeType = record
private
public
function InRangeX(x: integer): boolean;
end;
3. Как нравится. 4. Можешь, только передачу параметров свою делать надо. Например, через указатель.
-
> Как работать с глобальными переменными?
как обычно. вместо:
MyGlobalVar := 123 пиши
lea eax, MyGlobalVar mov [eax], 123
> Как функция должна возвращать результат, если например это > запись?
структуры возвращаются по ссылке
> 3. Если мне понадобится память для локальных переменных:
лучше объяви их в секции var, компилятор сам добавит код под выделение памяти
> 4. Если у меня WinXP, то использовать 64-битные РОН (rax, > rbx....) я не могу?
регистры RAX и т.п. ты можешь использовать только в 64 битном коде, соответственно только под 64 битной ОС
-
>регистры RAX и т.п. ты можешь использовать только в 64 битном коде, соответственно >только под 64 битной ОС
Странно, mmx разве не относится к 64 битам? В D7 раньше байт коды были. Использовал в 32 битном коде.
-
Это разные вещи
-
> > Как функция должна возвращать результат, если например > это > > запись? > > структуры возвращаются по ссылке
А где выделяется память под это дело? И кто ее выделяет? Вызываемая функция или вызывающая процедура/функция? Т.е. Кто кому передает эту ссылку?
-
SergP © (03.06.16 16:08) [64]
> Ну и тогда еще несколько вопросов:
Рано тебе их задавать. Матчасть надо учить и не по форумам.
-
> [64] SergP © (03.06.16 16:08)
Сделай для эксперимента на ASM и приликуй к основному модулю - это поубавит вопросов.
-
Правильно. Самостоятельно это сделай.
-
> Inovet © (04.06.16 12:12) [72] > > Правильно. Самостоятельно это сделай.
С тем, что меня интересовало уже разобрался. Но вот просто разбираться приходится по коду в окне CPU-View, а там читабельность низкая, навигация неудобная, да и самая большая проблема в том, что это все нельзя сбросить в текстовый файл. Ну и кроме того там полно откровенного бреда. Конечно, когда пытаешься мыслить с точки зрения компилятора, то вроде понятно почему он сделал так. Но с точки зрения человека это бред... Вот, например, один из перлов компилятора: ...if (num and 1) <>0 then
mov eax,[ebp+$08]
mov edx,[ebp+$0c]
and eax,$00000001
xor edx,edx
cmp edx,$00
jnz +$03
cmp eax,$00
jz +$06
-
> [73] SergP © (04.06.16 13:25) > да и самая большая проблема в том, что это все нельзя сбросить > в текстовый файл.
Для этого есть реверсинженеринговые штуки, наподобие дизассемблеров.
-
> [73] SergP © (04.06.16 13:25) > Вот, например, один из перлов компилятора:
Ну это может быть в дебаг сборке такое?
-
> [74] Inovet © (04.06.16 18:59) > реверсинженеринговые
Да, на всякий случай, в Си есть опция компилятора, при включении которой, компилятор сначала в текстовый АСМ генерит, потм уже Амсом компилит.
-
Розыч, неужели и ты заразился словом "прыжок"? Ну плохо оно звучит для русского слуха. Есть же нормальное слово "переход". Прыжок, млин. Я, может быть, на соответствующих тематческих форумах не бываю, но осуждаю. Какой нафиг прыжок.
Подпишусь - Ваш Граммар Наци. Давайте не будем использовать настолько тупые кальки.
-
> Игорь Шевченко © (04.06.16 10:35) [70] > > SergP © (03.06.16 16:08) [64] > > > > Ну и тогда еще несколько вопросов: > > > Рано тебе их задавать. Матчасть надо учить и не по форумам. >
Вот какой смысл у этого поста?
-
> первый параметр, как я понимаю передается через EAX > Результат тоже вроде через EAX передается. > Третий похоже через EDX > А что со вторым?
Int64 передаётся через стек > push ebp; // Зачем делать то, что я не просил? > mov ebp,esp; > push ebx; > pop ebp; > ret $0008; //что за параметр?
Это особенность компилятора Delphi. Если есть стековые переменные в функции или секции var - Delphi делает префикс/постфикс и обращается к переменным через ebp. Если объявишь keyword через var - то указатель на него передастся через EDX, а третий параметр будет ECX.
|