64-битная встроенная сборка в Delphi XE3

Я столкнулся с этой проблемой, используя 64-битный встроенный ассемблер в Delphi XE3, которого я не понимаю.

Я пробовал это, и он работает как на 32-битных, так и на 64-битных версиях.

function test(a, b: integer): integer; assembler; register;
asm
  mov eax, a
  add eax, edx
end;

Однако это работает только в 32-битном, но не в 64-битном, в 64-битном он компилируется, но не возвращает правильный результат суммы двух целых чисел.

function test(a, b: integer): integer; assembler; register;
asm
  add eax, edx
end;

Я знаю предыдущий код FPU, такой как FLD, STP работает на 32-разрядных версиях, но он будет давать ошибку компиляции на 64-разрядном компиляторе. Есть идеи, как обрабатывать плавающие числа в 64-битном режиме?


person doctorlai    schedule 22.03.2013    source источник
comment
Может ли кто-нибудь дать мне быстрое руководство - это не лучший вопрос о переполнении стека. Более того, код в вопросе использует 32-битные целые числа, но вас действительно интересует код FPU. Что кардинально отличается от 64-битной. Мой самый настойчивый совет - перенести весь ваш ассемблерный код на Паскаль и позволить компилятору делать тяжелую работу.   -  person David Heffernan    schedule 22.03.2013
comment
Вообще-то, приятель! когда вы видите эти вещи, вам просто нужно открыть окно CPU и сравнить, в какие регистры входят параметры. Если вы работаете с ассемблером - тогда отладка на ассемблере - ваш дом! Если нет - то лучше спросите кого-нибудь, кто знает, что такое процессор, регистры и ассемблер.   -  person Arioch 'The    schedule 22.03.2013
comment
@ Arioch: Метод проб и ошибок в отладчике - не способ изучить MS x64 ABI. Официальная документация - как это сделать.   -  person David Heffernan    schedule 22.03.2013
comment
Кстати, в XE2 x64 asm есть ошибки, и некоторые из них до сих пор не исправлены в XE3. Особенно в том числе с использованием 32-битных регистров. Итак, если вы хотите перенести asm-код на x64 - начните с выполнения МНОГО тестов DUnit и немного усвоите asm. Если вы начали использовать x64 asm в Delphi, вы не можете быть уверены, что он сгенерирует правильный код. Обычно да. Но иногда нет.   -  person Arioch 'The    schedule 22.03.2013
comment
@David - официальная документация тоже может ошибаться, особенно EMBA. И смотреть на вывод компилятора - это не что иное, как метод проб и ошибок. Он просто смотрит и видит, как это реализовано. Если хотите, вы можете расширить его до реверс-инжиниринга, но t&e не имеет с этим ничего общего.   -  person Arioch 'The    schedule 22.03.2013
comment
@ Arioch'The Emba не документирует MS x64 ABI. Я не уверен, почему вы хотите использовать для этого документацию Emba. И официальная документация для MS x64 ABI не ошибается. И нет, метод проб и ошибок никогда не должен быть вашим основным источником информации.   -  person David Heffernan    schedule 22.03.2013
comment
@David docwiki.embarcadero.com/RADStudio/XE3/en/Program_Control docwiki.embarcadero.com/RADStudio/XE3/en/ docwiki.embarcadero.com/RADStudio/XE3/en/ Я не вижу здесь ничего о RCX или RAX , ни ссылки на страницу MSDN с полными спецификациями компилятора Delphi. Так что, возможно, вы можете потратить немало времени и погуглить внутри DocWiki тщательно спрятанную мелким шрифтом, ссылающуюся на соглашение MS Win64, а затем погуглить ... Хорошо. Вы можете сделать то же самое, заглянув один или два раза в окно Debug-CPU.   -  person Arioch 'The    schedule 22.03.2013
comment
@ Arioch'The Действительно. Как я уже сказал, Emba не документирует ABI для MS x64. Зачем им? На MS x64 есть единый ABI. Если вы думаете, что можете изучить его всесторонне, методом проб и ошибок, тогда это нормально. Я не думаю, что это лучший способ чему-то научиться.   -  person David Heffernan    schedule 22.03.2013
comment
›Emba не документирует MS x64 ABI. Может, мне также стоит поискать в документации IBM спецификации компилятора EMBA? Или, может быть, Oracle / Sun? Или документы GCC? эти производители компиляторов ничем не хуже Microsoft. ЕДИНСТВЕННАЯ официальная документация для компилятора EMBA - это документация EMBA.   -  person Arioch 'The    schedule 22.03.2013
comment
@David EMBA должен задокументировать свой компилятор. Если они хотят сослаться на MSDN - они должны это СДЕЛАТЬ. А затем я открывал страницу DocWiki, щелкал ссылку MSDN и с удовольствием читал документы Microsoft, как Win64 ABI передает AnsiString и TCustomForm. Хм, может быть, вы видели эту ссылку на страницах DocWiki, о которых я упоминал выше? И, может быть, вы знаете, где находится документ Micorosoft, передающий AnsiString в Win64? Кстати, EMBA задокументировала OffsetRect, несмотря на то, что это функция Win32 API. Зачем, если они не должны повторять MSDN с ваших слов?   -  person Arioch 'The    schedule 22.03.2013
comment
@ Arioch'The Не похоже, чтобы вас заботила документация. Вы, кажется, думаете, что метод проб и ошибок лучше.   -  person David Heffernan    schedule 22.03.2013
comment
! -й раз вы могли неправильно прочитать. Теперь ты врешь. Я не предлагал проб и ошибок. И я тебе это уже сказал. Вы делаете вид, что не можете отличить чтение примера кода от слепых случайных проб, но я на это не куплюсь.   -  person Arioch 'The    schedule 22.03.2013
comment
Да, учитывая качество документов EMBA, я склонен перепроверять все, что нашел там, и никогда не задумываюсь, нечего ли найти. И когда мне нужно было перенести эти функции - я, конечно, начал с DocWiki и, конечно же, НИЧЕГО не нашел там, как и вы. А потом я начал отлаживать и гуглить. И, наконец, я получил ту самую страницу WIKIPEDIA, на которую MBo ссылается ниже. Но я не виноват, что EMBA не задокументировала свой компилятор. ВИКИПЕДИЯ, даже не MSDN.   -  person Arioch 'The    schedule 22.03.2013
comment
@ Arioch'Документация находится здесь: msdn.microsoft.com/en-us/ библиотека / ms235286.aspx   -  person David Heffernan    schedule 22.03.2013
comment
@DoctorLai, это не плохой вопрос по своей сути, но вы неправильно его сформулировали. В частности, вы должны подробно объяснить, что вы имеете в виду под словом «не работать».   -  person Igor Skochinsky    schedule 22.03.2013
comment
@ Игорь спасибо. Я редактировал вопрос.   -  person doctorlai    schedule 22.03.2013
comment
Спасибо, теперь намного лучше!   -  person Igor Skochinsky    schedule 22.03.2013
comment
@David хорошая ссылка, но я не вижу там ссылки на Delphi. Я также не могу найти наборы, строки, TObject и TCLass на msdn.microsoft.com/ en-us / library / 02c56cw3.aspx И затем я поискал в Google link:msdn.microsoft.com/en-us/library/ms235286.aspx site:docwiki.embarcadero.com и ... снова ничего не нашел. Кажется, нет ДОКУМЕНТАЦИИ о том, что программы Delphi должны полагаться на эту страницу MSDN. Единственная ОФИЦИАЛЬНАЯ документация для Delphi находится в DocWiki. Если его нет, значит, его нет. И чтение, не связанное с Delphi MSDN, - это не меньший метод проб и ошибок, чем просмотр отладчика Delphi.   -  person Arioch 'The    schedule 22.03.2013
comment
@David, извини за резкость выше, но находя в устах чьи-то слова о чуши, которую я не писал, больно.   -  person Arioch 'The    schedule 22.03.2013
comment
@ Arioch'The Какие слова я вложил в твой рот? Вы предложили изучить ABI, проверив представление реестра в отладчике. Это метод проб и ошибок в моей книге. Проблема с таким подходом в том, что вы никогда не узнаете, нашли ли вы все угловые случаи. Вам также будет очень сложно понять проблемы выравнивания стека x64 ABI. Не говоря уже об обработке исключений на основе таблиц. ABI сложны, и я просто не согласен с вами, что проверка представления реестра в отладчике является подходящим способом их изучения.   -  person David Heffernan    schedule 22.03.2013
comment
Итак, испытание компилирует функцию за вас, хорошо. Но как в вашей книге чтение примеров источников или чтение справочного кода квалифицируется как ошибка? обработка исключений сложна, но как это связано с соглашением о вызовах? Процедуры настолько сложны, что их парамлист превышает количество свободных регистров Win64 ... Эти процедуры, ИМХО, в любом случае подлежат рефакторингу, и, особенно, очень мало причин превращать их в ассемблер. Возможности ASM должны быть небольшими и простыми, что подразумевает довольно ограниченный список параметров. Конечно, чтение документации лучше, чем обратная инженерия, но EMBA этого не сделала.   -  person Arioch 'The    schedule 23.03.2013
comment
Все, что вам нужно, - это документ MSDN, с которым я связался, и знание неявных параметров Delphi. Самостоятельно прошло как первый параметр. Результат передан как окончательный параметр var. И знание того, что ссылочные типы передаются как указатели.   -  person David Heffernan    schedule 23.03.2013
comment
Документация MSDN не связана с Delphi. Связывание их - это метод проб и ошибок, против которого вы так говорили. То же самое касается применения знаний Delphi x86 к Delphi x64.   -  person Arioch 'The    schedule 26.03.2013
comment
кстати, код asm FPU компилируется в Delphi x64, но я рекомендую вам трогать его, только если вы точно знаете, что делаете   -  person PhiS    schedule 02.04.2013


Ответы (1)


Это связано с тем, что в 64-битной системе используется собственное соглашение о вызовах, и эти параметры находятся в RCX и Регистры RDX. Дополнительные пояснения в MSDN.

Об обработке плавающих чисел - прочтите документацию для разработчиков Intel..

person MBo    schedule 22.03.2013