🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #1789

Re: Transpozycja tablicy w C & Asembler

#1789
From: Bogdan (bogdro)
Date: Sun, 13 Apr 2008 09:40
72 lines
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-mail
References: <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