Dezimalzahlen in Maschinensprache können als Acht-Bit-Folgen von Einsen und Nullen, also Bytes, dargestellt werden. In diesem Fall gibt es zwei Arten von Formaten zur Darstellung von Dezimalzahlen. Es ist im gepackten Format ( BCD ) und entpackt.
Entpacktes Format
Bei diesem Format wird in einem Byte eine Dezimalstelle platziert. Nämlich im unteren Nibble eines Bytes, während das obere Nibble (Zone genannt) mit Einsen gefüllt ist. Die Nummer 157 sieht zum Beispiel so aus.
Gepacktes Format - BCD
Im gepackten Format enthält ein Byte zwei Nachkommastellen und kann auch einen Zeichencode enthalten. Wie im folgenden Beispiel, das die Zahl "-1574" darstellt.
Konvertieren Sie eine Zahl in BCD in hexadezimal und umgekehrt
Bei der Arbeit mit Atmega-Mikrocontrollern kann es erforderlich sein, die Zahl im Hexadezimalformat in das gepackte Dezimalformat, also in das BCD-Format, umzuwandeln:
;======= Преобразование из BCD в HEX =================================================== BCD_to_HEX: push r16 ; Помещаем преобразуемую величину в стек andi r16,0b11110000 ; Маскируем регистр r16, как старший разряд swap r16 ; Меняем тетрады местами ldi r17,10 ; Записываем во вспомогательный регистр значение 10 mul r16,r17 ; Умножаем значение регистра r16 на 10, результат сохраняется ; в регистры r1, r0 pop r16 ; Изымаем сохраненную величину из стека andi r16,0b00001111 ; Маскируем регистр r16, как младший разряд add r16,r0 ; Производим сложение регистра r16 с регистром r0, ; в результате получаем двоичное число от 0 до 99 ret
Und auch die Rückwandlung:
;======= Преобразование из HEX в BCD ==================================================== HEX_to_BCD: clr r17 ; Очищаем регистр help HEX_to_BCD_l: subi r16,10 ; temp = temp — 10 brcs HEX_to_BCD_2 ; Прервать, если перенос установлен inc r17 ; Инкрементируем r17 rjmp HEX_to_BCD_l ; Проходим по циклу проверки заново HEX_to_BCD_2: subi r16,-10 ; компенсируем отрицательное значение в r16 swap r17 ; Меняем тетрады местами or r16,r17 ; Объединяем полученные значения в Упакованный BCD ret
Wie Sie bereits bemerkt haben, wird in diesen Programmen mit vier Registern gearbeitet: r0, r1, r16, r17. Das Zielregister ist in diesem Fall das Register r16. Außerdem arbeiten diese Programme mit Zahlen von 0 bis 99.
*Aufmerksamkeit. Damit die Bibliothek funktioniert, müssen Sie außerdem den Mikrocontroller-Stack initialisieren. Zum Beispiel wie folgt: *
;======= Макросы ======================================================================== ; Макрос вывода в порт или регистр .macro outi ldi r16, @1 out @0,R16 .endm ;======================================================================================== RESET: outi SPL,Low(RAMEND) ; Инициализация стека outi SPH,High(RAMEND)