Какие регистры процессора должны быть восстановлены в конце процедуры asm в Delphi
При написании процедуры или функции Delphi в коде сборки, какие регистры должны быть сохранены и восстановлены до исходного значения в конце процедуры?
При вызове другой процедуры или функции Delphi из (встроенного) кода сборки, что я могу ожидать, что другая функция будет работать с регистрами? Какие регистры будут восстановлены до их первоначальных значений, а какие нет?
(Очевидно, что тот же ответ применим и к обоим вопросам)
Я принимаю соглашение по умолчанию в Delphi. Я знаю, что EAX
используется для 32-битных возвращаемых значений. И, глядя на код asm в SysUtils.pas, кажется, что EBX
, ESI
и EDI
нажаты и восстановлены, а остальные нет. Однако я не могу найти документацию об этом.
Ответы
Ответ 1
Три первых аргумента функции приведены в EAX
, EDX
и ECX
соответственно. Дополнительные аргументы помещаются в стек. Для метода объекта указатель Self
всегда является (невидимым) первым параметром. Результат должен быть в EAX
. Для функций, возвращающих длинные строки, (невидимым) последним параметром функции является указатель на результирующую строку (которая сама по себе является указателем на первый символ строки).
EBX
не следует изменять (если вы не восстановите его до конца процедуры/функции), и поэтому не должны ESP
, EBP
, ESI
или EDI
. (1) Превосходное введение в встроенную ASM Delphi можно найти здесь: http://www.delphi3000.com/articles/article_3766.asp
Ответ 2
Я не знаю, обновлены ли документы, но вы должны взглянуть на Использование внутреннего кода сборки (только для Win32) в Embarcardero Wiki:
Цитата:
В общем, правила использования регистров в операторе asm такие же, как и правила внешней процедуры или функции. Оператор asm должен сохранять регистры EDI, ESI, ESP, EBP и EBX, но может свободно изменять регистры EAX, ECX и EDX. При вводе в оператор asm EBP указывает на текущий стек стека, а ESP указывает на вершину стека. За исключением ESP и EBP, оператор asm ничего не может принять в отношении содержимого регистра при вводе в оператор.