Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Mnożenie liczb BCD(wstawka asemblerowska)

12 Lis 2010 13:13 1124 1
  • Poziom 1  
    Witam wszystkich potrzebuje pomocy mam do napisania program który liczy iloczyn liczb BCD. Napisałem program w którym mnożna jest obojętnej długości natomiast mnożnik na razie jest z jednej liczby niestety ten program mi nie chce poprawnie działać.Bardzo prosił bym o pomoc poniżej wklejam mój kod.

    Code:
    #include<iostream>
    


    using namespace std;
    void iloczyn(char *a,char *b, char *c, int n,int M)
    {
       __asm{

          pusha;
          pushf;

          mov ecx,n;
          mov esi,a;
          
          mov edi,b;
          mov ebx,M;

          add edi,ebx;
    pe:
          mov al,[esi];
          mov bl,[edi];
          mul bl;
          aam;//Po korekcie Ah liczba przeniesienie a w al reszta
          push ax;//wysylamy ah i al na stos
          inc esi;//przechodzimy do drugiego elementu mnoznej
          loop pe;//jezeli nie doszlismy do konca mnoznej wyknouj petle

          xor ecx,ecx;//ustawiamy flage przeniesienia na 0
          mov edi,c;//wpisujemy tablice do edx
          mov ecx,n;//wpisujemy do ecx rozmiar mnoznej
          pop ax;//sciagamy ze stosu ostatni wrzucone tam liczby
          mov [ecx+esi],al;//do ostatniego elementu tablicy wpisujemy al=reszte ktura sciagnelismy ze stosu
          mov bl,ah;//do bl wpisujemy wartosc przeniesienia ktore sciagnelismy ze stosu
          dec ecx;//zmniejszamy ecx

    suma:
          pop ax;//sciagamy kolejne liczby ze stosu;
          adc al,bl;//do al dodaje przeniesienie z poprzedniej liczby sciagnietej ze stosu i flage CF( w razie wystapienia przeniesienia w poprzednim dodawaniu dodaje tez wartosc flagi CF)
          aaa;//korekta dodawania do al wyniku z dodawania gdy jest przeniesienie rejestr ah zwieksza sie
          mov [edx+ecx],al;//do tablicy c wpisany zostaje al(z wczesniejszego dodawania)
          mov bl,ah;//do bl wpisujemy przeniesienie sciagniete ze stosu
          loop suma;//jezeli ecx nie bedzie zerem bedzie petla

          mov [edi],bl;//na sam poczatek wpisanie przeniesienia

          popa;
          popf;



       }
       cout<<"wynik wynosi :"<<endl;
       for(int i=0 ; i<n ; i++)
       {
          cout<<(int)c[i]<<" ";
       }


    }

    int _tmain(int argc, _TCHAR* argv[])
    {
       int n;
        cout<<"Podaj rozmiar "<<endl;
        cin>>n;
       int N=n+1;
       int M;
       cout<<"Podaj rozmiar "<<endl;
       cin>>M;
       int m=M+1;
       
       char *a=new char[N];
        char *b=new char[m];
       char *c=new char[N+m];
        for(int i=1 ; i<N ; i++)
        {
           cout<<"Podaj a["<<i<<"]"<<"  ";
           cin>>a[i];
        }
        cout<<endl;
        for(int i=1 ; i<m ; i++)
        {
        cout<<"Podaj b["<<i<<"]"<<"  ";
           cin>>b[i];
        }
        

       iloczyn(a,b,c,N,m);
       system("Pause");
       return 0;
    }


    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • Poziom 25  
    Co do problemu to chwilowo nic nie dodam. Zauważyłem jednak że nie zwalniasz zaalokowanej pamięci a w C++ to poważny błąd. Każdy new powinien być w parze z delete, a ponieważa alokujesz tablice powinieneś użyć delete[].