Какие регистры процессора должны быть восстановлены в конце процедуры asm в Delphi - PullRequest
13 голосов
/ 24 августа 2010

При написании процедуры или функции Delphi в коде сборки, какие регистры должны быть сохранены и восстановлены до исходного значения в конце процедуры?

При вызове другой процедуры или функции Delphi из (встроенной) сборкикод, что я могу ожидать, что другая функция делать с регистрами?Какие регистры будут восстановлены до их первоначальных значений, а какие нет?

(Очевидно, один и тот же ответ применим к обоим вопросам)

Я предполагаю соглашение о вызовах по умолчанию Delphi.Я знаю, что EAX используется для 32-битных возвращаемых значений.И, глядя на код asm в SysUtils.pas, кажется, что EBX, ESI и EDI выдвигаются и восстанавливаются, а остальные нет.Хотя я не могу найти никакой документации по этому поводу.

Ответы [ 2 ]

11 голосов
/ 24 августа 2010

Три первых аргумента функции приведены в EAX, EDX и ECX соответственно.Дополнительные аргументы помещаются в стек.Для метода объекта указатель Self всегда является (невидимым) первым параметром.Результат должен быть в EAX.Для функций, возвращающих длинные строки, параметр (невидимый) last функции является указателем на результирующую строку (который сам по себе является указателем на первый символ строки).

EBX нельзя изменять (если вы не восстановите его до окончания процедуры / функции), и поэтому не должны ESP, EBP, ESI или EDI. (1) Здесь можно найти отличное введение в встроенный ASM Delphi: http://www.delphi3000.com/articles/article_3766.asp

4 голосов
/ 24 августа 2010

Я не знаю, обновлены ли документы, но вы должны взглянуть на Использование встроенного кода сборки (только для Win32) на вики Embarcardero:

Цитата:

Как правило, правила использования регистров в операторе asm такие же, как и для внешней процедуры или функции.Оператор asm должен сохранять регистры EDI, ESI, ESP, EBP и EBX, но может свободно изменять регистры EAX, ECX и EDX.При входе в оператор asm EBP указывает на текущий кадр стека, а ESP указывает на вершину стека.За исключением ESP и EBP, оператор asm не может предполагать ничего о содержимом регистра при входе в оператор.

...