Всем здравия. Ситуация: читаю книгу по архитектуре и ассемблеру x86. Чую, что бз практики уложить все это в голове не просто. Требуется компилятор для ассемблера. Что надо: самый простой компилятор, где все делается руками, т.е. без наворотов, дабы прочувствовать все "изнутри". Также, нужен хелп к нему, причем, хотелось бы "голый", т.е. без объяснений, что такое сегменты и т.д. Еще хотелось бы, чтобы в нем была возможность просмотреть опкоды, а то надоело уже лазать фаром в исполняемый . И заодно теритический вопросик: Насколько я правильно понял, сегментная организация памяти, в защищенном режиме не гарантирует защиты задач с одинаковым уровнем привелегий друг от друга Т.е. я могу запросто сменить селектор в сегментом регистре и покопаться, например, в памяти другой задачи. Собственно, вопрос: верно ли понят материал?
Самый простой компилятор наверное не самый лучший, в т.ч и для анализа. Руками можно работать практически с любым компилятором из распростаненных на сегодняшний день. Самые распространенные - masm и fasm. И с тем, и с другим можно работать руками. Масм можно взять тут: http://website.masmforum.com//masm32/m32v82r.zip В этом же пакете есть примерчики, хэлпы (хотя непонятно, что значит голый хэлп), разные утилитки, исходники и простенький редактор, который может сгодится в качестве просмотрщика кода exe-файлов. А вообще-то ковыряться в exe лучше с чем-нибудь вроде OllyDbg. Что касается fasm'a - это на flatassembler.com.
Спасибо всем, думаю, пока остановлюсь на fasm'e -- предельно прост, по крайней мере на первый взгляд. Пугает, правда, что он сам что-то там оптимизировать собирается, но, думаю, это возможно отключить. Такой, как в fasm'e, если убрать вторую главу .
fasm оптимизирует по размеру команды переходов. практически во всех случаях, где возможен 2х байтный опкод он его и сгенерирует, в отличае от masm. если нужен обязательно шестибайтный опкод, то можно это указать явно: jnz DWORD label
Понял ты правильно, и такое действительно возможно, но: 1. В реальной системе неизвестно конкретное значение селектора. 2. Если включена страничная переадресация, и каждая программа имеет своё адресное пространство, то это полностью исключается.
В смысле? Разве оно не загружено в сегментный регистр?.. Насколько я верно понял, я могу выполнить инструкцию sgdt и получу кол-во сегментов в системе. А потом просто пробежаться от значения "7" до передела, полученного из sgdt, с шагом == 4, выполняя инструкцию verw. Мне кажется, должно сработать...* * Пардон, конечно, при выключенном страничном преобразовании.
В компиляторе? Есть модификация фасм с возможностью генерации листинга. В хелпе? Ищи opcodes.hlp,x86eas.hlp.
Я знал, что компиляторы асма не такие уж низкоуровневые (сейчас), как мне казалось. FASM, например, все время норовит генерировать 16битный код, если ему явно об этом не сказать, у МАСМа, наверняка, свои тонкости. И мне хочется посмотреть потом в исполняемый, дабы убедиться, что там все, как я имел ввиду. Собственно, хотелось бы иметь встроенный простенький hex-вьюер. У FASM'а такого нт, пока что использую FAR.
Mika0x65 А какой бы ты хотел? Какой код низкоуровневее, 12-битный? да, mov hInstance,eax вместо mov [hInstance],eax если страшно смотреть файл листинга фасма, можно кроме фара смотреть в hiew или в RadASM, причём последний весьма хорош в качестве редактора и/или среды разработки для ассемблера.
Я бы хотел именно тот, который бы я хотел. А чтобы удостовериться, что код сгенерирован именно "мой" мне и нужен встроенный вьюер (коего в FASM нет, и придется пользоваться ). Хотя бы это. Об этом тоже надо прочитать.
два основных отличия синтаксиса fasm от masm: 1) в masm ячейка памяти указывается просто, или в скобках. Адрес указывается через оператор OFFSET. Код (Text): mov eax, [x1] ;значение из переменной x1 mov eax, x1 ;значение из переменной x1 mov ebx, OF x1 ;адрес x1 в fasm'е ячейка памяти всегда в скобках, без скобок- адрес. Код (Text): mov eax, [x1];значение mov eax, x1 ;адрес x1 2) разница в указании значений типа: mov eax, "abc" masm размещает в памяти как .."c","b","a" fasm решил упростить задачу, и вместо стандартного пишет перевернуто, т.е. как в тексте программы.
Mika0x65 О, ну что ж, патентуй идею: интеллектуальный ассемблер, генерирующий любой код по первому желанию программиста. шедевр
Честно говоря, думал, что их намного больше... Нееее, шедевр это вот что: компилируешь чисто 32битный (по смыслу) код, а он идет с префиксами замены размера адреса и операнда. Да, спасибо, уже дотуда дочитал .