· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› кодогенерация и фасм

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июн 21, 2004 15:45:08

Известно, что некоторые инструкции проца могут быть двояко закодированы (в смысле 2мя способами). Так вот заметил, что если взять прогу и откомпилить ее фасмом 2 раза подряд, то некоторые места ее будут различаться.
Теперь собственно вопрос: можно ли как-нибудь управлять этим процессом, т.е. чтобы я заранее знал, как он (фасм)зокодирует ту или иную инструкцию.

ЗЫ. Похоже с масмом похожая ситуация.


Дата: Июн 21, 2004 20:16:23

Вероятно, используются макросы? Если просто чистый код, то это что-то странное. У меня ниразу такого не было. Хотя, иногда в коде указываю je/jne, а Оля говорит, что там jz/jnz.. Думается, это можно пофиксить изучением техники оптимизации, хотя все-равно могут быть разногласия. Для полной уверенности можно изучить кодогенератор фасма, но надо ли?


Дата: Июн 21, 2004 20:32:11

n0p
Хотя, иногда в коде указываю je/jne, а Оля говорит, что там jz/jnz
У этих микроинструкций один опкод. Откуда Оле знать какой мнемоник уместнее применить? Хотя, конечно, всегда можно исправить вручную. jekyll спрашивает о противоположной ситуации.

jekyll
Известно, что некоторые инструкции проца могут быть двояко закодированы
И даже тремя и т.д. Какие инструкции имеются в виду?

если взять прогу и откомпилить ее фасмом 2 раза
В два прохода? Тогда имеет место оптимизация, т.е. замена длинных переходов на короткие и т.д.


Дата: Июн 21, 2004 20:57:27

Quantum
Хмм.. Заглянул в Большой мануал и убедился..
Ну тогда, как я и предполагал, фиксится более брутальной оптимизацией.


Дата: Июн 21, 2004 21:13:20

Quantum
Какие инструкции имеются в виду?
Я точно не помню, надо мануал от интела поднять. Если я не ошибаюсь там от какого-то бита все зависит, вроде w называеться. Но это не суть дела.
В два прохода? Тогда имеет место оптимизация, т.е. замена длинных переходов на короткие и т.д.
Да нет, количество проходов может быть и 4 и 6 и 8 и ...

Вопрос в том, что берем прогу и компилим, получаем екзешник с одними опкодами, переименовываем его в что нибудь, компилим еще раз - разница бывает в 2 - 4 байта, все зависит от размера программы, и от количества тех инструкций, которые можно двояко кодировать.


Дата: Июн 21, 2004 21:47:16

Quantum
> В два прохода? Тогда имеет место оптимизация, т.е. замена длинных переходов на короткие и т.д.

А ты не путаешь fasm с tasm'ом? Помоему fasm количество проходов выбирает сам и это скрыто от программиста ;-)


Дата: Июн 21, 2004 22:21:05 · Поправил: jekyll

Asterix
А ты не путаешь fasm с tasm'ом?
Э........ а что такое tasm? =)))
Помоему fasm количество проходов выбирает сам и это скрыто от программиста ;-)
Так и есть, но количество он пишет! =)

Ладно, я разобрался, сжался в комок и приготовился к тотальному избиению. Мне бы на смещения взглянуть, а я - ох какой крутой компилер, такие фокусы выдает :)
Вобщем ламер я поганый, это в PE время компиляции менялось.

Хотя теоретически я мог быть прав, но лезть в сырцы фасма лень, думаю что там каждая инструкция жестко закодирована, поэтому из 2х или даже из 3х случаев кодирования инструкции он не выбирает, а жаль.


Дата: Июн 21, 2004 22:48:49

> думаю что там каждая инструкция жестко закодирована, поэтому из 2х или даже из 3х случаев кодирования инструкции он не выбирает, а жаль.

Как же.. как же.. с подачи S.T.A.S.'а он по разному кодирует команду test ;-)

> Так и есть, но количество он пишет! =)
Это где он пишет, это "4 passes" в моём скрине что ли ;-)

_984755728__fasm.png


Дата: Июн 22, 2004 00:59:02

Asterix
ага

а насчет test я забыл -) хотя на форума фасма читал


Дата: Июн 22, 2004 02:21:59

Asterix
А ты не путаешь fasm с tasm'ом?
Нет, их даже сравнить страшно, не то что спутать :-)


Дата: Июн 22, 2004 15:14:36

От этой заморочки с TEST Privalov отказался - некоторым не понравилось (или не поняли они).
Хотя короткими вариантами других инструкций (теми, что явно документированными) народ пользуется и не жужжит :).


Дата: Июн 22, 2004 18:34:58

S_T_A_S_
От этой заморочки с TEST Privalov отказался

А жаль, надо было вынести в опции - вкл/выкл.
Кстати, что-то привалов сейчас фасм забросил, здает еще что-то что-ли?


Дата: Июн 22, 2004 19:26:57

Privalov реализовал (в некоторых версиях 1.52) это очень грамотно:
по умолчанию для аргументов 0..127, генерировался опкод соответствующий байтовому аргументу,
а для принудительного указания размерности использовался оператор DWORD, как и с другими инструкциями.
Но, под давлением, эта фича была убрана из релиза.


Дата: Июн 22, 2004 20:11:02

Известно, что некоторые инструкции проца могут быть двояко закодированы (в смысле 2мя способами)
Даже одна инструкция использующая определённую адресацию ,
может быть в отношении этой адресации закодированна до 7и различными способами имея при этом одинаковый code ID.
например существует 7 способов закодировать:
8B08
8B48 00
8B88 00000000
8B0C20
8B4C20 00
8B8C20 00000000
8B0C05 00000000
Всё это:
mov ecx,[eax]


Дата: Июн 22, 2004 20:22:20 · Поправил: The Svin

Похоже с масмом похожая ситуация.
Дык на то это и трансляторы. И так с любым из них.
Кодирование на асме просто даёт бОльший контроль, но никогда полный.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057