Рубрики
Учебный курс

Учебный курс. Урок 7. Системы счисления

Эта статья по большей части для совсем начинающих. Если вы хорошо разбираетесь в системах счисления, можете обратить внимание лишь на особенности синтаксиса ассемблера FASM в конце статьи.

На самом деле процессор работает только с двоичными числами, состоящими из единиц и нулей 🙂 В виде двоичных чисел хранятся и обрабатываются все данные и команды любой программы. Однако, двоичная запись чисел слишком громоздка и неудобна для человека, поэтому в программах на ассемблере используются и другие системы счисления: десятичная, шестнадцатеричная и восьмеричная.

Немного теории

Прежде всего разберёмся, в чём различие между системами счисления. Любое десятичное число можно представить в таком виде:

12310 = 1·102 + 2·101 + 3·100

Индекс внизу обозначает, что это десятичное число. Цифра каждого разряда умножается на 10 в степени, равной номеру разряда, если считать с нуля справа налево. В более общем виде:

abcr = a·r2 + b·r1 + c·r0,

где a, b и с — какие-то цифры, а r — основание системы счисления. Для десятичной системы r = 10, для двоичной — r = 2, для троичной r = 3 и т.д. Например, то же самое число в других системах:

4435 = 4·52 + 4·51 + 3·50 = 4·25 + 4·5 + 3·1 = 12310 (пятеричная система)

1738 = 1·82 + 7·81 + 3·80 = 1·64 + 7·8 + 3·1 = 12310 (восьмеричная система)

11110112 = 1·26 + 1·25 + 1·24 + 1·23 + 0·22 + 1·21 + 1·20 = 1·64 + 1·32 + 1·16 + 1·8 + 0·4 + 1·2 + 1·1 = 12310 (двоичная система)

Шестнадцатеричная система

В шестнадцатеричной системе для обозначения цифр больше 9 используются буквы A = 10, B = 11, C = 12, D = 13, E = 14, F = 15. Например:

C716 = 12·161 + 7·160 = 12·16 + 7·1 = 19910

Удобство шестнадцатеричной системы в том, что в неё очень легко можно переводить двоичные числа (и в обратную сторону тоже). Четыре разряда двоичного числа (тетрада) представляются одним разрядом шестнадцатеричного. Для перевода достаточно разбить число на группы по 4 бита и заменить каждую тетраду соответствующей шестнадцатеричной цифрой.

Двоичная
тетрада
Шестнадцатеричная
цифра
00000
00011
00102
00113
01004
01015
01106
01117
10008
10019
1010A
1011B
1100C
1101D
1110E
1111F

Для записи одного байта требуется всего 2 шестнадцатеричные цифры:

0101 10112 = 5B16

0110 00002 = 6016

1111 11112 = FF16

Восьмеричная система

Восьмеричная система также удобна для представления двоичных чисел, хотя она используется намного реже, чем шестнадцатеричная. Для быстрого перевода надо разбить двоичное число на группы по 3 разряда (триплеты или триады).

Двоичная
триада
Восьмеричная
цифра
0000
0011
0102
0113
1004
1015
1106
1117

Например: 001 110 1012 = 1658

Синтаксис ассемблера FASM

По умолчанию, число в программе воспринимается ассемблером как десятичное. Чтобы обозначить двоичное число, необходимо к нему в конце добавить символ ’b’. Восьмеричное число обозначается аналогично с помощью символа ’o’. Для записи шестнадцатеричного числа FASM поддерживает 3 формы записи:

  • перед числом записываются символы ’0x’ (как в C/C++);
  • перед числом записывается символ ’$’ (как в Pascal);
  • после числа записывается символ ’h’. Если шестнадцатеричное число начинается с буквы, необходимо добавить в начале ноль (иначе непонятно, число это или имя метки).

Этот синтаксис используется как при объявлении данных, так и в командах. Вот примеры записи чисел во всех четырёх системах:

2 ответа к “Учебный курс. Урок 7. Системы счисления”

с недавних пор учу ассемблер под fasm. Пока что я в статусе неофита, и мне интересно видеть продолжение ваших простых уроков. автору сайта успехов с вашим сайтом и продолжайте его развитие, особенно что касается компилятора FASM
Еще хотел пожелать, чтобы были некоторые основы с окнами программ и графическим UI под windows, ну самые поверхностные…
Если вам нужны учебные материалы, ну там справочники, связанные с ассемблером, то не стесняйтесь обращаться)

До окон далеко еще :) Первым делом азы ассемблера, и главное усвоить принцип инструкций процессора без поправки на особенности отдельно взятой ОС. Как нибудь и до окон дойдем.

Добавить комментарий