vbrus.narod.ru

Интересуетесь современными IT-технологиями? Заходите на специализированный портал посвященный IT-технологиям: rtportal.ru

 

Чтиво - программирование на Ассемблер (Assembler)

    1. Для тех кто слышит слово Ассемблер впервые

    2. Регистры

 

1. Для тех кто слышит слово Ассемблер впервые - Ассемблер.

    1.01 Что такое Ассемблер?
    1.02 С чего начать изучения языка Ассемблера?


    1.01 Что такое Ассемблер?
    =======================================================
    Ассемблер (от английского assembler — сборщик) — язык программирования низкого уровня, однозначно транслируемый в систему команд микропроцессора.

    Несмотря на то, что сейчас в основном программы пишутся на языках высокого уровня, ассемблер никогда не потеряет своей актуальности, ассемблер - это родной язык процессора. Сейчас его используют в основном при написание драйверов, программирование микроконтролеров, ОС и вzлома программ:)


    Также ассемблером обычно называют транслятор языка ассемблера.

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

    Язык ассемблера — первый исторически язык программирования микропроцессоров, реализованный в виде машинного транслятора. Его название произошло от английского слова assemble, что означает «собирать», что отображало сей факт, что программа как бы собирается из мелких кирпичиков, являющихся командами процессора. Он был изобретен для того, чтобы упростить запоминание системы команд процессора: числовые коды инструкций были заменены на относительно легко запоминающиеся мнемоники. Часто мнемоники были сокращением слов, обозначающих операции: JMP — jump — «прыжок», на другой адрес, MOV — move — перемещение значения одного регистра в другой. Другой важной возможностью ассемблера является использование символических обозначений для величин и адресов. Это позволило программисту не расчитывать их вручную, что облегчало модификацию программы.

    Впоследствии ассемблер вобрал в себя некоторые возможнсти и абстракции, присущие языкам высокого уровня: автоматический выбор кода инструкции, если существует несколько различных кодов для одной и той же операции, например различной длины; возможность производить вычисление выражений во время трансляции; оптимизатор; описание структур данных; и макроподстановки. Макроподстановки к тому же убрали одно ограничение "классического" ассемблера: соотвествие »одна строка на ассемблере — одна инструкция«, так как дал возмоность делать "псевдоинструкции" из нескольких команд процессора. Сильно развитый макроподстановщик позволяет реализовывать многие конструкции, существующие на языках высокого уровня, в частности элементы структурного программирования. Ассемблер с макроподстановщиком называется отдельным термином: макроассемблер, обозначая главное отличие его от "классического" ассемблера. На данный момент "чистых" ассемблеров практически не сущеструет.

    До бурного развития оптимизирующих компиляторов, ассемблер был практически единственным средством получения достаточно оптимального машинного кода. Примерно в годах 1990-х ситуация стала меняться. Качество компилированного кода стало приближаться к коду, написанному человеком на ассемблере, а новые процессоры, со сложной архитектурой сильно усложнили анализ оптимальности кода человеком. Языки высокого уровня сильно потеснили ассемблер на рынке средств программирования.

    Также ассемблером называется программа трансляции программы на ассемблере в машинный код процессора. Программа, получающая программу на ассемблере из машинного кода называется дизассемблер.
    источник: www.wikiznanie.ru



    1.02 С чего начать изучения языка Ассемблера?
    =======================================================

    Pекомендую прочитать дневники чайника от Битфая расположенные на сайте bitfry.narod.ru после того как усвоите из того, что там написанно более чем на 50% :) можно пойти купить учебник Калашникова - "Ассемблер? - это просто" часть учебника можно прочитать на сайте автора: www.kalashnikoff.ru

    ну а дальше сами выбирайте, что вам читать :)
    можете если интересно, пройтись по следующим ссылкам:
    http://skachivaem.ru/books/16-books.html
    http://wasm.ru

    Наверх
 

2. Регистры

    Регистр - это определенный участок памяти внутри самого процессора, от 8-ми до 32-х бит длиной, который используется для промежуточного хранения информации, обрабатываемой процессором. Некоторые регистры содержат только определенную информацию.

    Регистры общего назначения - EAX, EBX, ECX, EDX. Они 32-х битные и делятся еще на две части, нижние из которых AX, BX, CD, DX - 16-ти битные, и деляется еще на два 8-ми битных регистра. Так, АХ делится на AH и AL, DX на DH и DL и т.д. Буква "Н" означает верхний регистр.

    Так, AH и AL каждый по одному байту, АХ - 2 байта (или word - слово), ЕАХ - 4 байта (или dword - двойное слово). Эти регистры используются для операций с данными, такими, как сравнение, математические операции или запись данных в память.
    Регистр СХ чаще всего используется как счетчик в циклах.
    АН в DOS программах используется как определитель, какой сервис будет использоваться при вызове INT.

    Регистры сегментов - это CS, DS, ES, FS, GS, SS. Эти регистры 16-ти битные, и содержат в себе первую половину адреса "оффсет:сегмент".

    CS - сегмент кода (страница памяти) исполняемой в данный момент программы.
    DS - сегмент (страница) данных исполняемой программы, т.е. константы, строковые ссылки и т.д.
    SS - сегмент стека исполняемой программы.
    ES, FS, GS - дополнительные сегменты, и могут не использоваться программой.

    Регистры оффсета - EIP, ESP, EBP, ESI, EDI. Эти регистры 32-х битные, нижняя половина которых доступна как регистры IP, SP, BP, SI, DI.
    EIP - указатель команд, и содержит оффсет (величину смещения относительно начала программы) на линию кода, которая будет исполняться следующей. То есть полный адрес на следующую исполняемую линию кода будет CS:ЕIP.

    Регистр ESP указывает на адрес вершины стека (адрес, куда будет заноситься следующая переменная командой PUSH).
    Регистр ЕВР содержит адрес, начиная с которого в стек вносится или забирается информация (или "глубина" стека). Параметры функций имеют положительный сдвиг относительно ЕВР, локальные переменные - отрицательный сдвиг, а полный адрес этого участка памяти будет SS:EBP.
    Регистр ESI - адрес источника, и содержит адрес начала блока информации для операции "переместить блок" (полный адрес DS:SI), а регистр EDI- адрес назначения в этой операции (полный адрес ES:EDI).

    Регистры управления - CR0, CR1, CR2, CR3. Эти 32-х битные регистры устанавливают режим работы процессора (нормальный, защищенный и т.д.), постраничное распределение памяти и т.д. Они доступны только для программ в первом кольце памяти (Kernel, например). Трогать их не следует.

    Регистры дебаггера - DR0, DR1, DR2, DR3, DR4, DR5, DR6, DR7. Первые четыре регистра содержат адреса на точки прерывания, остальные устанавливают, что должно произойти при достижении точки прерывания.

    Контрольные регистры - TR6, TR7. Используются для контроля постраничной системы распределения памяти операционной системой. Нужны только если вы собираетесь написать свою ОС.

    Источник: http://codenet.ru
    Наверх
Hosted by uCoz