Zamiana z BCD do BIN

0

Witam,

Mam problem z konwersją liczby zakodowanej w formacie BCD na liczbę binarną, typ word - robię wszystko przez wstawki assemblerowe w Delphi. Zamianę na BCD już mam:

function bin2bcd(a:word):word;assembler;
asm
      mov bx,a; //w bx jest moja liczba
      mov ax,0  //zerowanie ax
      mov ecx,4  //petla 4 razy - liczba word jest 2 bajtowa
      mov si,10 //zmienna si -> dzielnik
@petla:mov dx,0 //zerowanie dx
      xchg ax,bx  //teraz moja liczba jest w ax
      div si      //dziele przez DX:AX przez SI -> reszta jest w DX, calkowita w AX
      xchg ax,bx  //znow moja liczba jest w bx
      add ax,dx   //dodaje reszte z dzielenia do liczby
      ror ax,4    //przekrecam liczbe o 4 bity
      loop @petla //wykonuje petle CX razy
end;

Jednak nadal nie mogę znaleźć prostego sposobu na zamianę z powrotem na liczbę binarną... Kombinowałem już trochę i na razie wymyśliłem, że mogę zrobić coś takiego, jednak nie przyniosło mi to rozwiązania...:

;Zakładam że mam liczbę w BCD w rejestrze BX
mov ax,bx
and ax,15 ;"wyjmuję" z liczby cyfrę jedności
add dx,ax ;dodaję cyfrę jedności do wyniku
rol bx,4 ;przekręcam liczbę o 4 bity

Jakiś pomysł?
0

A jednak sam sobie poradziłem. Nie wiem jak z "wydajnością" tego sposobu, ale najważniejsze że działa. Takie coś mi wyszło (może się komuś przyda :) ) Działa na liczbach typu word - 2 bajty, aby działało na większych należy rejestr ecx ustawić na 2*rozmiar typu:

function bcd2bin(b:word):word;assembler;
asm
  mov bx,b //w bx jest moja liczba
  mov ax,0 //zeruje bx
  mov dx,0 //zeruje dx
  mov si,10 //mnozna = 10
  mov ecx,4 //petla 4 razy
  @petla:
    rol bx,4    //przesuniecie liczby bcd o 4 bity
    mul si      //mnoze ax przez 10 [czyli wynik]
    mov dx,bx   //dx := moja liczba
    and dx,15   //wydobywam liczbe jednosci z liczby
    add ax,dx   //dodaje liczbe jednosci do wyniku
  loop @petla
  mov bx,ax //to dziala
end; 

1 użytkowników online, w tym zalogowanych: 0, gości: 1