Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

210 Часть //. Программирование микроконтроллеров АVR на ассемблере Естественно, для получения достаточно длинной последовательности такой алго­ ритм следует выполнять в цикле. «Искусственное» умножение на 5 в МК семейства Mega можно заменить, разумеется, командой mul, причем старший байт результата (он окажется в регистре rl) при этом следует игнорировать (листинг 8 . 9) . ldi temp , 5 mul N_random, temp ; умножили на 5 mov N_random, rO inc N_random ; прибавили с = 1 Операции с числами в двоично-десятичном формате (BCD) Операции с числами в двоично-десятичном формате (Ьinary-coded decimal, ВСD) ­ это важная группа операций, ведь значительная часть устройств на основе МК предназначена для демонстрации чисел в том или ином виде. Это, естественно, можно делать только в десятичном формате, в то время как внутреннее представле­ дие чисел в регистрах - двоичное . Напомним (см. приложение 1 ), что числа в двоично-десятичном формате могут существовать в двух видах: упакованном и неупакованном. Неупакованный формат попросту означает, что мы тратим на каждую десятичную цифру не тетраду, как необходимо, а целый байт. Зато при этом не возникает разночтений: $ 0 5 = 05 1 0, и никаких проблем. Однако ясно, что это крайне неэкономично: байтов требуется в два раза больше, а старший полубайт при этом все равно всегда ноль. Потому ВСD-числа при хране­ нии в регистрах всегда упаковывают, занимая и старший разряд второй десятичной цифрой, - скажем, число 59 при этом и запишется как просто 59 . Однако это не шестнадцатеричные $ 5 9 ! 59 в шестнадцатеричной форме запишется как $ ЗВ, а наше 59 процессор прочтет как 5 · 1 6 + 9 = 89, что вообще к нашим значениям не имеет отношения . Поэтому перед проведением операций с упакованными ВСD-числами их распаковывают, перемещая старший разряд в отдельный байт и заменяя в обоих байтах старшие полубайты нулями. В некоторых микропроцессорных системах (в их число входит интеловское семей­ ство х5 1 и, кстати, х86) имеется специальная инструкция для т. н. двоично­ десятичной коррекции, которая позволяет получить верный результат при сложе­ нии двоично-десятичных чисел в упакованном формате. Но в системе команд AVR такой инструкции нет, и она все равно не очень-то полезна, поскольку математиче­ ские операции в любом случае удобнее производить в «родной» двоичной форме, а для представления числа на дисплее так или иначе приходится распаковывать. В Arduino этим незаметно для пользователя занимаются функции вывода и ввода чисел (да так успешно, что приходится скорее озадачиваться обратной пробле­ мой - представлением десятичных чисел в двоичной/шестнадцатеричной форме),

RkJQdWJsaXNoZXIy MTExODQxMg==