abc Asembler - elektronski priručnik
XIV dio Brojevi

BCD reprezentacija

Postoje 2 tipa BCD reprezentacije:

  • Raspakovana BCD reprezentacija
  • Pakovana BCD reprezentacija

U raspakovanoj BCD reprezentaciji, svaki bajt sprema binarni ekvivalent decimalne cifre. Na primjer, broj 1234 je spremljen kao:

01   02   03   04H

Postoje 2 instrukcije za procesiranje ovih brojeva:

  • AAM - ASCII Adjust After Multiplication
  • AAD - ASCII Adjust Before Division

Četiri ASCII adjust instrukcije, AAA, AAS, AAM i AAD, mogu se takođe koristiti sa raspakovanom BCD reprezentacijom. U pakovanoj BCD reprezentaciji, svaka cifra je spremljena pomoću 4 bita. Dve decimalne cifre su pakovane u jedan bajt. Na primjer, broj 1234 je spremljen kao:

12   34H

Postoje 2 instrukcije za procesiranje ovih brojeva:

  • DAA - Decimal Adjust After Addition
  • DAS - decimal Adjust After Subtraction

Ne postoji podrška za množenje i dijeljenje u pakovanoj BCD reprezentaciji.

Primjer
Sljedeći program sabira dva 5-cifrena decimalna broja i prikazuje sumu. On koristi gore navedene koncepte:

section   .text
      global _start 	;must be declared for using gcc

_start: 			       ;tell linker entry point
         mov   esi, 4 	   ;pointing to the rightmost digit
         mov   ecx, 5      ;num of digits
         clc
add_loop:
         mov   al,  [num1 + esi]
         adc   al,  [num2 + esi]
         aaa
         pushf
         or    al, 30h
         popf
         mov   [sum + esi], al
         dec   esi
         loop  add_loop
         mov   edx,  len 	;message length
         mov   ecx,  msg 	;message to write
         mov   ebx, 1 		;file descriptor (stdout)
         mov   eax, 4 		;system call number (sys_write)
         int   0x80 		;call kernel

         mov   edx, 5 		;message length
         mov   ecx, sum 	;message to write
         mov   ebx, 1 		;file descriptor (stdout)
         mov   eax, 4 		;system call number (sys_write)
         int   0x80 		;call kernel
         mov   eax, 1 		;system call number (sys_exit)
         int   0x80 		;call kernel

section   .data
msg   db  'Suma je:', 0xa
len     equ $ - msg
num1 db  '12345'
num2 db  '23456'
sum  db  '          '

Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:

Suma je:
35801

ASCII reprezentacija    <    Index    >    Stringovi