|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.08.2022, 17:38 | #1 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 627
|
Всегда ли одинаковый порядок регистров
Делаю я, например, вот такой вот вызов процедуры
Код:
In1 - al out1 - edx out2 - ecx Вопрос: всегда ли при вызове этой процедуры будут в таком порядке располагаться переменные в регистрах? Могу ли я сразу обращаться к регистрам, не перенося данные из них никуда? Последний раз редактировалось Kronos913; 26.08.2022 в 17:42. |
26.08.2022, 17:43 | #2 | |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Пока не изменится соглашение вызова.
Цитата:
http://docwiki.embarcadero.com/RADSt...ter_Convention |
|
26.08.2022, 17:48 | #3 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Можете. Только надо следить за тем, что не только порядок регистров важен, но и их длина. В типе вызова register всегда используются регистры eax, edx, ecx для первых трех параметров в этом порядке. Расширение аргументов до 32-х бит уже выполнено и то, что вы определили как byte уже расширено и занимает весь eax
|
26.08.2022, 17:51 | #4 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Это соглашение может измениться разве что при изменении архитектуры или платформы. Например, fastcall в x86_64 для первых 4-х параметров использует регистры rcx, rdx, r8, r9, но при передачи float/double значений эти же аргументы перемещаются в xmm регистры.
|
26.08.2022, 17:52 | #5 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 627
|
Код:
Есть ли риск ошибок при запуске на другом пк (с другой версией винды, или другом процессором), или при компиляции на другой версии Delphi ? |
26.08.2022, 17:57 | #6 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
mov ah, 0 - лишняя. Я же сказал, что byte уже расширили до dword. А учитывая, что byte - без знаковая, то и расширение было без знаковое (т.е. обнуление старших 24 бит).
Код:
Риск есть всегда. Но пока компилятор следует этому типу вызова, то ошибок не будет. Вам же наверняка уже попадались программы не работающие уже даже на Win10, но работавшие на Win7 или WinXP и даже не хочу вспоминать про Win9x (типичный пример 16-битные консольные приложения) Последний раз редактировалось macomics; 26.08.2022 в 18:06. |
26.08.2022, 19:28 | #7 | |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 627
|
Цитата:
|
|
26.08.2022, 19:30 | #8 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Если вы вместо byte передаете int и отключена проверка на диапазоны, тогда надо. Но если исходное значение у вас определено как переменная типа byte, тогда обнуление будет сделано за вас перед передачей параметра.
|
26.08.2022, 19:56 | #9 |
Форумчанин
Регистрация: 10.02.2021
Сообщений: 627
|
Раз уж на то пошло, насколько оптимален этот код?
Код:
|
26.08.2022, 20:27 | #10 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Не очень оптимален. Не забывайте, что для этой процедуры компилятор должен будет еще дополнительно вычислить адреса 3 указателей на переменные типа byte. С точке зрения оптимальности лучше всего использовать конструкцию
Код:
Т.е. этот код будет делать примерно это Код:
Последний раз редактировалось macomics; 26.08.2022 в 20:53. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
одинаковый текст оказался разным | HellMercenariess | PHP | 4 | 06.08.2012 22:59 |
Одинаковым данным-одинаковый номер! | Любопытная | Microsoft Office Excel | 16 | 03.08.2011 10:16 |
одинаковый код в процедурах | jungle | Помощь студентам | 7 | 26.11.2008 22:45 |
Всегда позади и всегда впереди в одном приложении | Legat | Win Api | 4 | 27.10.2007 15:48 |