Глава 2 - предварительные сведения перед изучением ассемблера
Мы используем cookie-файлы, чтобы получить статистику, которая помогает нам улучшить сервис для Вас с целью персонализации сервисов и предложений. Вы можете прочитать подробнее о cookie-файлах или изменить настройки браузера. Продолжая пользоваться сайтом без изменения настроек, вы даёте согласие на использование ваших cookie-файлов.
speech bubble

Глава 2 - предварительные сведения перед изучением ассемблера

Самоучитель по языку ассемблер(assembler)

Содержание:

 

ВНИМАНИЕ! Данный самоучитель был написан много лет назад и его автор не сможет ответить на ваши вопросы. Курс по 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  

 

Для комментирования необходимо авторизоваться