Из архива wasm.ru: тулзы от The Svin

Тема в разделе "WASM.SOURCES & 2LZ", создана пользователем kero, 13 июн 2017.

  1. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва

    Демки по опкодам асма (из by_The_Svin_from_wasm_ru.zip)


    Что такое PDE? А PTE? Ага, знаете. Хорошо. И то, что mov cr0, reg в третьем кольце вызывает ля-ля тоже, небось, знаете? Ага, хорошо. А как же тогда эта программа работает? Не знаете? Ага. Хорошо :) Она использует smsw. Более подробно смотрим форум, поиск по ключевому слову "cr0".
    Cr0.png
    Пояснения ко всем программам: каждая из обучающих программ фокусирует внимание на какой-то отдельной стороне кодирование опкода, например на определении приемника-источника, определение размера операнда, кодирование непосредственного операнда, адреса и т.д. За исключением modrm1op.exe, все программы имеют три диалога, переключение между которыми происходит по переключению через язычки tab. Первый диалог (называется reference) служит демонстрационным стендом, два остальных (decode, encode) ― тестирующие ваши знания, и это самая важная часть. В decode вам предлагается записать мнемонику, encode ― закодировать мнемонику бинарно и затем в hex. Значения бит устанавливаются кнопками, за исключение значений бит w и d ― чтобы изменить их состояние ― щелкните по буковкам w или d соответствующий им нижерасположенный бит изменится.

    mod11bitsdw.png

    Modrm1op.png

    muldivopcode.png

    REGFIELD.png

    Подручные виндовые напоминалки


    Человека, недавно пришедшего в Win GUI, может свести с ума обилие различных стилей кнопочек, менюшечек, окошечек и прочих рюшечек. Опять таки ― либо толстенный талмуд (нечто вроде распечатанного MSDN), либо, вот эта вот масенькая, но веселая программа.

    Styles.png

    (Styles ― тулза давняя, новейших стилей нема, зато есть исходники, допишете :) )

    SystImages.png
     

    Вложения:

    xspector, gazlan, yashechka и ещё 1-му нравится это.
  2. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Класс!!!
     
  3. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Спасибо The Svin-у, встретить бы его тут и самого :)
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Flags and JCC ©The Svin
    Вот смотрите вы в листинге дизассемблера на что-нибудь, вроде jpo 40001234 и мучительно пытаетесь вспомнить, а что оно такое, это jpo... Какой, говорите, там флажок поднимается? Честно скажу, что сам я и не упомню. Для таких случаев должно быть что-то вроде карманного справочника или вот этой вот утилитки. Маленькой, но жутко полезной!
    00.png
    Еще одна тулза от The Svin, в архиве ехе-файл и исходные тексты. Дорабатывайте :)

    Для тех, кто хотел бы пообщаться со The Svin, но стесняется открыть Google. Ссылка на livejournal The Svin
     

    Вложения:

    • tttn.zip
      Размер файла:
      6,3 КБ
      Просмотров:
      613
    kero нравится это.
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Magic divider ©The Svin
    В этом новом разделе мы будем выкладывать программки для истинного ассемблерщика. Скажем, многие люди, считающие, что знают ассемблер, на самом деле, полностью теряются, видя некоторые забавные выкрутасы. Дурной славой пользуются sbb/and/or/shr/shl/bt/bswap и т.п. Данная программка покажет вам как использовать операции деления более эффективно, ведь div ― это же чудовищно!
    00.png
    В архиве ехе-файл и исходный текст
     

    Вложения:

    kero нравится это.
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Test for mem/reg decoder
    00.png
    исходный текст и ехе-файл во вложении
     

    Вложения:

    • memr.zip
      Размер файла:
      7,7 КБ
      Просмотров:
      460
    kero нравится это.
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Immediate to Register
    00.png
    во вложении только ехе-файл
     

    Вложения:

    • movrimm.zip
      Размер файла:
      4,7 КБ
      Просмотров:
      480
    kero нравится это.
  8. Atari

    Atari Member

    Публикаций:
    0
    Регистрация:
    16 мар 2017
    Сообщения:
    24
    Мда, прям мураши по коже когда видишь это, столько лет ....
     
    yashechka нравится это.
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Опкоды в 16-и битной адресации
    Mem16b.exe помогает запомнить коды регистров указателей на память при 16и битной адресации. Написана Яном ― (на тот момент времени 7-летним) сыном Svin'a. Modrm16.exe в деталях демонстрирует кодирование адреса по правилам 16-и битного эффективного адреса.
    00.png

    Краткое введение в кодирование адреса с помощью байта ModrM в 16-и битном режиме адресации.


    (автор The Svin, взято здесь)​

    Напомним формат полей в байте modrm (от старших бит к младшим ― слева направо)
    поле modecode/reg mem/reg
    номер бита7, 65, 4, 32, 1, 0
    Например, если байт modrm в hex 7Bh, то бинарно он выглядит 0111 1011b и группировка бит по полям modr/m выглядит 01 111 011, где
    • 01 - поле mode
    • 111- поле code/reg
    • 011- поле mem/reg
    Как и в 32-х битном режиме значение поля байта modrm mode=11 означает, что поле mem/reg адресует регистр, и mode11 (то есть 00, 01 или 10), что mem/reg содержит код указателя на память.
    Если mode=00 и mem/reg=110 Это указывает, что регистры-указатели в формировании адреса не присутствуют и следующие два байта непосредственно за байтом modrm представляют собой слово ― адрес операнда в памяти.
    Это схоже с принципом адресации без регистров в 32-х битном режиме. Единственной разницей является то, что там "особое" значение равно 101, а не 110, и указывает на отсутствие лишь базового регистра, с возможностью применения индексного регистра в sib. В 16-и битном режиме SIB отсутствует, и наличие, как индексного, так и базового регистра можно определить только через поле mem/reg.
    Как следствие ― если поле mem/reg "занято" специальным значение 110 при Mode=00 то регистры вообще в формировании адреса не участвуют ― просто нет места, где ещё их можно определить.
    В 32-х битном отсутствие базового регистра можно определить и как:
    • mode=00 и mem/reg=101 (в этом случае регистров указателей нет вообще)
    • и как mode=00, mem/reg=100 (знак присутствия SIB), base (в байте SIB)=101
    В этом случае базового регистра нет, но остаётся возможность использовать индексный регистр. Заполнив значение поля индексного регистра 100 (знак отсутствия индексного регистра) мы так же получим отсутствие регистров указателей вообще. При других значениях в поле индекса ― мы определим один из 7-и регистров как индексный но с отсутствием базового.
    Во всех остальных случаях значение mode будет следующим:
    • 00 ― смещение отсутствует.
    • 01 ― смещение представлено знаковым байтом, следующим за modrm
    • 10 ― смещение представлено словом, и слово это тоже расположено непосредственно за modrm
    Теперь о значение битов в поле mem/reg, когда оно содержит коды указателей на память. Система кодирования их значений резко отличается от 32-х битной системы адресации.
    Чтобы разобраться в системе кодирования адреса через поле mem/reg в 16-и битной адресации просто рассмотрим что же может участвовать в формировании адреса (служить слагаемым), а что нет.
    1. В 16-и битной адресации отсутствует байт SIB, который служит расширением ― заменой трех битного поля memr при 32-х битной адресации. Как следствие:
      1.1. в 16-и битной адресации нет нужды в специальном значении в mem/reg, которое при адресации памяти определяет не регистр указатель, а просто наличие SIB (100).
      1.2. Отсутствует масштабирование (множитель) для индексного регистра.
    2. В качестве регистров указателей могут использоваться только четыре регистра:
      • bx
      • bp
      • si
      • di
      2.1. Эти регистры легко запомнить:
      • либо первая буква ― b (base) :bx, bp
      • либо последняя ― i (index):si, di
      2.2. В формировании адреса могут участвовать один или два регистра. В последнем случае они воспринимаются как базовый (bx, bp) и индексный (si, di). Если участвуют два регистра, то это может быть только пара [базовый][индексный]
      и недопустимы сочетания:
      • [базовый][базовый]
      • [индексный][индексный]
      то есть возможны:
      • [bx][si]
      • [bx][di]
      • [bp][si]
      • [bp][di]
      и недопустимы:
      • [bx][bp]
      • [si][di]
      2.3 В качестве единственного регистра в указателе (базовый регистр без индексного) может использоваться любой из вышеупомянутых четырех:
      • [bx]
      • [bp]
      • [si]
      • [di]
    3. К регистрам в указателе (формуле адреса) можно прибавлять непосредственное значение ― смещение непосредственно указанное в команде (displacement) или использовать регистры без него. Размер (разрядность) этого блока в команде определённой под значение смещения определяется полем mode.
    Особым случаем является попытка использовать [bp] (код 110) без смещения:
    • поскольку mode=00 (в общих случаях означающее отсутствие displacement) вместе с mem/reg=110 (в общих случаях адресации памяти означающее [bp], но не в этом!) означает вовсе не [bp], а отсутствие базовых и индексных регистров вообще в формировании адреса. то закодировать [bp] возможно лишь как [bp][00] то есть, указав его как базовый регистр со смещением 00.
    • Либо как:
      modecode/regmem/regсмещение
      01xxx110 + byte содержащий 00h
    • Либо как:
      modecode/regmem/regсмещение
      10xxx110+word содержащий 0000h
    Теперь, после обзора правил кодирования, мы видим, что возможных значений для описания регистров указателей может понадобится только восемь:
    • Четыре пары базовый+индексный регистр
    • четыре значения для четырех регистров, когда они используются отдельно, как базовый регистр без индексного
    Вот коды этих значений в поле mem/reg:
    000 [bx+si]
    001 [bx+di]
    010 [bp+si]
    011 [bp+di]
    100 [si]
    101 [di]
    110 [bp]
    111 [bx]
    Помните об "особом" значении сочетания mode=00 + mem/reg=110.
    Это не [bp]! Это отсутствие регистров в формировании адреса. Кодируйте [bp] как [bp+00].
     

    Вложения:

    • Mem16b.zip
      Размер файла:
      2,7 КБ
      Просмотров:
      410
    FloFlo, yashechka и kero нравится это.
  10. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Годнота!!!