13 = 13d = 00001101b = 0Dh.
Такая запись принята, например, в языке ассемблера для процессоров Intel. Популярность языка С внесла в это дело некоторый разнобой: там десятичная система обозначается буквой «d» (или никак), двоичная буквой «Ь», а вот шестнадцатеричная буквой «х», причем запись во всех случаях предваряется нулем (чтобы не путать запись числа с идентификаторами переменных, которые всегда начинаются с буквы):
13 = 0d13 = 0Ь00001101 = 0x0D.
Такая же запись также принята в ассемблере для микроконтроллеров AVR, которыми мы будем пользоваться. Запись типа 0Dh ассемблер AVR не поддерживает, зато «понимает» представление НЕХ-формата, принятое в языке Pascal: $0D. В фирменном описании системы команд AVR можно даже встретить запись сразу с двумя обозначениями, по типу $0Dh (очевидно, специально для особо бестолковых).
Обратите внимание, что запись в НЕХ-формате обычно ведется в двухразрядном виде, даже если число имеет всего один значащий разряд, как в нашем случае, то в старшем пишется 0, то же самое относится и к двоичной записи, которая дополняется нулями до восьми разрядов. А вот для десятичного представления такой записи следует остерегаться.
Замечание
Чтобы еще больше «запутать» пользователя, разработчики AVR-ассемблера приняли для представления редко употребляемых восьмеричных чисел запись просто с ведущим нулем, без букв: например, 77 означает просто десятичное 77, а вот 077 будет означать 7∙8 + 7 = 63 10. Нет, чтобы уж сделать и здесь, как в языке С, где восьмеричные числа записываются по аналогии со всеми остальными, как 0оХХ.
Добавление незначащих нулей связано с тем обстоятельством, что запись и чтение чисел обычно ведется побайтно, а в байте именно два шестнадцатеричных разряда или восемь двоичных. Если число имеет разрядность больше байта, т. е. представляет собой слово, то для обозначения этого факта слева дописываются еще нули, так, шестнадцатиразрядное двоичное число 13 правильно записать, как 0000 0000 0000 1101b, а в НЕХ-формате оно будет иметь 4 разряда, т. е. запишется, как 000Dh. Поглядев на эти две записи, вы можете понять, для чего пользуются шестнадцатеричной системой — запись получается намного компактней.
Формат BCD
Электронные устройства «заточены» под двоичную и родственные им системы счисления, потому что основой являются два состояния — двоичная цифра. Так что соединив несколько устройств вместе с целью оперирования с многоразрядными числами, мы всегда будем получать именно двоичное число. При этом четыре двоичных разряда могут представлять шестнадцать различных состояний, и задействовать их для представления десятичных чисел было бы попросту неэкономично: часть возможного диапазона осталась бы неиспользованной. Подсчитайте сами: для представления числа с шестью десятичными разрядами в десятичном виде нужно 6 х 4 = 24 двоичных разряда, а для представления того же числа в двоичном виде с избытком хватит 20 разрядов (2 20= 1 048 576). А меньше, чем четыре двоичных разряда, для представления одного десятичного числа не хватит (2 3= 8). К тому же с чисто двоичными числами, как мы увидим в дальнейшем, оперировать значительно проще.
И все же применять двоично-десятичный формат приходится всегда, когда речь идет о выводе чисел, например, на цифровой дисплей — двоичные или шестнадцатеричные числа человеку воспринимать, естественно, тяжело: представьте, что мы показываем температуру в виде 1E,D градуса по Цельсию! Многие ли сразу подсчитают, что это означает (примерно) 30,81 градуса?
Поэтому приходится преобразовывать шестнадцатеричные числа в десятичные и хранить их в таких же байтовых регистрах или ячейках памяти. Это можно делать двумя путями: в виде упакованного и неупакованного BCD.
Неупакованный формат попросту означает, что мы тратим на каждую десятичную цифру не тетраду, как необходимо, а целый байт. Зато при этом не возникает разночтений: 05h = 05 10и никаких проблем.
Однако ясно, что это крайне неэкономично — байтов требуется в два раза больше, а старший полубайт при этом все равно всегда ноль. Потому BCD-числа при хранении в регистрах всегда упаковывают, занимая и старший разряд второй десятичной цифрой: скажем, число 59 при этом и запишется, как просто 59. Однако это не 59h! 59 в шестнадцатеричной форме есть 3Bh, как мы установили ранее, а наше 59 процессор прочтет, как 5∙16 + 9 = 89, что вообще ни в какие ворота не лезет! Поэтому перед проведением операций с упакованными BCD-числами их распаковывают, перемещая старший разряд в отдельный байт и заменяя в обоих байтах старшие полубайты нулями. Иногда для проведения операций с BCD в микропроцессоре или микроконтроллере предусмотрены специальные команды, так что самостоятельно заниматься упаковкой-распаковкой не требуется (такие инструкции есть, например, в системе команд знаменитого 8086, на котором был построен IBM PC). В качестве примера хранения чисел в BCD-формате можно привести значения часов, минут и секунд в энергонезависимых часах компьютера.
Читать дальше
Конец ознакомительного отрывка
Купить книгу