Сейчас на форуме: hgdagon, asfa, bartolomeo (+6 невидимых) |
eXeL@B —› Программирование —› Как включить "длинные" прыжки в МАСМе? |
Посл.ответ | Сообщение |
|
Создано: 20 апреля 2006 08:44 · Личное сообщение · #1 |
|
Создано: 20 апреля 2006 08:53 · Личное сообщение · #2 |
|
Создано: 21 апреля 2006 02:33 · Личное сообщение · #3 |
|
Создано: 21 апреля 2006 06:27 · Личное сообщение · #4 |
|
Создано: 21 апреля 2006 06:44 · Личное сообщение · #5 |
|
Создано: 21 апреля 2006 07:41 · Личное сообщение · #6 |
|
Создано: 21 апреля 2006 13:00 · Личное сообщение · #7 |
|
Создано: 21 апреля 2006 17:38 · Личное сообщение · #8 |
|
Создано: 22 апреля 2006 17:48 · Личное сообщение · #9 Пасибо. А смысл "коротких" в чём? Быстрее работает, что ли? (Конвейер там забивать не надо, или что-то подобное?) Но мне на это пох., т.к. вывод в окно на API до того тормозной, что полученные таким путём выгоды мигом сойдут на нет. Я избавлялся от этого, запихивая код в отдельную процедуру. Но процедура - это опять же вызов. |
|
Создано: 22 апреля 2006 20:08 · Поправил: Bitfry · Личное сообщение · #10 killsniper пишет: А смысл "коротких" в чём? 1. Объём кода меньше. 2. По сути выполняется элементарная команда: "add eip,??", очевидно, что она должна быть быстрее, чем "mov eip, ????????". 3. Код в памяти не обязательно должен быть привязан к ImageBase (в тех же dll). Короткие переходы не нуждаются в переназначениях. Напротив, большое количество релоков увеличивает время загрузки, объём памяти и вероятные глюки. ЗЫ Тему можно закрывать? ----- Всем привет, я вернулся |
|
Создано: 22 апреля 2006 23:39 · Личное сообщение · #11 |
|
Создано: 23 апреля 2006 09:44 · Поправил: tundra37 · Личное сообщение · #12 |
|
Создано: 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 =). ----- Всем привет, я вернулся |
|
Создано: 23 апреля 2006 12:58 · Личное сообщение · #14 |
|
Создано: 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, ??; Спаибо, понял. |
|
Создано: 25 апреля 2006 07:04 · Личное сообщение · #16 killsniper пишет: А отсюда можно поподробнее, или ссылочку? Мы этого ещё не изучали... Сам всё в отладчике тыкаю. Про релоки я тебя запутал, если речь идёт о коротких или ближних переходах, то от них переназначений не будет. Почитай: http://exelab.ru/art/?action=view&id=204#21 должно помочь. Главное сразу понять, что такое относительный адрес. Относительные адреса отсчитываются от какой-то базы (у абсолютных адресов база = 0). В случае с короткими или ближними переходами базой является адрес следующего байта после команды. Поэтому даже в dll никакие релоки здесь не нужны. А вот far... S_T_A_S_ пишет: В виндосе крайне редко имеют смысл. Сейчас поискал – действительно, даже примера jmp far найти не могу. ----- Всем привет, я вернулся |
|
Создано: 28 апреля 2006 04:53 · Личное сообщение · #17 |
eXeL@B —› Программирование —› Как включить "длинные" прыжки в МАСМе? |