Операции с байтами
Иногда говорят о наиболее.- наименее значащих разрядах десятичного числа. Например, в числе 456 наиболее значащий разряд -- 4, наименее значащий 6. Таким образом, 456 -- это 400 +50+6, где 4 указывает, сколько в числе содержится единиц самого старшего разряда, т.е. сотен. Точно так же мы говорим о наиболее и наименее значащих разрядах двоичного числа. В числе 10110 наименее значащий разряд -- это самый правый разряд (0), а наиболее значащий -- первый слева (1). Рассматривая байты, мы поступаем так же : разбиваем 16-разрядное число на два байта (числа по 8 разрядов) -- более значащий (старший) и менее значащий (младший). В шестнадцатеричном числе 10А2 старший байт равен 10, младший -- А2. Если число десятичное, то выделение байтов производится не так просто. Для чисел больше 255 значение старшего байта можно найти из табл. 3.2.
Таблица 3.2. Старший и младший байты чисел
Десятич. Шестнадца- Старший Младший число терич.экв. байт байт Дес. Шест. Дес. Шест . 001 0001 000 00 001 01 255 00FF 000 00 255 FF 256 0100 001 01 000 00 257 0101 001 01 001 01 511 01FF 001 01 255 FF 512 0200 002 02 000 00 513 0201 002 02 001 01 767 02FF 002 02 255 FF 768 0300 003 03 000 00 769 0301 003 03 001 01
Число 255, или FF, -- это наибольшее число, которое может находиться в младшем байте. Если число больше 255, то в старший байт нужно добавить 1. Поэтому число 256 имеет 1 в старшем байте и 0 -- в младшем. Теперь заметим, что число 512, которое получается добавлением еще одной 1 к старшему байту, в 2 раза больше 256, а 768 в 3 раза больше 256. Другими словами, старший байт увеличивается на 1 каждый раз, когда число увеличивается на 256.
Теперь рассмотрим два слова С@ и С! для операций с отдельными байтами. Слово С@ похоже на слово @, но оно извлекает значение только одного байта (буква С в имени происходит от слова character, т.е. символ, потому что любой символ ASCII представляется одним байтом). После С@ старший байт в стеке должен быть равен 0. Понимаете ли вы, почему ?
Слово С! подобно !, но оно производит запись только младшего байта числа, находящегося в стеке.
Оно обычно используется, если число в стеке не превосходит 256. Проделаем несколько экспериментов. Слово PAD (буфер, записная книжка) выдает в стек адрес в памяти, который является началом буфера, где пользователь может хранить свои данные. Положите в стек число 257 и занесите его в PAD с помощью
257 PAD !
Теперь давайте посмотрим, что окажется в каждом байте по адресу PAD и PAD+1, для чего введем
PAD С@ . PAD 1 + С@ .
Вот что вы увидите:
1 1 ok
Теперь повторите то же самое с числами 255 и 256. Потом попробуйте числа из . Вы будете видеть раздельно младший и старший байты вводимых чисел. Понятно ли вам, почему ? Вы записываете в PAD число целиком с помощью !, но извлекаете его в стек побайтно и поэтому видите оба байта. Порядок следования байтов может меняться от компьютера к компьютеру, в зависимости от того, как хранятся старший и младший байты числа в памяти. В большинстве случаев старший байт числа хранится в более старшем адресе. Дальнейшее рассмотрение операций над байтами продолжим в упражнениях.