Показать сообщение отдельно
  #9  
Старый 20.11.2015, 20:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

M.A.D.M.A.N., да, я знаю, что foo.tostring(1, 2) <=> TFoo_tostring(foo, 1, 2). Только не разбирался, через что передается Self в данном случае. Понимаю, что прямое следование спецификации fastcall от самих борландов требует передавать его в eax (от МС-а спецификация другая - там только ecx и edx). Однако разумней было бы модифицировать соглашение по аналогии с созданием thiscall и использовать ecx, потому что eax затирается многократно чаще любого другого регистра, а следовательно, Self почти всегда придется дополнительно хранить в другом регистре или памяти.
ТС уже подтвердил, что на деле используется eax. Теперь знаю, что делфийцы не заморачивались такими тонкостями.

a.n.d.r.e.w, как я и думал: mul Pos транслируется в mul cx, и делфа не обращает внимания на то, что cx затирается. А поскольку Pos по мнению делфы не используется, делфа его "оптимизирует", не создавая для него локальную переменную и не сохраняя в ней значение ecx. Впрочем, ничего удивительного.
Для подсчета смещений настоятельно рекомендую заменить этот mul на shl ecx, 2.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием