i
МИКРОКОНТРОЛЛЕРЫ
t
соответствующее этой команде значение. В данном случае
команда jnz передаст управление обратно на команду с меткой
$1
, потому что флаг
Z
регистра состояния (именно он управля-
ет командой jnz) установлен в лог.О (именно в таком состоянии
он должен находиться, чтобы команда jnz выполнилась), и про-
цессор вновь выполнит команду
subi.
Теперь команда
subi
снова
вычтет из ячейки
%а1
единицу, полученный результат будет
равен -2, и снова команда jnz передаст управление на команду
subi,
и так будет продолжаться до тех пор, пока в результате
вычитания в ячейке
%а1
не получится
ноль.
“Позвольте, а откуда он там получится?” - возникает впол-
не резонный вопрос. Ведь число становится все меньше и мень-
ше нуля - как же оно “скакнет” обратно в ноль? И вот здесь
необходимо сделать еще одно отступление - на этот раз о том,
как обрабатывается в микроконтроллерах (и не только в них)
знак числа.
Для того, чтобы отличить при работе положительные числа
от отрицательных, исторически сложилось три способа пред-
ставления знака числа:
1. Т.н. прямой код. При таком представлении знака, в поле,
где хранится число, выделяется один специальный бит для хра-
нения знака. Если в нем содержится лог.О, число считается по-
ложительным, если лог. 1 -отрицательным. Предположим, что
в байте для этого отведен бит 7. Тогда число 5 будет храниться
в байте в виде 00000101Ь, а число -5 - в виде 10000101 b (как
видите, изменился только один бит знака). Самый известный
пример прямого кода -
обычная десятичная система,
кото-
рой мы все владеем со школьных времен: знак числа указыва-
ется черточкой (знак “минус”) перед числом. Нет черточки (лог.О)
-число положительное, есть (лог.1) - число отрицательное.
2. Т.н. обратный код. При таком представлении числа для
хранения знака также отводится один бит, но если в поле хра-
нится отрицательное число, то в нем не только изменяется бит
знака с лог.О на лог.1, но и все остальные биты этого поля
из-
меняются на противоположные
(инвертируются). Число -5,
представленное в обратном коде, хранилось бы в байте в виде
11111010b. Обратный код для хранения чисел сейчас практи-
чески не применяется.
3. Т.н. дополнительный код. Он очень похож на обратный
код, но для хранения отрицательных чисел в нем не только ин-
вертируются все биты, но к полученному результату еще и
при-
бавляется число
1. Число -5 в дополнительном коде храни-
лось бы в виде 11110111Ь.
Сейчас для хранения чисел в микроконтроллерах повсеме-
стно принят дополнительный код. Причины для этого три:
1. Как в прямом, так и в обратном коде, существует
два
разных способа
представления нуля! Это “ноль с плюсом” и
“ноль с минусом” (например, “ноль с плюсом” в прямом коде
выглядит как 0000000b, а “ноль с минусом” - как ЮООООООЬ).
Но в природе-то ноль существует один! Поэтому при работе
как в прямом, так и в обратном коде, аппаратура процессора
должна особым образом проводить проверку нуля, что отнюдь
не способствует ее упрощению.
2. Как в прямом, так и в обратном коде при выполнении,
например, операции сложения, аппаратура процессора долж-
на
особым образом
анализировать знак числа, и, например,
вместо сложения, выполнить на самом деле вычитание! Это
также приводит к усложнению аппаратуры.
3. Как в прямом, так и в обратном коде нет достаточно про-
стых средств работы с
многобайтными числами. В
самом
деле, в одном байте можно хранить число, не превышающее
255. Если в программе требуется работать с большими числа-
ми (тысячи, десятки тысяч), можно было бы хранить такое чис-
ло не в одном, а в двух, трех и т.д. байтах. Но знаковый бит -
совершенно особая сущность: ее не “растолкаешь” по каждо-
му байту, а, значит, аппаратура процессора должна заранее
проанализировать знаковый бит, чтобы затем выбирать пра-
вильные операции (сложение или вычитание) при обработке
каждого байта.
И все эти три причины (точнее, три проблемы) решаются
применением дополнительного кода.
1. Во-первых, ноль в дополнительном коде
только один.
Давайте попробуем изменить знак нуля: ООООООООЬ ->
11111111Ь (инвертировали) —>11111111Ь + 1 (прибавили еди-
ницу) -» ООООООООЬ и сигнал переноса в следующий байт (вспом-
ните, как работают счетчики). Обратите внимание - именно сиг-
нал переноса и заносится во флаг
С
регистра состояния. Как
видите, ноль в дополнительном коде бывает только один!
2. Во-вторых, при выполнении операции
не требуется
про-
верять специальным образом знак числа. Давайте сложим чис-
ло 3(00000011Ь) и-1 (11111111Ь): 0000000011Ь +11111111Ь =
00000010Ь и сигнал переноса в следующий байт. Код00000010Ь
- этот как раз и есть внутреннее представление числа 2! При
представлении чисел в дополнительном коде правильный ре-
зультат получается как бы “сам собой”, что значительно упро-
щает аппаратуру процессора.
3. В-третьих, работа с многобайтными числами, представ-
ленными в дополнительном коде, ведется
элементарно про-
стыми
средствами. Давайте прибавим в числу -1, представ-
ленному в виде четырех байт (в четырех байтах можно хранить
число величиной около 2 миллиардов!), единицу: 11111111Ь,
11111111Ь, 11111111Ь, 11111111Ь+1 ->11111111Ь,11111111Ь,
11111111Ь, ООООООООЬ и перенос из первого байта во второй ->
11111111Ь, 11111111Ь, ООООООООЬ, ООООООООЬ и перенос из вто-
рого байта в третий -> 11111111Ь, ООООООООЬ, ООООООООЬ,
ООООООООЬ и перенос из третьего байта в четвертый ->
ООООООООЬ, ООООООООЬ, ООООООООЬ, ООООООООЬ и перенос-уже
неизвестно куда. Как и ожидалось, при сложении чисел -1 и
единицы получился ноль (точнее, четыре байта нулей), при-
чем ни в какие знаковые биты заглядывать предварительно
не пришлось. Для выполнения операции сложения с флагом
переноса в системе команд микроконтроллера даже предус-
мотрена специальная команда
абс,
и точно такая же команда
предусмотрена для случая вычитания многобайтных чисел -
вычитание с заемом
эЬс
(мы воспользуемся ими уже в следу-
ющей статье).
Повторим еще раз, все числа практически на всех компь-
ютерах (не только в микроконтроллерах) представляются сей-
час в дополнительном коде. Но и прямой код находит приме-
нение: с его помощью представляются в компьютерах т.н. ве-
щественные числа, используемые в научных расчетах - дело
в том, что в прямом коде намного проще реализуются опера-
ции умножения и деления, составляющие львиную долю всех
операций над вещественными числами. В микроконтролле-
рах (по крайней мере, в 8-битных) вещественные числа не ис-
пользуются.
Ну а теперь можно вернуться к нашему вопросу - “откуда
там получится ноль”. Обратите еще раз внимание на последний
пример с многобайтными числами: складывается впечатение,
что аппаратуре процессора вообще наплевать на знак числа!
-----------------------------------------------------------------------1
45
Радиолюбитель - 0 7 /2 0 0 5 |
предыдущая страница 48 Радиолюбитель 2005-07 читать онлайн следующая страница 50 Радиолюбитель 2005-07 читать онлайн Домой Выключить/включить текст