Эта статья по большей части для совсем начинающих. Если вы хорошо разбираетесь в системах счисления, можете обратить внимание лишь на особенности синтаксиса ассемблера 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’. Если шестнадцатеричное число начинается с буквы, необходимо добавить в начале ноль (иначе непонятно, число это или имя метки).
Этот синтаксис используется как при объявлении данных, так и в командах. Вот примеры записи чисел во всех четырёх системах:
1 2 3 4 5 6 7 8 9 10 11 12 | mov ax,537 ;Десятичная система mov bl,11010001b ;Двоичная система mov ch,57o ;Восьмеричная система mov dl,$C2 ;\ mov si,0x013A ; \ mov ah,18h ; / Шестнадцатеричная система mov al,0FFh ;/ mov al,FFh ;Ошибка! |
2 ответа к “Учебный курс. Урок 7. Системы счисления”
с недавних пор учу ассемблер под fasm. Пока что я в статусе неофита, и мне интересно видеть продолжение ваших простых уроков. автору сайта успехов с вашим сайтом и продолжайте его развитие, особенно что касается компилятора FASM
Еще хотел пожелать, чтобы были некоторые основы с окнами программ и графическим UI под windows, ну самые поверхностные…
Если вам нужны учебные материалы, ну там справочники, связанные с ассемблером, то не стесняйтесь обращаться)
До окон далеко еще :) Первым делом азы ассемблера, и главное усвоить принцип инструкций процессора без поправки на особенности отдельно взятой ОС. Как нибудь и до окон дойдем.