Article View: pl.comp.lang.asm
Article #1789Re: Transpozycja tablicy w C & Asembler
From: Bogdan (bogdro)
Date: Sun, 13 Apr 2008 09:40
Date: Sun, 13 Apr 2008 09:40
72 lines
3467 bytes
3467 bytes
doles2@gmail.com pisze:
> Problem
> polega na tym, że kombinowałem jak koń pod górkę aby napisać w
> Asemblerze funkcję która robiłaby to samo co taki zapis w C:
> for(i=0; i<A; i++)
> for(j=0; j<B; j++)
> transponowana[j][i] = macierz[i][j];
>
> Czyli po prostu takie przepisanie wartości aby indeksy były
> pozamieniane miejscami. Jak napisałem wcześniej chciałem użyć tego
> schematu adresowania tablic dwuwymiarowych. Miałem pomysł aby
> przypisać ESI np licznik "i", zaś dla EDI zmienną "j", jednak pomysł
> spalił na panewce bo wg moich (zapewne błędnych) wyliczeń zabrakło po
> prostu rejestrów ogólnego przeznaczenia. Potrzebuję dwóch rejestrów do
> zachowania początków tablic, dwóch rejestrów na licznik pętli i kolumn
> oraz jednego na bufor. Czyli aż chciało by się zapisać coś takiego:
> mov esi, [ebp+ 8] ;adres macierzy źródłowej
> mov edi, [ebp+12] ;adres macierzy docelowej
> mov eax, [ebp+16] ;załaduj ECX na wartość liczby A
> mov ebx, [ebp+20] ;załaduj EDX na wartość liczby B
>
> imull eax,ebx
> mov ecx,eax
> petla:
> mov edx, [esi + (eax*ebx + edi)*4]
> mov [edi + (edi + (ebx*eax + esi)*4]
> inc esi
> inc edi
> loop petla
> ;tutaj coś dalej sam nie wiem co
> No ale takiego nienormalnego adresowania nie ma jak zapisałem a nawet
> gdyby było, to w ten sposób dostałbym się tylko do elementów [0][0],
> [1][1], [2][2] ... a co np z [0][1] ? Nie mam pojęcia.
Niech
int tab1[a][b];
int tab2[b][a];
Wtedy
tab1[i][j] = tab1[i*b+j] = [tab1+i*b+j];
tab2[j][i] = tab2[j*a+i] = [tab2+j*a+i];
W kodzie:
tab1 = esi
tab2 = edi
a = ecx
b = edx
for ( eax=0; eax < ecx; eax++ )
{
for ( ebx=0; ebx < edx; ebx++ )
{
push dword [esi+eax*edx+ebx];
pop dword [edi+ebx*ecx+eax];
}
}
Jak słusznie zauważyłeś, takie tryby adresowania nie istnieją,
trzeba więc te adresy poskładać:
EDX:EAX:=EAX*EDX
EAX:=EAX+EBX // EDX odrzucamy
push [esi+eax]
Podobnie drugi.
Jeszcze tylko pozostaje dopowiedzieć w razie czego, że warunek w
pętli for sprawdzany jest u góry i już masz gotowy algorytm.
--
Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Technical Details
Message-ID:
<ftske8$svs$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<ftm8vq$bl9$1@nemesis.news.neostrada.pl> <4800ac82$0$31457$f69f905@mamut2.aster.pl> <28cc2e2f-5986-4a3d-9ad4-2c847fa64b3d@q10g2000prf.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> Newsgroups: pl.comp.lang.asm Subject: Re: Transpozycja tablicy w C & Asembler Date: Sun, 13 Apr 2008 11:40:21 +0200 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 72 Message-ID: <ftske8$svs$1@inews.gazeta.pl> References: <ftm8vq$bl9$1@nemesis.news.neostrada.pl> <4800ac82$0$31457$f69f905@mamut2.aster.pl> <28cc2e2f-5986-4a3d-9ad4-2c847fa64b3d@q10g2000prf.googlegroups.com> NNTP-Posting-Host: 195.24.77.135 Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1208079626 29692 195.24.77.135 (13 Apr 2008 09:40:26 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Sun, 13 Apr 2008 09:40:26 +0000 (UTC) X-User: bog.d In-Reply-To: <28cc2e2f-5986-4a3d-9ad4-2c847fa64b3d@q10g2000prf.googlegroups.com> User-Agent: Thunderbird 2.0.0.12 (X11/20080213) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit