Ассемблер.
ASSEMBLE – созывать, собирать, монтировать.
АССЕМБЛЕР – язык программирования, предназначенный для адекватного отражения архитектуры вычислительной машины при программировании. Использование Ассемблера имеет ряд особенностей:
- язык Ассемблера сильно зависит от процессора, для обслуживания которого он создается;
- Ассемблер существенно сложнее любого языка высокого уровня, т.к. учитывает все тонкости работы конкретного процессора. Эти тонкости «сглаживаются» в языках высокого уровня, где отражаются лишь общие свойства алгоритмов и особенности их подготовки, зачастую при условии, что архитектура процессора отражена лишь в самом общем виде.
- программируя в Ассемблере, пользователь должен сам контролировать распределение памяти и регистров для хранения и манипуляции данными. В языках высокого уровня компилятор это делает автоматически. Но, с другой стороны, такая возможность позволяет оптимально организовать данные и выполнить кодирование программы для обеспечения максимального быстродействия и/или минимальной длины программы.
Ассемблер является промежуточным звеном между кодами компьютера и языками программирования. В нем задается общие синтаксис и мнемоника описания, но т.к. рассматриваемая архитектура является общей для машин с различной архитектурой, то работа программистов при подготовке компиляторов с языков высокого уровня на язык ассемблера для компьютеров с различной архитектурой сокращает сроки разработок математического обеспечения.
Ассемблер представляет собой, как правило, библиотеку описания отдельных машинных команд и большой макропроцессор директив, описывающих отдельные функции процессора и представление различных типов данных в компьютере. В директивы процессора фирмы Intel, например, включены директивы описания типа процессора (.386, .486), директивы описания типа и состава программы (dosseg, model, .stack), директивы описания различных типов данных, включая описания структур и т.д. Поэтому ассемблер важно использовать для кодирования критических участков сложных программ, для кодирования программ драйверов, для подготовки тестов при подключении нового оборудования.
1) Представление данных в Ассемблере.
Все данные в микропроцессоре представляются набором двоичных разрядов (битов) той или иной длины. Команды микропроцессора рассматривают содержимое регистра или ячейки памяти в заранее определенном формате и обычно только сам программист определяет значение конкретной ячейки (бит, число со знаком или без знака и т.д.) и задает необходимую команду для обработки поля битов (байта, слова, двойного слова и т.д.). Для адресации в микропроцессоре используются слова (2 байта).
Для кодировки знаков используется код ASCII (American Standard Code for the Information Interchange).
Для кодировки чисел используется двоичная позиционная система. При этом младший байт заносится по младшему адресу, а старший – по старшему. Например, число 1234h занесется в память т.о.
Адреса значения
А-1
А 34
А+1 12
Двойное слово длиной в 4 байта 12345678h
в памяти будет представлено так
Адреса значения
А-1
А 78
А+1 56
А+2 34
А+3 12
Отрицательное число представляется в машине в ДВОИЧНОМ ДОПОЛНИТЕЛЬНОМ КОДЕ.
Константы представляются своим числовым значением, после которого может стоять соответствующий суффикс, например:
1234 - десятичная константа (суффикс отсутствует)
0а12h - 16-ричная константа (0 необходим т.к. первый знак должен
быть арабской цифрой)
101001b - двоичная константа
Возможно использование как строчных, так и прописных букв H и B.
Микропроцессоры семейства I80х86 поддерживают данные следующих размерностей
Байты
Слова (два байта)
Двойные слова (4 байта), отметим, что так же описываются числа типа FLOAT.
Строки, в которых описываются также числа типа DOUBLE и LONG DOUBLE.
Следующая таблица представляет сравнительное описание чисел в языках C и ASSEMBLER:
Тип размер интервал представления описание директива ASS
в байтах
char 1 -128 127 BYTE db
unsigned char 0 255
int 2 -32768 32767 WORD dw
unsigned int 2 0 65535
long 4 -2147483648 2147483647 DWORD dd
unsigned long 4 0 4294967295
float 4 -3.4e-/+38 3.4e-/+38
double 8 -1.7e-/+308 1.7e-/+308 QWORD dq
long double 10 -3.4e-/+4932 3.4e-/+4932 TBYTE dt
Кроме того, для дальнего указателя длиной 32 бита в мнемонике С используется ключевое слово FAR *, а в мнемонике ASSEMBLER’а – df.
2) Регистры микропроцессора.
31 |
16 |
15 |
8 |
7 |
1 |
|
EAX |
AH |
AL |
Аккумулятор |
|||
AX |
||||||
EBX |
BH |
BL |
БАЗОВЫЙ РЕГИСТР |
|||
BX |
(для формирования адреса при адресации по базе) |
|||||
ECX |
CH |
CL |
СЧЕТЧИК |
|||
CX |
(например, в циклах ) |
|||||
EDX |
DH |
DL |
РЕГИСТР ДОПОЛНИТЕЛЬНЫХ ДАННЫХ |
|||
DX |
||||||
ESI |
SI |
Индекс источника |
||||
EDI |
DI |
Индекс приемника |
||||
EBP |
BP |
Указатель базы для вычисления локальных переменных |
||||
ESP |
SP |
Указатель текущего положения в стеке. |
||||
EIP |
IP |
Указатель адреса инструкции. |
||||
EFLAGS |
FLAGS |
Регистр флагов состояния |
||||
CS |
Адрес сегмента кода. |
|||||
DS |
Адрес сегмента данных |
|||||
ES |
Адрес дополнительного сегмента данных |
|||||
FS |
Адрес дополнительного сегмента данных. |
|||||
GS |
Адрес дополнительного сегмента данных |
|||||
SS |
Адрес сегмента стека. |
Начиная с микропроцессора I80386, были установлены 32-разрядные регистры для данных (AX, BX, CX, DX), для регистров указателей и индексов (BP, SI, DI, SP), для регистра флагов состояния (FLAGS) и для регистра указателя команд (IP), который указывает, какая команда будет выполнена следующей. Эти регистры при описании в ассемблере снабжены символом “E” (EAX вместо AX и т.д.).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.