Демки по опкодам асма (из by_The_Svin_from_wasm_ru.zip) Что такое PDE? А PTE? Ага, знаете. Хорошо. И то, что mov cr0, reg в третьем кольце вызывает ля-ля тоже, небось, знаете? Ага, хорошо. А как же тогда эта программа работает? Не знаете? Ага. Хорошо Она использует smsw. Более подробно смотрим форум, поиск по ключевому слову "cr0". Пояснения ко всем программам: каждая из обучающих программ фокусирует внимание на какой-то отдельной стороне кодирование опкода, например на определении приемника-источника, определение размера операнда, кодирование непосредственного операнда, адреса и т.д. За исключением modrm1op.exe, все программы имеют три диалога, переключение между которыми происходит по переключению через язычки tab. Первый диалог (называется reference) служит демонстрационным стендом, два остальных (decode, encode) ― тестирующие ваши знания, и это самая важная часть. В decode вам предлагается записать мнемонику, encode ― закодировать мнемонику бинарно и затем в hex. Значения бит устанавливаются кнопками, за исключение значений бит w и d ― чтобы изменить их состояние ― щелкните по буковкам w или d соответствующий им нижерасположенный бит изменится. Подручные виндовые напоминалки Человека, недавно пришедшего в Win GUI, может свести с ума обилие различных стилей кнопочек, менюшечек, окошечек и прочих рюшечек. Опять таки ― либо толстенный талмуд (нечто вроде распечатанного MSDN), либо, вот эта вот масенькая, но веселая программа. (Styles ― тулза давняя, новейших стилей нема, зато есть исходники, допишете )
Flags and JCC ©The Svin Вот смотрите вы в листинге дизассемблера на что-нибудь, вроде jpo 40001234 и мучительно пытаетесь вспомнить, а что оно такое, это jpo... Какой, говорите, там флажок поднимается? Честно скажу, что сам я и не упомню. Для таких случаев должно быть что-то вроде карманного справочника или вот этой вот утилитки. Маленькой, но жутко полезной! Еще одна тулза от The Svin, в архиве ехе-файл и исходные тексты. Дорабатывайте Для тех, кто хотел бы пообщаться со The Svin, но стесняется открыть Google. Ссылка на livejournal The Svin
Magic divider ©The Svin В этом новом разделе мы будем выкладывать программки для истинного ассемблерщика. Скажем, многие люди, считающие, что знают ассемблер, на самом деле, полностью теряются, видя некоторые забавные выкрутасы. Дурной славой пользуются sbb/and/or/shr/shl/bt/bswap и т.п. Данная программка покажет вам как использовать операции деления более эффективно, ведь div ― это же чудовищно! В архиве ехе-файл и исходный текст
Опкоды в 16-и битной адресацииMem16b.exe помогает запомнить коды регистров указателей на память при 16и битной адресации. Написана Яном ― (на тот момент времени 7-летним) сыном Svin'a. Modrm16.exe в деталях демонстрирует кодирование адреса по правилам 16-и битного эффективного адреса. Краткое введение в кодирование адреса с помощью байта 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 адресует регистр, и mode≠11 (то есть 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-и битной адресации просто рассмотрим что же может участвовать в формировании адреса (служить слагаемым), а что нет. В 16-и битной адресации отсутствует байт SIB, который служит расширением ― заменой трех битного поля memr при 32-х битной адресации. Как следствие: 1.1. в 16-и битной адресации нет нужды в специальном значении в mem/reg, которое при адресации памяти определяет не регистр указатель, а просто наличие SIB (100). 1.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] К регистрам в указателе (формуле адреса) можно прибавлять непосредственное значение ― смещение непосредственно указанное в команде (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].