Содержание:
- Глава 1 - предисловие и материалы для скачивания
- Глава 2 - предварительные сведения перед изучением ассемблера
- Глава 3 - архитектура процессора 8086
- Глава 4 - сегментация, стэк, прерывания, адресация
- Глава 5 - ассемблер (директивы и операторы)
- Глава 6 - ассемблер (выражения, приоритеты и ссылки вперёд)
- Глава 7 - Загрузка и выполнение программ в DOS, структура EXE и COM программ
- Глава 8 - команды процессора: пересылка данных, стэк, ввод/вывод
- Глава 9 - арифметические команды процессора
- Глава 10 - команды операций сдвигов в Ассемблере
- Глава 11 - команды сравнения и передачи управления в Ассемблере
- Глава 12 - подпрограммы и прерывания в Ассемблере
- Глава 13 - строковые команды в Ассемблере
- Глава 14 - управление процессором
- Глава 15 - практика:EXE и COM программы, вывод на экран
- Глава 16 - практика: циклы и ввод с клавиатуры
- Глава 17 - практика: ввод чисел и системы счисления
- Глава 18 - практика: работа с файлами, перехват и восстановление прерываний
- Глава 19 - практика: дополнительные сведения
- Глава 20 - программирование для Windows
ВНИМАНИЕ! Данный самоучитель был написан много лет назад и его автор не сможет ответить на ваши вопросы. Курс по assembler предназначен для саморазвития. Если у вас хватает квалификации, можете предложить внести правки.
Представление данных в ПК
То о чем пойдёт речь в данной главе может показаться довольно скучным однако чтобы программировать на ассемблере следует познакомиться с двоичными и шестнадцатиричными числами. Без понимания того, как на самом деле хранятся данные в памяти ПК невозможно пользоваться битовыми и логическими операциями и многим другим.
Двоичная система счисления
Все существующие компьютерные системы используют для вычисления двоичную систему счисления. Это удобно поскольку в электрических цепях напряжение может принимать два значение, их называют 0 и 1. Ну соответственно двоичная система и использует эти две цифры, вместо обычных степеней десяти здесь используют степени двойки. Для отличия двоичных чисел в конце ставят знак b. Пример перевода двоичного числа в десятичное(скобка это возведение в степень):
10010111b = 1*2(7) + 0 + 0 + 1*2(4)+ 0 +1*2(2) + 1*2(1) + 1*2(0) = 128+16+4+2+1 = 151
А чтобы обратно из десятичного числа в двоичное нужно только делить в столбик на два, записывая остаток справа налево (то есть делим на два, пишем остаток, целое от деления снова делим и так до 1). Ну вообще говоря это только для примера ведь есть же и калькуляторы!
Шестнадцатеричная система счисления
Неудобство двоичной системы это громоздкость чисел. На практике напрямую с двоичными числами надо работать если требуется отслеживать значения отдельных битов, например при заполнении структур данных того же защищенного режима, при вводе и выводе с портов устройств. А вот если битов много то лучше применять шестнадцатеричную систему. Её плюсы это компактность и легкость перевода в двоичную и обратно. Здесь есть 16 цифр: 0-9,A, B, C, D, E, F. Перевод в двоичную и обратно прост:
96h = 10010110b
Вместо каждой шестнадцатеричной цифры подставляют четырехзначное двоичное число! Оканчиваются шестнадцатеричные цифры буквой h, причём если число начинается с буквы то в начале надо поставить 0.
Сводная таблица
Десятичное | Двоичное | Шестнадцатеричное |
0 | 0000b | 00h |
1 | 0001b | 01h |
2 | 0010b | 02h |
3 | 0011b | 03h |
4 | 0100b | 04h |
5 | 0101b | 05h |
6 | 0110b | 06h |
7 | 0111b | 07h |
8 | 1000b | 08h |
9 | 1001b | 09h |
10 | 1010b | 0Ah |
11 | 1011b | 0Bh |
12 | 1100b | 0Ch |
13 | 1101b | 0Dh |
14 | 1110b | 0Eh |
15 | 1111b | 0Fh |
16 | 10000b | 10h |
Хранение данных
Минимальная единица информации это бит, принимающий только два значения 1 или 0. Но в ПК он не адресуем по отдельности! То есть для работы с битами так или иначе надо оперировать целым байтом. То есть реально адресуемая единица это один байт, состоящий из 8 бит. Нумерация битов идёт справа налево! От нуля и до семи. Нулевой бит зовут младшим а седьмой старшим. Из восьми бит мы получаем 256 различных значений - два в восьмой степени. Ну например байтами представляется кодовая таблица ASCII. Следующий по размеру тип данных это слово, содержащее два байта или 16 бит, соответственно мы имеем уже 65536 значений. Два слова подряд образуют двойное слово из 32 бит, а два двойных слова учетверённое из 64 бит.
В процессорах Intel все данные хранятся так что младший байт записывают по младшему адресу а старший по старшему. То есть слова пишутся в памяти задом на перед! Значит если вам надо прочесть старший байт то адрес надо увеличить на один.
Знаковые числа
Чтобы применять байты, слова и двойные слова используют операцию дополнения до двух. То есть выполняют инверсию (замену нулей на единицы и наоборот) а затем прибавляют 1. Тут нужен пример
150 = 0000 0000 1001 0110b
инвертируем и получаем 1111 1111 0110 1001b
прибавим один и получим 1111 1111 0110 1010b
Теперь легко посмотреть что сумма результата и исходного значения равны нулю. Там получится 10000h, но единица в шестнадцатый разряд не поместилась (не влезло в слово) и в результате имеем 0! Старший бит всегда соответствует знаку числа 0 для положительных и 1 для отрицательных. Из за потери одного бита диапазон сокращается у всех типов, например в байте теперь будет от -128 до 127 и так далее.
Логические операции
Это последнее в данной главе. В ассемблере все логические операции побитовые: AND, OR, XOR, NOT.
0 AND 0 = 0 | 0 OR 0 = 0 | 0 XOR 0 = 0 | NOT 0 = 1 |
0 AND 1 = 0 | 0 OR 1 = 1 | 0 XOR 1 = 1 | NOT 1 = 0 |
1 AND 0 = 0 | 1 OR 0 = 1 | 1 XOR 0 = 1 | |
1 AND 1 = 1 | 1 OR 1 = 1 | 1 XOR 1 = 0 |