Ассемблер

Что такое Ассемблер?

Процессорами управляют с помощью машинных инструкций.

Программисту сложно использовать машинные инструкции для написания программ.

Здесь на помощь приходят языки Ассемблеров.

Различным семействам процессоров соответствуют различные языки Ассемблеров.

Программа для процессора пишится на Ассемблере, далее она транслируется в машинные коды.

Ассемблеры относятся к языкам низкого уровня.

Итак, рассмотрим программирование на Ассемблере. Но прежде вспомним системы счисления.

Двоичное счисление

В компьютерах применяется двоичная система счисления. Почему так? Электронные элементы, из которых построен компьютер, могут воспринимать электрический сигнал. Их состояние меняется в зависимости от наличия или отсутствия сигнала. Итак, важно — есть сигнал или нет сигнала, да или нет. Двоичное счисление хорошо описывает эту картину, ведь в нём имеются только две цифры: 0 и 1. У двоичных цифр есть специальное название — бит. Если вы не знакомы с двоичным счислением, то сейчас самый момент познакомиться. Без понимания двоичной системы счисления невозможно освоить язык Ассемблера. Простую статью по двоичному счислению см. здесь.

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

Шестнадцатеричное счисление применяется для упрощения работы с двоичной системой счисления. 4-ре двоичные цифры заменяются одной шестнадцатиричной, что здорово упрошает запись. В компьютерной технике широко используется шестнадцатиричное счисление. Если вы не знакомы с шестнадцатиричным счислением, то можете прочесть статью «Шестнадцатиричная система счисления», которая поможет вам разобраться в этой теме. Без понимания шестнадцатиричной системы счисления невозможно освоить язык Ассемблера.

Что такое «бит»?

Бит — это наименьшая единица информации. Слово «бит», по-английски bit, происходит от «binary digit», что значит «двоичная цифра». Бит может быть единицей или нулём, ведь в двоичной системе счисления имеются только две цифры: 0 и 1.

Что такое «байт»?

Байт — это набор, состоящий из 8-ми битов. Байт, как и бит, — это единица информации. Пример байта:

0 0 0 0 0 0 0 1

Биты в байте нумеруются справа налево, от нуля до семи. В примере самый правый бит содержит единицу, его номер — ноль, второй справа бит имеет номер один и содержит ноль и т.д.

В нашем примере в байте хранится двоичное число один. А какое двоичное число хранится в байте:

1 0 1 0 1 0 1 0

В этом байте хранится двоичное число 10101010. Какое десятичное число соответствует данному двоичному? Для ответа на этот вопрос каждый бит умножим на двойку в степени, равной номеру бита в байте:

1 * 27 + 0 * 26 + 1 * 25 + 0 * 24 + 1 * 23 + 0 * 22 + 1 * 21 + 0 * 20 =
128 + 0 + 32 + 0 + 8 + 0 + 2 + 0 = 170

Бит S

Если целое число имеет знак, то крайний левый бит, т.е. старший бит, содержит указатель на знак числа. Если в старшем бите хранится число 0, то данное число является положительным, а если 1, то отрицательным. В этом случае старший бит называется бит S или знаковый бит.

Представление отрицательных чисел в компьютере

Чтобы записать отрицательное число нужно:
1. Инвертировать биты числа, т.е. нули заменить единицами, а единицы нулями;
2. К полученному числу прибавить единицу.

Пример. Дано двоичное число 01101010, его десятичное представление равно 106. Получим из него отрицательное число, для этого инвертируем исходное число:

01101010 — > 10010101

т.е. нули заменены единицами, а единицы нулями. Далее к полученному числу добавляем единицу:

10010101 + 00000001 = 10010110

Получили отрицательное представление исходного двоичного числа, обратите внимание, что сарший бит, крайний слева, 10010110, равен единице, а это говорит, что число отрицательное.

Для нахождения модуля полученного отрицательного числа также нужно инвертировать биты и добавить единицу. Инвертируем:

10010110 — > 01101001

добавляем единицу:

01101001 + 0000001 = 01101010

Получили модуль числа 10010110. Обратите внимание, что старший бит модуля 01101010 равен нулю, а это говорит, что число положительное.

Представление вещественных чисел в нормализованном виде

Число педставляют в виде:

pn * m

где p – основание системы счисления,
n – порядок, это показатель степени, представленный целым числом,
m — мантисса.

Такова форма представления чисел, её ещё называют представлением чисел с плавающей запятой. Таким образом вещественное число записывается в виде двух чисел: порядка и мантиссы.

Кроме того один бит нужен для указания знака числа.

Знак может иметь и порядок, чтоб учесть это к порядку добавляют смещение. Порядок плюс смещение называются характеристикой. Для одинарной точности (single precision) смещение равно 127, значит, если в характеристике хранится 127, то порядок равен нулю, т.к. 127 — 127 = 0. Если в характеристике хранится 135, то порядок равен 135 — 127 = 8. Если в характеристике хранится число 126, значит порядок равен 126 — 127 = -1. Так за счет смещения учитывается знак порядка, а значит нет необходимости в дополнительном знаковом бите для порядка.

Для двойной точности (double precision) смещение равно 1023.

Теперь что такое нормализованный вид числа. Для примера рассмотрим число десятичное 18,5. Представим его в нормализованном виде:

102 * 0,185

Запятую мы передвинули так, чтоб она оказалась перед старшим разрядом, а чтоб исходное число не изменилось, мы домножили его на десять в квадрате.

Другой пример представления числа в нормализованном виде. Дано число 0,0123, представить его в нормализованном виде. Делаем так:

10-1 * 0,123

Запятую мы передвинули так, чтоб она оказалась перед старшим разрядом, а чтоб исходное число не изменилось, мы домножили его на десять в минус первой степени.

Вот почему используется термин «числа с плавающей запятой», запятая перемещается для получения нормализованного вида числа.

А теперь рассмотрим представление двоичных чисел в нормализованном виде. Дано число 0,01b, представить его в нормализованном виде. Получаем:

2-2 * 1.0b

Нормализованное двоичное число должно начинаться с единицы. Основание двоичной системы равно двум, поэтому двойку возводим в степень. Остальное подобно примерам с десятичными числами.

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