Введение в ассемблер(Windows)

Тема в разделе 'Инструментарий', создана пользователем XmP, 9 май 2011.

  1. XmP ADD ebx, 110h

    Введение
    Здравствуйте. Эту статью я посвятил тому, кто уже знает некоторые ЯП ВУ (Языки Программирования Высокого уровня)(С++, С#, Delphi) и хочет научиться программировать на ассемблере, но не знает с чего начать. На нашем форуме есть очень много тем, постов где выкладывают Кинги по ASM, комплимяторы, среды разработки. Но ни одной хорошей инструкции для новичков я не нашёл, после прочтения этой статьи всё должно проясниться. В этой статье мы будем ориентироваться на процессоре Intel.

    Ассе?мблер (от англ. assembler — сборщик) — компьютерная программа, компилятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.
    Как и сам язык (ассемблер), ассемблеры, как правило, специфичны конкретной архитектуре, операционной системе и варианту синтаксиса языка. Вместе с тем существуют мультиплатформенные или вовсе универсальные (точнее, ограниченно-универсальные, потому что на языке низкого уровня нельзя написать аппаратно-независимые программы) ассемблеры, которые могут работать на разных платформах и операционных системах. Среди последних можно также выделить группу кросс-ассемблеров, способных собирать машинный код и исполняемые модули (файлы) для других архитектур и ОС.

    Что нам потребуеться?
    Существует достаточно много программ комплимяторов, для каждого из них свой ситтаксис, т. е. программу написанную на FASM может непонять программист программирующий на TASM или MASM.
    Поскольку мы будем программировать под Windows системы, в своей работe мы будем использовать MASM32.
    Microsoft Macro Assembler (MASM) — ассемблер для процессоров семейства x86. Первоначально был произведён компанией Microsoft для написания программ в операционной системе MS-DOS и был в течение некоторого времени самым популярным ассемблером, доступным для неё. Это поддерживало широкое разнообразие макросредств и структурированность программных идиом, включая конструкции высокого уровня для повторов, вызовов процедур и чередований (поэтому MASM — ассемблер высокого уровня). Позднее[когда?] была добавлена возможность написания программ для Windows. MASM — один из немногих инструментов разработки Microsoft, для которых не было отдельных 16- и 32-битных версий.
    Разуметься для начала мы будем писать только консольные программы, а потом, когда уже сами продвинитесь далеко вперёд, вы возможно перейдёте к GUI приложениям.
    Для начала, создадим на диски C: папку myasm.
    Скачаем MASM: ***Для просмотра ссылок необходимо войти или зарегистрироваться*** Распакуем его в папку myasm.

    Немного про ASM
    Ассемблер - низкоуровневый язык программирования. Для каждого процессора существует свой ассемблер. Программируя на ассемблере вы непосредственно работаете с аппаратурой компьютера. Исходный текст на языке ассемблера состоит из команд (мнемоник), которые после компиляции преобразуются в коды команд процессора.
    Разработка программ на ассемблере - очень тяжёлая штука. Взамен потраченному времени вы получаете эффективную программу. Программы на ассемблере пишут, когда важен каждый такт процессора. На ассемблере вы даёте конкретные команды процессору и никакого лишнего мусора. Этим и достигается высокая скорость выполнения вашей программы.
    Ассемблер считаеться языком крутых программистов, многие страрються выучить его но только у некоторых это получаеться. Ассемблер – любимый язык хакеров. Его знание позволяет понять внутреннюю архитектуру компьютра, получаемые на нём программы в несколько раз меньше тех, ктороые написаны на языке высокого уровея. Программы, написанные на таких языках как C++, нужно сначала перевести на ассемблер, потом программа, написанная на ассемблере должна будет преведена в PE EXE файл, т е в числа. Только потом, не без помощи операционной системы он сможет её понять и выполнить. Но каждая строчка ассемблера соответствует каждей команде, посылаемой в процессор. В получившимся PE-файле кроме прямых инуструкций есть дополнительные данные для взаимодействия с операционной системой.

    Регистры

    Когда мы говорим о компьютере, выполняющем некоторую программу мы имеем ввиду его центральную микросхему – процессор. Процессор выполняет команды, называемые инструциями, а хранит результаты их работы в регистрах.
    Регистр - это сверхбыстрый участок памяти внутри самого процессора, от 8-ми до 32-х бит длиной, который используется для промежуточного хранения информации, обрабатываемой процессором. Некоторые регистры содержат только определенную информацию. Регистры деляться на шесть групп: Регистры общего назначения, регистры сегментов, Регистры офсета, Регистры управления, Регистры дебаггера, Контрольные регистры. Сейчас мы рассмотрим и будем использовать только регистры общего назначения.
    Регистры общего назначения - EAX, EBX, ECX, EDX. Они 32-х битные и делятся еще на две части, нижние из которых AX, BX, CD, DX - 16-ти битные, и деляется еще на два 8-ми битных регистра. Так, АХ делится на AH и AL, DX на DH и DL и т.д. Буква "Н" означает верхний регистр.
    Регистр-аккумулятор (EAX) -- применяется для хранения промежуточных данных (немного позже Вы увидите как он используется).
    Базовый регистр (EBX]) -- применяется для хранения базового адреса некоторого обьекта в памяти.
    Регистр-счетчик (ECX) -- регистр используется в основном для организации циклов.
    Регистр данных (EDX) -- так же как и регистр EAX, хранит промежуточные данные.

    Главные команды Ассемблера

    Я думаю те, кто читает эту статью видели пример кода на ассемблере. Но система команд в ассемблере не так сложна, как кажеться.
    Команда mov:
    Синтаксис программы:
    Код:
    Код:
     mov eax, 1
    Указанный код записывает в регистр EAX число 1. Думаю всем понятно что делает команда mov edx, 8(Записывает в регистр edx число 8)

    Команда add:
    Синтаксис программы:
    Код:
    Код:
     add eax, 4
    Данный код прибавляет к регистру eax число 4.
    Коментарии обозначаться знаком ;
    Чтоб всё окончательно уяснилось рассмотрим небольшой отрывок кода:
    Код:

    Код:
    mov eax, 2
    add eax, 3
    add eax, 4
    Первая команда записывает в регистр eax число 2, вторая прибавляет к нему число 3, третяя прибавляет к нему число 4. В итоге в регистре eax образуеться число 9.
    Команда ret завершает работу программы. Но после неё выполняеться ещё много команд для конкретного завершения работы.

    Первая программа

    Текст программы на ассемблере кроме прямых инструкций содержит ещё и служебную информацию. Она помогает ассемблеру понять, что от неё требуется.
    Код:

    Код:
    .386
    .model flat, stdcall
    .code
    start:
    mov eax, 2
    add eax, 3
    add eax, 4
    ret
    end start
    Директива .386 показывает для какого процессора предназначен код
    Вторая директива показывает в какой среде будет жить программа. Программы работают не сами по себе, а под управлением операционной системы которая их запускает и обеспечивает их взаимодействие с внешней средой.
    Третья и четвертая директива показывают ассемблеру где начинается исходный код программы.
    Потом идут уже знакомые нам команды.
    И наконец последняя директива показывает где кончается исходный код программы.

    Комплимирование
    Для удобного управления файлами нам потребуеться программа Total Commander и Edit Plus.
    Открываем Total Commander, переходим в каталоu C:\myasm\bin\. Запускаем Edit Plus, файл C:\myasm\bin\h.asm, копируем туда текст нашей программы.
    Код:

    Код:
    .386
    .model flat, stdcall
    .code
    start:
    mov eax, 2
    add eax, 3
    add eax, 4
    ret
    end start
    Чтоб скомплимировать программы надо выполнить в командной строке следующий код:
    Код:

    Код:
    ml /c /coff "h.asm"
    link /SUBSYSTEM:CONSOLE "h.obj"
    Для того что б вам было проще, я уже создал файл amake.bat.
    Запускаем его, если вы ввели текст программы правильно, то у вас появиться 2 файла - h.obj и h.exe. Запускаем файл h.exe.
    На доли секунды появляеться консольное окно и мгновенно исчезает. Правильно – разглядывать совершенно нечего, программа всего то совершает небольшую работу с регистрами и всё. Но если мы ещё не научились выводить информацию на экран, то это не значит что действия программы от нас скрыты.

    Отладчик – Главный инструмент программиста.

    Отладчик или дебаггер (англ. debugger) является модулем среды разработки или отдельным приложением, предназначенным для поиска ошибок в программе. Отладчик позволяет выполнять пошаговую трассировку, отслеживать, устанавливать или изменять значения переменных в процессе выполнения программы, устанавливать и удалять контрольные точки или условия остановки и т. д.
    Мы будем пользоваться бесплатным отладчиком OllyDbg.
    OllyDbg — бесплатный проприетарный 32-битный отладчик уровня ассемблера для операционных систем Windows, предназначенный для анализа и модификации откомпилированных исполняемых файлов и библиотек, работающиx в режиме пользователя (ring-3).
    OllyDbg выгодно отличается от классических отладчиков (таких, как SoftICE) простым интерфейсом, интуитивной подсветкой специфических структур кода, простотой в установке и запуске. Для того, чтобы разобраться в принципе работы OllyDbg, достаточно лишь базовых знаний в области языка ассемблера. По этим причинам OllyDbg рекомендуют[1] к использованию даже новичкам.
    Запускаем файл Ollydbg.exe с праваме администратора. Выбираем File -> Open, открываем только что нами созданный h.exe.

    [IMG]
    Окно отладчика разделено на 4 части, с лева сверху расположен исходный код, справа сверху расположены регистры процессора и другая дополнительная информация, с права с низу расположено окно стека, что это вы узнаете позже.
    Пользоваться отладчиком очень просто, пока нам нужна только клавиша F8, выполняющая программу по шагам.
    Зарание посмотрим в правый верхий угол – сейчас регистр EAX равен некоему числу, а указатель в левам верхнем углу стоит на строке mov eax, 2.
    Нажмём F8, указатель переместиться на вторую строку, а в регистре EAX образуеться число 2. Всё правильно, выполнив последущие команды в регистре EAX окажеться число 9. Если ещё раз нажать F8 выполниться команда ret которая завершает работу программы и передаёт управления операционной системе, что вы можете видеть.

    Шестнадцатеричная система счисления

    В современных процессорах используеться шестнадцатеричная система счисления. Каждый разряд шестнадцатеричного числа может принимать 16 значений, из которых первые 10 обозначаются обычными десятичными цифрами, а последние 6 - буквами латинского алфавита от А до F, где А обозначает 10, В - И, С - 12, D - 13, Е - 14, a F - 15. В языке ассемблера шестнадцатеричные числа, чтобы отличать их от десятичных, завершаются буквой h (или Н). Таким образом, 100 - это десятичное число, a l00h - шестнадцатеричное (равное 256).
    Тем самым нетрудно догадаться что 10+5=F.

    END

    Эта статья для начала программирования на ассемблере, а не для начального изучения ассемблера. После её прочтения вы должны были понять принципы действия процессора, синтаксис ассемблера, умение комплимировать программы, умение пользоваться отладчиком. Сейчас будет приведён список литературы, по которой вы продолжите дальше изучать ассемблер.

    Литература
    Для начального ознакомления пойдет книга Крупника "Изучаем ассемблер"
    Ссылка: ***Для просмотра ссылок необходимо войти или зарегистрироваться***
    После ознакомления советую почитать книгу Пирогова "Ассемблер и дизассемблирование"
    Ссылка: ***Для просмотра ссылок необходимо войти или зарегистрироваться***
    Параллельно с ней будет необходимо смотреть MSDN для изучения функций WinAPI.
    ПАШКА, wapten и Admin нравится это.

Поделиться этой страницей