Ассемблер — это транслятор (переводчик), который переводит код, написанный на языке ассемблера, в машинный язык.
Каждый персональный компьютер имеет процессор, который управляет арифметической, логической и управляющей деятельностями компьютера. Каждое семейство процессоров имеет свой собственный набор инструкций для выполнения различных операций, таких как получение ввода с клавиатуры, отображение информации на экране и т.д. Этот набор инструкций называется инструкциями машинного языка.
Процессор понимает только инструкции машинного языка, которые являются последовательностью бит: 1
или 0
. Однако машинный язык слишком сложен и непонятен для использования в разработке программного обеспечения. Поэтому для определенного семейства процессоров был разработан низкоуровневый язык, который представляет собой набор инструкций для написания программ в более понятной форме. Этот язык назвали языком ассемблера (или просто «ассемблер»).
Преимущества языка ассемблера
Использование языка ассемблера позволяет понять:
как программы взаимодействуют с операционной системой, процессором и BIOS-м;
как данные представлены в памяти и на других устройствах;
как процессор получает доступ к инструкциям и как он их выполняет;
как инструкции получают доступ к данным и как эти данные обрабатываются;
как программа получает доступ к внешним устройствам.
Другие преимущества использования языка ассемблера:
для работы требует мало памяти;
его инструкции выполняются очень быстро;
упрощает сложные аппаратные задачи.
Основные характеристики аппаратного обеспечения ПК
Основное аппаратное обеспечение ПК состоит из процессора, памяти и регистров. Регистры — это компоненты процессора, содержащие данные и их адреса в памяти. Чтобы выполнить программу, система копирует её с внешнего устройства в оперативную память. Затем процессор выполняет инструкции программы.
Данные в компьютере хранятся в битах: 1
(ВКЛ) или 0
(ВЫКЛ).
Процессор поддерживает следующие размеры данных:
word — 2-байтовый элемент данных;
doubleword — 4-байтовый (32-битный) элемент данных;
quadword — 8-байтовый (64-битный) элемент данных;
paragraph — 16-байтовая (128-битная) область;
kilobyte — 1024 байт;
megabyte — 1 048 576 байт.
Двоичная система счисления
Каждая система счисления использует позиционные обозначения разрядов чисел (их значений). Каждое следующее позиционное значение состоит из предыдущего позиционного значения, умноженного на 2 (именно на 2, так как это бинарная система, которая состоит из двух чисел). Если битом является 1
, то позиционное значение умножается на 2, а если 0
— позиционное значение остается 0
. В бинарной системе счисления отсчет ведется справа налево, а не слева направо (как в десятичной системе).
Например, в следующей таблице показаны позиционные значения 8-битного двоичного числа 11111101
:
Бит | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
Позиционное значение | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Номер бита | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Значение бинарного числа равно сумме позиционных значений всех бит:
1 + 4 + 8 + 16 + 32 + 64 + 128 = 253
Двоичное 11111101
= десятичное 253
.
Примечание: Детально о конвертации чисел из двоичной системы в десятичную и наоборот, а также о сложении двоичных чисел, читайте в материалах урока №44.
Шестнадцатеричная система счисления
Шестнадцатеричная система счисления состоит из 16 символов: 0-9
и A-F
. Символы A-F
используются для представления шестнадцатеричных цифр, соответствующих десятичным значениям с 10 по 15.
Шестнадцатеричные значения в вычислениях используются для сокращения длинных двоичных представлений. По сути, шестнадцатеричная система счисления представляет собой двоичные данные, деля каждый байт пополам и выражая значение каждого полубайта. В следующей таблице приведены десятичные, двоичные и шестнадцатеричные эквиваленты:
Десятичное представление | Двоичное представление | Шестнадцатеричное представление |
0 | 0 | 0 |
1 | 1 | 1 |
2 | 10 | 2 |
3 | 11 | 3 |
4 | 100 | 4 |
5 | 101 | 5 |
6 | 110 | 6 |
7 | 111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | A |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
Для конвертации бинарного числа в его шестнадцатеричный эквивалент разбейте бинарное число на 4 последовательные группы, начиная справа, и запишите эти группы поверх соответствующих цифр шестнадцатеричного числа.
Пример: Бинарное число 1000 (8) 1100 (C) 1101 (D) 0001 (1) эквивалентно шестнадцатеричному 8CD1.
Чтобы конвертировать шестнадцатеричное число в двоичное, просто запишите каждую шестнадцатеричную цифру в её 4-значный двоичный эквивалент.
Пример: Шестнадцатеричное число FAD8 эквивалентно двоичному 1111 (F) 1010 (A) 1101 (D) 1000 (8).
Адресация данных в памяти
Процесс, посредством которого процессор управляет выполнением инструкций, называется циклом выполнения, который состоит из трех последовательных шагов:
Шаг №1: Извлечение инструкции из памяти.
Шаг №2: Расшифровка или идентификация инструкции.
Шаг №3: Выполнение инструкции.
Процессор может одновременно обращаться к одному или нескольким байтам памяти. Например, рассмотрим шестнадцатеричное значение 0824H, которое занимает 2 байта памяти. Байт старшего разряда или старший значащий байт – 08, младший байт – 24.
Процессор хранит данные в обратной последовательности байтов, т.е. байт младшего разряда сохраняется в нижнем адресе памяти (слева), а байт старшего разряда – в верхнем адресе памяти (справа). Таким образом, если процессор перенесет значение 0824H из регистра в память, то 24 будет в начале строки, а 08 – в конце, при этом читать данные процессор будет справа налево, а не слева направо (помним, что процессор работает в бинарной системе счисления):
Когда процессор переносит данные из памяти в регистр, то он опять меняет местами байты (т.е. 08 опять будет слева, а 24 – справа).
Есть 2 вида адресов памяти:
абсолютный адрес — прямая ссылка на конкретное местоположение;
сегментный адрес (или «смещение») — адрес сегмента памяти со значением смещения.
На следующем уроке мы рассмотрим установку среды разработки для языка ассемблера.
Не понял, что значит буква H в числе 0824H (подглава "Адресация данных в памяти").
Разобрался — буква H значит Hexadecimal, в переводе с английского "Шестнадцатеричное", то есть обозначает, что число находится в 16-ричной системе счисления, а не в 10-тичной, как обычно.
H — hex
Спасибо за качественный урок, очень сильно помогли.
Хмм. Только сейчас заметил, что добавились уроки по Ассемблеру. Хотел поинтересоваться, будут ли уроки по Питону? Насколько я знаю, иногда С++ и Питон используют в связке. Как минимум один конкретный пример я знаю.
Будет ли продолжение по урокам Assembler?
Точно ответить не могу. Может будет, а может и нет.
С нетерпением жду следующего урока!
Евгений Павлов, спасибо!
Автор, снимаю перед тобой шляпу, настолько ценный материал ты у себя разместил, что в знак благодарности я отключил блокировщик рекламы!
Услуга за услугу. Принято 🙂
Благодарю за приятные слова.
Очень счастлив, что наткнулся на данный ресурс! Сейчас изучаю плюсы по Шилдту и по этому сайту. Также в ВУЗе начинаем проходить ассемблер… И тут появляется эта статья! Просто огонь! Желаю успеха, счастья и печенек автору этого ресурса и автору этой статьи!
Очень рад, если будет такой же низкий порог входа как у курсов по с++.
1. Как создавать приложение на ассемблере.
2. Какие IDE или приложения есть для удобного программирования.
3. Продолжение пункта 2, какие сложности могут возникнуть в использовании приложений.
1. Также как и любое другое.
2. IDE для ASM практически нету. Я вот работал в VS Code и компилировал из командной строки. Возможно есть расширения под VS.
3. Вопрос непонятен.
Есть, но оно только под винду, — что является существенным недостатком для тех, кто сидит на других ОС.
IDE можно использовать Visual Studio(2013 но знакомые и на 2017 делали). Могу скинуть настройки его под ассемблер. У меня лично всё работает.
Есть IDE под названием ASM Visual специально для программирования на низкоуровневом языке — Assembler. Единственный недостаток, он только под винду..(
Любой текстовый редактор. И терминал.