Загрузка...

Представление числовых значений


Теперь, когда вы знаете о типах данных языка ассемблера, возникает вопрос, как можно представлять значения? Легче всего пользоваться десятичными значениями (то есть с основанием 10), поскольку мы привыкли к ним в повседневной жизни. Определенно, проще всего ввести:

mov cx,100 ; установить счетчик в значение 100

В самом деле, Турбо Ассемблер считает значения десятичными, если вы не указали противное. С сожалению, десятичные значения во многих случаях не совсем подходят для программирования на языке Ассемблера, так как компьютеры представляют собой двоичные уст-ройства (используют основание 2).

Тогда логично использовать в программах на Ассемблере двоич-ное представление. Вы можете указать Турбо Ассемблеру, что число выражено в двоичном виде, если просто поместите в конце числа букву b (конечно, при этом число должно состоять только из 0 и 1, поскольку это единственные две цифры, допустимые в двоичном представлении). Например, десятичное значение 5 выражается в дво-ичном виде, как 101b.

Проблема при десятичном представлении состоит в том, что числа с основанием 2 слишком длинные и ими трудно пользоваться. Это вызвано тем, что в каждой двоичное цифре может храниться только два значения — 0 или 1. Это показано в следующей таблице:

Десятичное Двоичное Восьмеричное Шестнадцатиричное

0 0 0 0

1 1 1 1

2 10 2 2

3 11 3 3

4 100 4 4

5 101 5 5

6 110 6 6

7 111 7 7

8 1000 10 8

9 1001 11 9

10 1010 12 A

11 1011 13 B

12 1100 14 C

13 1101 15 D

14 1110 16 E

15 1111 17 F

16 10000 20 10

17 10001 21 11

18 10010 22 12

19 10011 23 13

20 10100 24 14

21 10101 25 15

22 10110 26 16

23 10111 27 17

24 11000 30 18

25 11001 31 19

26 11010 32 1A

.

.

256 1000000000 400 100

.

.

4096 1000000000000 10000 1000

.

.

65536 1000000000000000 200000 10000

Например, перепишем последнюю инструкцию с операндами в дво-ичном представлении:

mov cx,1100100b ; установить счетчик в

; значение 100

Двоичные значения размером в слово и двойное слово еще труд-нее читать и использовать.

Если вы еще не знакомы с этими представлениями, мы настоя-тельно рекомендуем вам раздобыть хорошую книгу на эту тему, так как двоичная, восьмеричная и шестнадцатиричная запись — это один из основных элементов в программировании на Ассемблере.

Два из этих представлений, восьмеричное и шестнадцатиричное, не только хорошо соответствуют двоичной природе компьютера, но и довольно компактны.

В восьмеричном представлении, или представлении с основанием 8, используются цифры от 0 до 7 (3 бита на цифру). На Рис. 5.5 показано, каким образом биты двоичного значения 001100100b можно объединить в группы по три бита, чтобы образовать восьмеричное значение 144o.

Двоичное 001 100 100

| | | | | |

——- ——- ——-

| | |

——— | ———

| | |

v v v

Восьмиричное 1 4 4

Рис. 5.5 Преобразование двоичного значения 001100100 (деся-тичное 100) в восьмеричное значение 144.

В итоге можно видеть, что восьмеричное число втрое короче его двоичного эквивалента. В восьмеричном виде последний пример принимает вид:

mov cx,144o ; установить счетчик в значение 100

Заметим, что суффикс o указывает на восьмеричную запись. Можно также использовать суффикс q, который не так просто спутать с нулем. Однако программисты, работающие на IBM PC, почти всегда используют шестнадцатиричное (с основанием 16) представление, а не восьмеричное.

Каждая шестнадцатиричная цифра может принимать одно из 16 значений. Перечислим их в шестнадцатиричном представлении:

0 1 2 3 4 5 6 7 8 9 A B C D E F 10 …

После цифры 9 следуют шесть дополнительных шестнадцатиричных цифр A — F. (Можно также использовать строчные буквы a — f.) Хотя использование букв в качестве цифр может показаться странным, у вас не выбора, так как вам нужно 16 цифр, а обычных цифр только 10. На Рис. 5.6 показано, как можно разбить на группы биты двоич-ного числа 01100100b (100 в десятичном виде), чтобы образовать шестнадцатиричное значение 64h.

Двоичное 0110 0100

| | | |

——— ———

| |

——— ———

| |

v v

Шестнадцатиричное 6 4

Рис. 5.6 Преобразование двоичного значения 001100100 (деся-тичное 100) в шестнадцатиричное значение 64.

Как показано на Рис. 4.6, в шестнадцатиричном представлении значения имеют вид «4 бита на цифру». В итоге шестнадцатиричные значения имеет длину, равную только ? длины их двоичных эквива-лентов. Фактически, смещение другого значения размером в слово можно выразить с помощью четырех шестнадцатиричных цифр. В шест-надцатиричном виде последний пример принимает вид:

mov cx,64h ; установить счетчик в значение 100

Шестнадцатиричные числа обозначаются суффиксом h. Кроме то-го, шестнадцатиричные числа должны начинаться с одной из цифр 0-9, так как шестнадцатиричное число типа BAD4h может ошибочно интерпретироваться, как метка. Приведем пример, к котором исполь-зуется как число 0BAD4h, так и метка BAD4h:

.DATA

BAD4h DW 0 ; метка BAD4h

CODE

mov ax,0BAD4h ; загрузить в AX

; шестнадцатиричную

; константу (первый 0

; показывает, что это

; константа

mov ax,BAD4h ; загрузить AX из

; переменной в памяти

; BAD4h (отсутствие

; 0 в качестве первого

; символа показывает,

; что это метка

В общем случае постоянным числовым значением может быть только операнд, начинающийся с цифр 0-9.

Числа с плавающей точкой могут обозначаться двумя способами. Во-первых, вы можете задавать значение с плавающей точкой в виде «мантисса/экспонента», например:

1.1

-12.45

1.0E12

252.123E-6

Турбо Ассемблер преобразует форму «мантисса/экспонента» в двоичный вид, при котором соблюдается формат с плавающей точкой. Если хотите, вы можете задавать значения с плавающей точкой не-посредственно в формате IEEE или двоичном формате фирмы Microsoft, задав число в шестнадцатиричном виде и поместив к кон-це его суффикс r.

Вещественные числа могут использоваться только в директивах DD, DQ и DT (которые мы обсудим позднее). Если вы выберите ис-пользование суффикса r, то вы должны точно определить максималь-ное число шестнадцатиричных цифр для инициализируемого типа дан-ных (плюс предшествующий ноль, если это необходимо). Например:

DD 40000000r ; 2.0 (длина в точности равна 8)

DD 0C014CCCCCCCCCCCr ; -5.2 (длина 16, плюс предшест-

; вующий ноль)

DT 4037D529AE9E86000000r ; 1.2E17 (ровно 20 бит)

В общем случае значительно проще использовать форму «мантис-

са/экспонента».

Чтобы показать, что число является десятичным, в качестве суффикса можно использовать букву d. Зачем же нужен этот суффикс, если по умолчанию Турбо Ассемблер и так предполагает, что все числа являются десятичными? Как вы можете догадаться, ответ сос-тоит в том, что числа кроме десятичного могут иметь и другие представления. Для этого служит директива .RADIX, о которой мы потом кратко расскажем.

Наконец, могут использоваться символьные константы, при этом символы заключаются в одиночные или двойные кавычки. Значением символа является его значение кода ASCII. Например, все следующие строки загружаются в регистр AL символ A:

mov al,65

mov al,41h

mov al,’A’

mov al,”A”

Где можно использовать значения в различном описанном выше представлении? Двоичные, восьмиричные, десятичные и шестнадцати-ричные значения могут использоваться там же, где можно использо-вать константы, например:

mov ax,1001b

add cx,5bh

sub [Count],177o

and al,1

mov al,’A’

Значения с плавающей точкой могут использоваться только в директивах DD, DQ и DT. Двоично-десятичные значения (BCD) можно использовать только в в директиве DT.

Загрузка...