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
|