Decimal numbers machine language may be represented in the form of eight-bit sequences of ones and zeros, that is bytes. However, there are two types of presentation formats decimal numbers. It is packed format (BCD), and unpacked.
Uncompressed format
In this format, one digit of a decimal number is placed in one byte. Namely LSnibble bytes, whereas the most significant nibble (referred to as a zone) is filled units. For example, the number 157 would be as follows.
Packed Format - BCD
The packed byte format includes two digits decimal number and may also include a character code. As in the following example below, which shows the number of "-1574".
Converting numbers in BCD to hexadecimal and back
When working with Atmega microcontrollers may need to convert the number into hexadecimal format packed decimal number, that is, in BCD format:
;======= Converting from BCD to HEX =================================================== BCD_to_HEX: push r16 ; We put the converted values on the stack andi r16,0b11110000 ; Mask the register r16, as the MSB swap r16 ; Change tetrad places ldi r17,10 ; Write to the auxiliary register 10 value mul r16,r17 ; Multiply the value of r16 register 10, the result is stored in the registers r1, r0 pop r16 ; get the stored value from the stack andi r16,0b00001111 ; Mask the register r16, as the LSB add r16,r0 ; Adds the r16 register with register r0, the result is a binary number from 0 to 99 ret
And the inverse transform:
;======= Converting from HEX to BCD ==================================================== HEX_to_BCD: clr r17 ; clear register help HEX_to_BCD_l: subi r16,10 ; temp = temp — 10 brcs HEX_to_BCD_2 ; Abort if the transfer set inc r17 ; Increment r17 rjmp HEX_to_BCD_l ; We pass on the testing cycle again HEX_to_BCD_2: subi r16,-10 ; compensate a negative value in r16 swap r17 ; Change tetrad places or r16,r17 ; Combine the received values in a packed BCD ret
As you can see, the work is done in these programs with four registers: r0, r1, r16, r17. Trust register in this case is the register r16. Also, these programs from working with numbers from 0 to 99.
Attention. Also for the library you want to initialize the stack of the microcontroller. For example as follows:
;======= Макросы ======================================================================== ; Output macro to the port or Register .macro outi ldi r16, @1 out @0,R16 .endm ;======================================================================================== RESET: outi SPL,Low(RAMEND) ; Init stack outi SPH,High(RAMEND)