Компилятор не хочет генерировать относительный короткий джамп, даже когда ему явно указан постфикс short. Почему? Разные настройки оптимизации пробовал(хотя по-моему никакие оптимизации не должны влиять на ассемблерные процедуры). У меня процедура из 1.5 тыс строк кода на ассемблере, так в ней компилятор не сгенерировал ни одного короткого джампа, все с абсолютным адресом! Для меня это оч. важно, так как существенен размер кода(портирую с делфи). Я в панике.
Вот пример:
sub eax,dword ptr [esp]
add esp,04h
cmp eax,0FFFh
jbe short @not_traced // JBE 0xABSOLUTE_ADDRESS - WHY???!!!
popad
popad
retn
@not_traced:
Есть идеи, в чем может быть дело? Использую lazarus c fpc 2.2.2.
Спасибо.
Исправляюсь: на самом деле компилятор генерит ОТНОСИТЕЛЬНЫЕ джампы, но с 32ух-битным смещением.... т.е. не jmp short а jmp near. Тем не менее, проблема остается, нужен-то jmp short с 8-и битным смещением!
Компилятор ассемблера не хочет генерировать jmp short
Модератор: Модераторы
Компилятор ассемблера не хочет генерировать jmp short
Последний раз редактировалось kitovyj 22.10.2008 18:07:19, всего редактировалось 1 раз.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Дело, надо полагать, в том, что никто никогда не занимался этим вопросом.
И если говорить о размере кода, то эти переходы - последний из источников неоптимальности.
Можно попробовать скомпилить с использованием внешнего ассемблера, может быть в этом случае он модификатор не выкинет.
И если говорить о размере кода, то эти переходы - последний из источников неоптимальности.
Можно попробовать скомпилить с использованием внешнего ассемблера, может быть в этом случае он модификатор не выкинет.
Да, попробую заюзать внешний ассемблер. Запостю баг на багтрекер фрипаскаля. Спасибо.
