Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Как включить "длинные" прыжки в МАСМе?
Посл.ответ Сообщение

Ранг: 42.4 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2006 08:44
· Личное сообщение · #1

Как включить "длинные" прыжки в МАSМе? Когда надо написать длинный loop, он начинает матюгаться на слишком длинный джамп. Можно ли дать какой-то параметр или дать директиву, чтобы это вылечить?



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 20 апреля 2006 08:53
· Личное сообщение · #2

Длинного loop'a не бывает. А джампы масм сам определыяет: где можно ставит short.

-----
Я медленно снимаю с неё UPX... *FF_User*





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 21 апреля 2006 02:33
· Личное сообщение · #3

для большого цикла используй проверку условия конца цикла и условный переход

например, так:

loop1:
<...>
dec ecx
jnz loop1

-----
EnJoy!





Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

Создано: 21 апреля 2006 06:27
· Личное сообщение · #4

2 Jupiter:
Ты думаешь если LOOP изменить на Zcc, то прыжок станет длиннеее ? )

2 killsniper:
Можно предложить только один вариант с длинным переходом:

@loop:
<...>
dec ecx
jz @end_loop
jmp @loop
@end_loop:
<...>




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 21 апреля 2006 06:44
· Личное сообщение · #5

dermatolog пишет:
Ты думаешь если LOOP изменить на Zcc, то прыжок станет длиннеее ?

ты мой пример вообще смотрел?!

-----
EnJoy!




Ранг: 1.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 апреля 2006 07:41
· Личное сообщение · #6

killsniper
Включаются длинные прыжки, добавлением модификатора “far ptr”.
jmp far ptr metka1-длинный прыжок на расстояние более 128 байт и менее 64 Кбайт.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 21 апреля 2006 13:00
· Личное сообщение · #7

dermatolog пишет:
Ты думаешь если LOOP изменить на Zcc,

Кроме опкодов 0х74 0х75 (jz jne short),
есть опкоды 0х0f 0х84 и 0х0f 0х85 - 32-битные аналоги.
Перед ними hiew еще 0х66 вставляет, но вроде это не всегда нужно.



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 апреля 2006 17:38
· Личное сообщение · #8

Ну насчет 0x66 оно понятно - распознавание аргумента как 32-битного, а hiew по дефолту в 16-разрядный код ассемблирует



Ранг: 42.4 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 22 апреля 2006 17:48
· Личное сообщение · #9

Пасибо. А смысл "коротких" в чём? Быстрее работает, что ли? (Конвейер там забивать не надо, или что-то подобное?) Но мне на это пох., т.к. вывод в окно на API до того тормозной, что полученные таким путём выгоды мигом сойдут на нет.

Я избавлялся от этого, запихивая код в отдельную процедуру. Но процедура - это опять же вызов.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 22 апреля 2006 20:08 · Поправил: Bitfry
· Личное сообщение · #10

killsniper пишет:
А смысл "коротких" в чём?

1. Объём кода меньше.
2. По сути выполняется элементарная команда: "add eip,??", очевидно, что она должна быть быстрее, чем "mov eip, ????????".
3. Код в памяти не обязательно должен быть привязан к ImageBase (в тех же dll). Короткие переходы не нуждаются в переназначениях. Напротив, большое количество релоков увеличивает время загрузки, объём памяти и вероятные глюки.

ЗЫ Тему можно закрывать?

-----
Всем привет, я вернулся




Ранг: 77.7 (постоянный), 1thx
Активность: 0.040
Статус: Участник

Создано: 22 апреля 2006 23:39
· Личное сообщение · #11

Bitfry пишет:
Короткие переходы не нуждаются в переназначениях. Напротив, большое количество релоков увеличивает время загрузки, объём памяти и вероятные глюки.

3. длинные тоже не нуждаются, и релоков не образуют.
а вот 1. и 2. - это да, код короче и быстрее.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 23 апреля 2006 09:44 · Поправил: tundra37
· Личное сообщение · #12

Bitfry пишет:
большое количество релоков увеличивает время загрузки

Максимум на 0.5 секунды и то надо постараться. В большинстве случаев экзешник
грузится по ImageBase и релоки вообще не обрабатываются
Загрузка dll и импорт вот это да - увеличивает.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 23 апреля 2006 10:44 · Поправил: Bitfry
· Личное сообщение · #13

Да уж, что-то я тупеть начинаю от подобных обсуждений =)
Скоро буду только ходить и ругаться как MC707. =)

killsniper пишет:
Как включить "длинные" прыжки в МАSМе? Когда надо написать длинный loop, он начинает матюгаться на слишком длинный джамп. Можно ли дать какой-то параметр или дать директиву, чтобы это вылечить?


Как всегда, задающий вопрос не понимает, что он спрашивает.
Если бы ты заглянул в любую приличную доку, или учебник, подобных вопросов не было бы (RTFM и мне в том числе =).

В MASM'e смотрим файлик OPCODES.HLP.

Узнаём, что вообще есть у процессора:
- короткие условные переходы - shot jcc (опкод - один байт, операнд адресации – один байт),
при совпадении условия действие: add eip, 2 (длинна команды), а затем add eip, ??;
- близкие условные переходы - near jcc (опкод – два байта, операнд адресации – слово/двойное слово),
при совпадении условия действие: add eip, 6, а затем add eip, ???? или ????????;

- короткий цикл - short loop (опкод E2)
при CX=0 действие: add eip, 2, а затем add eip, ??;

Дальними (far) бывают только безусловные переходы (jmp far), вызовы (call far) и т.д.

ufo_maniac пишет:
3. длинные тоже не нуждаются, и релоков не образуют.

Никаких "длинных" я там не видел.
И вообще, отвечал на другой вопрос... Честно говоря, забыл, как они называются по-русски - эти near =).

-----
Всем привет, я вернулся




Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 23 апреля 2006 12:58
· Личное сообщение · #14

Дальние переходы (far jump и far call) - переходы между сегментами. В качестве операнда указывается адрес пары сегмент:смещение. В виндосе крайне редко имеют смысл.



Ранг: 42.4 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 23 апреля 2006 19:17
· Личное сообщение · #15

Bitfry пишет:
Код в памяти не обязательно должен быть привязан к ImageBase (в тех же dll). Короткие переходы не нуждаются в переназначениях. Напротив, большое количество релоков увеличивает время загрузки, объём памяти и вероятные глюки.

А отсюда можно поподробнее, или ссылочку? Мы этого ещё не изучали...

tundra37 пишет:
Максимум на 0.5 секунды и то надо постараться

Насколько я понимаю, это ОЧЕНЬ НЕЗНАЧИТЕЛЬНО, только если экзешник не будет N раз выгружаться и грузиться по новой. К временной сложности подобная вещь добавляет константу, а если речь о 1-2 секундах, это ну никак не принципиально.

Bitfry пишет:
Узнаём, что вообще есть у процессора:
- короткие условные переходы - shot jcc (опкод - один байт, операнд адресации – один байт),
при совпадении условия действие: add eip, 2 (длинна команды), а затем add eip, ??;
- близкие условные переходы - near jcc (опкод – два байта, операнд адресации – слово/двойное слово),
при совпадении условия действие: add eip, 6, а затем add eip, ???? или ????????;
- короткий цикл - short loop (опкод E2)
при CX=0 действие: add eip, 2, а затем add eip, ??;

Спаибо, понял.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 25 апреля 2006 07:04
· Личное сообщение · #16

killsniper пишет:
А отсюда можно поподробнее, или ссылочку? Мы этого ещё не изучали...

Сам всё в отладчике тыкаю.
Про релоки я тебя запутал, если речь идёт о коротких или ближних переходах, то от них переназначений не будет.
Почитай:
http://exelab.ru/art/?action=view&id=204#21
должно помочь.

Главное сразу понять, что такое относительный адрес.
Относительные адреса отсчитываются от какой-то базы (у абсолютных адресов база = 0).
В случае с короткими или ближними переходами базой является адрес следующего байта после команды.
Поэтому даже в dll никакие релоки здесь не нужны. А вот far...
S_T_A_S_ пишет:
В виндосе крайне редко имеют смысл.

Сейчас поискал – действительно, даже примера jmp far найти не могу.

-----
Всем привет, я вернулся




Ранг: 42.4 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 28 апреля 2006 04:53
· Личное сообщение · #17

Благодарствую.


 eXeL@B —› Программирование —› Как включить "длинные" прыжки в МАСМе?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати