Логический шрифт

Логический шрифтИсправляем некорректное отображение кириллицыИтак, вы сделали перевод любимой программы на русский язык, создали локализованный
  1. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167

    Nexus, подожди, не кипятись. Обрати внимание, я вместо инструкции MOV DWORD PTR [ESP+93],1, использую инструкцию MOV BYTE PTR [ESP+93],1. Она на три байта короче предыдущей за счет указания другого типа данных. Тип DWORD нуждается в 4-х байтах, а BYTE - всего лишь в одном байте. С таким же успехом можно задать набор символов RUSSIAN_CHARSET, записав вместо 1h значение CCh:MOV BYTE PTR [ESP+93],0СС. Нет нужды использовать тип данных "двойное слово", если нужно изменить всего лишь один байт. Экономия в три байта это вполне существенно, особенно при не хватке или отсутствии достаточно свободного места. Мне тоже попадались программы, где свободного места в конце секции кода не было вообще, и, конечно, приходилось выкручиваться описанными тобой способами.

    В данном конкретном случае можно обойтись без переноса кода. Нужно всего лишь немного подумать. Смотрим код:



    По адресу 00404026 находится инструкция MOV DWORD PTR [ESP+7С],0Е. Её можно изменить на MOV BYTE PTR [ESP+7С],0Е, т.к. ранее область памяти под характеристики шрифта была очищена (заполнена нулями). Таким образом получим выигрыш в три байта. Далее, по адресам 00404010 - 00404020 идет побайтовая запись строки с названием шрифта. Это все можно заменить двумя инструкциями. В итоге код программы примет следующий вид:



    Как видишь, по адресу 00404038 у нас еще один байт лишний остался. Но полученный код делает все тоже самое, что и оригинальный, но кроме него добавлена еще одна инструкция по установке набора символов (по адресу 00404030). Если нужна кириллица, то замени в ней значение 1h на CCh. Еще раз посмотри: мы ничего и никуда не переносили, только переделали участок кода.
    Сообщение отредактировал 29 июля 2018 - 18:19

    Кто ищет, тот всегда найдет!

    31 мая 2015 - 11:26 / #21
  2. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167

    Nexus, подожди, не кипятись. Обрати внимание, я вместо инструкции MOV DWORD PTR [ESP+93],1, использую инструкцию MOV BYTE PTR [ESP+93],1. Она на три байта короче предыдущей за счет указания другого типа данных. Тип DWORD нуждается в 4-х байтах, а BYTE - всего лишь в одном байте. С таким же успехом можно задать набор символов RUSSIAN_CHARSET, записав вместо 1h значение CCh:MOV BYTE PTR [ESP+93],0СС. Нет нужды использовать тип данных "двойное слово", если нужно изменить всего лишь один байт. Экономия в три байта это вполне существенно, особенно при не хватке или отсутствии достаточно свободного места. Мне тоже попадались программы, где свободного места в конце секции кода не было вообще, и, конечно, приходилось выкручиваться описанными тобой способами.

    В данном конкретном случае можно обойтись без переноса кода. Нужно всего лишь немного подумать. Смотрим код:



    По адресу 00404026 находится инструкция MOV DWORD PTR [ESP+7С],0Е. Её можно изменить на MOV BYTE PTR [ESP+7С],0Е, т.к. ранее область памяти под характеристики шрифта была очищена (заполнена нулями). Таким образом получим выигрыш в три байта. Далее, по адресам 00404010 - 00404020 идет побайтовая запись строки с названием шрифта. Это все можно заменить двумя инструкциями. В итоге код программы примет следующий вид:



    Как видишь, по адресу 00404038 у нас еще один байт лишний остался. Но полученный код делает все тоже самое, что и оригинальный, но кроме него добавлена еще одна инструкция по установке набора символов (по адресу 00404030). Если нужна кириллица, то замени в ней значение 1h на CCh. Еще раз посмотри: мы ничего и никуда не переносили, только переделали участок кода.
    Сообщение отредактировал 6 февраля 2017 - 16:07

    Кто ищет, тот всегда найдет!

    31 мая 2015 - 11:26 / #22
  3. Оффлайн

    gazon01

    Звание: Ветеран

    Команда

    Сообщений: 1211

    Создано тем: 39

    Рейтинг: 8

    Репа: (42|41|-1)

    Баллы: 86

    Был: 2018-12-02 14:30

    Лайков: 18

    LesergNexus,  это уже высшая математика, нам простым смертным да такого очень далекоwink

    Возможно всё! На невозможное просто требуется больше времени.
    Мудрец из Шангри Ла

    31 мая 2015 - 21:45 / #23
  4. Оффлайн

    dinis124

    Звание: Бывалый

    Проверенные

    Сообщений: 290

    Создано тем: 13

    Рейтинг: 4

    Репа: 0

    Баллы: 51

    Был: 2020-05-02 14:08

    Лайков: 4

    Leserg, Nexus


    Приходилось или удлинять секцию кода...


    А программой Topo v1.2 можно решать такие проблемы?
    Сообщение отредактировал 27 января 2021 - 14:01
    1 июня 2015 - 00:01 / #24
  5. Оффлайн

    Nexus

    Забанен

    Сообщений: 611

    Создано тем: 20

    Репа: 0

    Баллы: 0

    Был: 2022-07-03 23:07

    Лайков: 7

    Leserg, ты допустил ошибку что похерил цикл побайтовой записи строки с названием шрифта Arial. Теперь программа не воспринимает название шрифта и выдает на экран тот, который стоит по умолчанию в системе пользователя. Попробуй после своей модификации поменять название шрифта Arial на Arial Black. В результате ничего не поменяется. А в оригинальном файле текст в окне About будет написан жирным шрифтом. В чем же причина? Причина в том, что на стек нужно запсывать собственно название шрифта, а после твоей правки на стек записывается адрес, где лежит название шрифта. В результате API функция CreateFont считывает какую-то белиберду вместо названия шрифта, ищет его в системе, естественно не находит и выставляет систеный шрифт по умолчанию, смотря у кого какой установлен.
    Единственное место где можно подоптимизировать - это поменять MOV DWORD PTR [ESP+8C], 320 на MOV WORD PTR [ESP+8C], 320. Выигрыш будет еще в один байт. Дело в том, что DWORD - это 4 байта, а число 320 - это два байта, поэтому поставим WORD,т.е. двухбайтовое выражение. Только толку от такой оптимизации все равно никакой...
    Цитата: gazon01
    Leserg, Nexus,  это уже высшая математика, нам простым смертным да такого очень далеко


    Фигней страдаем biggrin
    1 июня 2015 - 00:07 / #25
  6. Оффлайн

    Nexus

    Забанен

    Сообщений: 611

    Создано тем: 20

    Репа: 0

    Баллы: 0

    Был: 2022-07-03 23:07

    Лайков: 7

    Leserg, ты допустил ошибку что похерил цикл побайтовой записи строки с названием шрифта Arial. Теперь программа не воспринимает название шрифта и выдает на экран тот, который стоит по умолчанию в системе пользователя. Попробуй после своей модификации поменять название шрифта Arial на Arial Black. В результате ничего не поменяется. А в оригинальном файле текст в окне About будет написан жирным шрифтом. В чем же причина? Причина в том, что на стек нужно запсывать собственно название шрифта, а после твоей правки на стек записывается адрес, где лежит название шрифта. В результате API функция CreateFont считывает какую-то белиберду вместо названия шрифта, ищет его в системе, естественно не находит и выставляет систеный шрифт по умолчанию, смотря у кого какой установлен.
    Единственное место где можно подоптимизировать - это поменять MOV DWORD PTR [ESP+8C], 320 на MOV WORD PTR [ESP+8C], 320. Выигрыш будет еще в один байт. Дело в том, что DWORD - это 4 байта, а число 320 - это два байта, поэтому поставим WORD,т.е. двухбайтовое выражение. Только толку от такой оптимизации все равно никакой...
    Цитата: gazon01
    Leserg, Nexus,  это уже высшая математика, нам простым смертным да такого очень далеко


    Фигней страдаем biggrin
    Сообщение отредактировал 27 января 2021 - 14:03
    1 июня 2015 - 00:07 / #26
  7. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167

    Цитата: Nexus;16429
    Фигней страдаем



    Ага, и не говори. Он даже gazon01"у стало интересно, чем это мы тут занимаемся. Там гляди народ потянется и больше не будет проблемы под названием "кракозябры". Надо почаще такие диспуты устраивать. biggrin_mini2

    Цитата: dinis124
    А программой Topo v1.2 можно решать такие проблемы?


    Я не знаю, никогда такой программой не пользовался. Вообще весь мой опыт по удлинению секций сводился к дописыванию нулевых байтиков в конце файла при помощи НЕХ-редактора.
    Сообщение отредактировал 29 июля 2018 - 18:20

    Кто ищет, тот всегда найдет!

    2 июня 2015 - 00:43 / #27
  8. Оффлайн

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167

    Цитата: Nexus
    Leserg, ты допустил ошибку




    Твоя правда. Тогда можно сделать так:



    В этом случае тоже, ничего и никуда переносить не нужно. 002
    Для адресации используем адрес из регистра ECX, который в текущий момент там находится. Тогда смещение будет меньше значения 7F, что уменьшит длину инструкций. Также не забываем оперировать типами данных (BYTE, WORD, DWORD).

    Цитата: Nexus
    Фигней страдаем




    Ага, и не говори. Он даже gazon01"у стало интересно, чем это мы тут занимаемся. Там гляди народ потянется и больше не будет проблемы под названием "кракозябры". Надо почаще такие диспуты устраивать. 012

    Цитата: dinis124
    А программой Topo v1.2 можно решать такие проблемы?



    Я не знаю, никогда такой программой не пользовался. Вообще весь мой опыт по удлинению секций сводился к дописыванию нулевых байтиков в конце файла при помощи НЕХ-редактора.
    Сообщение отредактировал 6 февраля 2017 - 16:14

    Кто ищет, тот всегда найдет!

    2 июня 2015 - 00:43 / #28
  9. Оффлайн

    aNNiPAk

    Звание: Прибывший

    Участники

    Сообщений: 8

    Создано тем: 0

    Рейтинг: 1

    Репа: 0

    Баллы: 51

    Страна: не указана!

    Был: 2017-03-02 16:46

    Может кто помочь исправить кракозябры https://yadi.sk/d/5y-g6KHLmhuwR

    Перевод не получился на тебя .. свалился...

    6 января 2016 - 17:33 / #29
  10. Оффлайн

    Nexus

    Забанен

    Сообщений: 611

    Создано тем: 20

    Репа: 0

    Баллы: 0

    Был: 2022-07-03 23:07

    Лайков: 7

    aNNiPAk, Просьба ни о чем. Да и не в нужной теме. Так что какой вопрос, такой и ответ - 0.
    7 января 2016 - 01:22 / #30

Статистика форума, пользователей онлайн: 0 (за последние 20 минут)

---
Создано тем
1197
Всего сообщений
15762
Пользователей
18014
Новый участник
Markhabayev