Каждый персональный компьютер имеет микропроцессор, который управляет арифметической, логической и управляющей деятельностью компьютера.
Каждое семейство процессоров имеет свой собственный набор инструкций для выполнения различных операций, таких как получение ввода с клавиатуры, отображение информации на экране и т.д. Этот набор инструкций называется инструкциями машинного языка.
Процессор понимает только инструкции машинного языка, которые являются последовательностью бит: 1
или 0
. Однако машинный язык слишком сложен и непонятен для использования в разработке программного обеспечения. Поэтому для определенного семейства процессоров был разработан низкоуровневый язык, который представляет собой набор инструкций для написания программ в более понятной форме. Этот язык назвали языком ассемблера (или просто «ассемблер»).
Ассемблер — это транслятор (переводчик), который переводит код, написанный на языке ассемблера, в машинный язык.
Преимущества языка ассемблера
Использование языка ассемблера позволяет понять:
как программы взаимодействуют с операционной системой, процессором и BIOS-м;
как данные представлены в памяти и на других устройствах;
как процессор получает доступ к инструкциям и как он их выполняет;
как инструкции получают доступ к данным и как эти данные обрабатываются;
как программа получает доступ к внешним устройствам.
Другие преимущества использования языка ассемблера:
требует меньше памяти;
быстрее выполняется;
упрощает сложные аппаратные задачи.
Основные характеристики аппаратного обеспечения ПК
Основное аппаратное обеспечение ПК состоит из процессора, памяти и регистров. Регистры — это компоненты процессора, содержащие данные и их адреса в памяти. Чтобы выполнить программу, система копирует её с внешнего устройства во внутреннюю память. Затем процессор выполняет инструкции программы.
Данные в компьютере хранятся в битах: 1
(ВКЛ) или 0
(ВЫКЛ).
Процессор поддерживает следующие размеры данных:
word — 2-байтовый элемент данных;
doubleword — 4-байтовый (32-битный) элемент данных;
quadword — 8-байтовый (64-битный) элемент данных;
paragraph — 16-байтовая (128-битная) область;
kilobyte — 1024 байт;
megabyte — 1 048 576 байт.
Двоичная система счисления
Каждая система счисления использует позиционные обозначения. Каждое следующее позиционное значение состоит из предыдущего позиционного значения, умноженного на 2 (именно на 2, так как это бинарная система, которая состоит из 2-х чисел). Если битом является 1
, то позиционное значение умножается на 2, а если 0
— позиционное значение остается 0
. В бинарной системе счисления отсчет ведется справа налево, а не слева направо (как в десятичной системе).
Например, в следующей таблице показаны позиционные значения 8-битного двоичного числа 11111101
:
Бит | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
Позиционное значение | 128 | 64 | 32 | 16 | 8 | 4 | 0 | 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).
Адресация данных в памяти
Процесс, посредством которого процессор управляет выполнением инструкций, называется циклом выполнения, который состоит из 3-х последовательных шагов:
Шаг №1: Извлечение инструкции из памяти.
Шаг №2: Расшифровка или идентификация инструкции.
Шаг №3: Выполнение инструкции.
Процессор может одновременно обращаться к одному или нескольким байтам памяти. Например, рассмотрим шестнадцатеричное значение 0824H, которое занимает 2 байта памяти. Байт старшего разряда или старший значащий байт – 08, младший байт – 24.
Процессор хранит данные в обратной последовательности байтов, т.е. байт младшего разряда сохраняется в нижнем адресе памяти (слева), а байт старшего разряда – в верхнем адресе памяти (справа). Таким образом, если процессор перенесет значение 0824H из регистра в память, то 24 будет в начале строки, а 08 – в конце, при этом читать данные процессор будет справа налево, а не слева направо (помним, что процессор работает в бинарной системе счисления):
Когда процессор переносит данные из памяти в регистр, то он опять меняет местами байты (т.е. 08 опять будет слева, а 24 – справа).
Есть 2 вида адресов памяти:
абсолютный адрес — прямая ссылка на конкретное местоположение;
сегментный адрес (или «смещение») — адрес сегмента памяти со значением смещения.
На следующем уроке мы рассмотрим установку среды разработки для языка ассемблера.
Спасибо за качественный урок, очень сильно помогли.
Хмм. Только сейчас заметил, что добавились уроки по Ассемблеру. Хотел поинтересоваться, будут ли уроки по Питону? Насколько я знаю, иногда С++ и Питон используют в связке. Как минимум один конкретный пример я знаю.
Будет ли продолжение по урокам Assembler?
Точно ответить не могу. Может будет, а может и нет.
С нетерпением жду следующего урока!
Евгений Павлов, спасибо!
Автор, снимаю перед тобой шляпу, настолько ценный материал ты у себя разместил, что в знак благодарности я отключил блокировщик рекламы!
Услуга за услугу. Принято 🙂
Благодарю за приятные слова.
Очень счастлив, что наткнулся на данный ресурс! Сейчас изучаю плюсы по Шилдту и по этому сайту. Также в ВУЗе начинаем проходить ассемблер… И тут появляется эта статья! Просто огонь! Желаю успеха, счастья и печенек автору этого ресурса и автору этой статьи!
Очень рад, если будет такой же низкий порог входа как у курсов по с++.
1. Как создавать приложение на ассемблере.
2. Какие IDE или приложения есть для удобного программирования.
3. Продолжение пункта 2, какие сложности могут возникнуть в использовании приложений.
1. Также как и любое другое.
2. IDE для ASM практически нету. Я вот работал в VS Code и компилировал из командной строки. Возможно есть расширения под VS.
3. Вопрос непонятен.
Есть, но оно только под винду, — что является существенным недостатком для тех, кто сидит на других ОС.
IDE можно использовать Visual Studio(2013 но знакомые и на 2017 делали). Могу скинуть настройки его под ассемблер. У меня лично всё работает.
Есть IDE под названием ASM Visual специально для программирования на низкоуровневом языке — Assembler. Единственный недостаток, он только под винду..(