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

Автор: xrnd | Рубрика: Учебный курс | 19-03-2010 | Распечатать запись Распечатать запись

Эта статья по большей части для совсем начинающих. Если вы хорошо разбираетесь в системах счисления, можете обратить внимание лишь на особенности синтаксиса ассемблера 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 бита и заменить каждую тетраду соответствующей шестнадцатеричной цифрой.

Двоичная
тетрада
Шестнадцатеричная
цифра
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F

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

0101 10112 = 5B16

0110 00002 = 6016

1111 11112 = FF16

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

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

Двоичная
триада
Восьмеричная
цифра
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7

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

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

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

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

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

mov ax,537          ;Десятичная система
 
mov bl,11010001b    ;Двоичная система
 
mov ch,57o          ;Восьмеричная система
 
mov dl,$C2          ;\
mov si,0x013A       ; \
mov ah,18h          ; / Шестнадцатеричная система
mov al,0FFh         ;/
 
mov al,FFh          ;Ошибка!

Следующая часть »

Комментарии: