Article View: pl.comp.lang.asm
Article #1790Re: Transpozycja tablicy w C & Asembler
From: doles2
Date: Sun, 13 Apr 2008 20:01
Date: Sun, 13 Apr 2008 20:01
87 lines
4629 bytes
4629 bytes
On 13 Kwi, 11:40, "Bogdan (bogdro)" <bog...@poczta.gazeta.pl> wrote:
>
> 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];
> }
> }
Główkowałem się nieco nad tym i napisałem coś takiego:
global transponuj
section .text
transponuj:
push ebp
mov ebp, esp
mov esi, [ebp+8]
mov edi, [ebp+12]
mov ecx, [ebp+16]
mov edx, [ebp+20]
xor eax, eax
petla_wiersze:
cmp ecx, eax
je koniec
xor ebx,ebx
petla_kolumny:
cmp edx, ebx
je koniec_kolumn
mul edx
add eax, ebx
push [esi + eax]
imul ebx,ecx
add ebx,eax
pop [edi + ebx]
inc ebx
jmp petla_kolumny
koniec_kolumn:
inc eax
jmp petla_wiersze
koniec:
leave
ret
> 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.
Tutaj miałem niebotyczny problem, bo takie przeliczenie trzeba wykonać
przed "push dword [esi+eax*edx+ebx];" i przed "pop dword [edi+ebx*ecx
+eax];". Przed pierwszą operacją pobrania elementu z tablicy źródłowej
to tam pikuś, ale gorzej z drugą gdzie potrzebuję starych wartości EAX
i EBX z pętli a nie po obliczeniach. W związku z tym ja już sam
pisałem mało wiele podobny kod ale nie potrafiłem sobie poradzić
właśnie z przechowaniem wartości tych liczników :/ Nie wiem gdzie mam
zrobić PUSH i POP aby je jakoś zachować albo jest jeszcze inny sposób.
Liczyłem sobie na kartce to jeśli nie popełniłem błędu albo nie znam
jakiegoś triku, to niestety nie da się użyć policzonego EAX (tego dla
elementu macierzy źródłowej) w pobraniu elementu dla macierzy
docelowej. Co operację to trzeba liczyć od nowa :(
> Jeszcze tylko pozostaje dopowiedzieć w razie czego, że warunek w
> pętli for sprawdzany jest u góry i już masz gotowy algorytm.
Na początku nie wiedziałem o co Ci chodzi, ale potem załapałem. Trzeba
sprawdzać warunek u góry pętli bo jeśli np EAX dawno jest równe ECX to
wykona się cała pętla, kod dawno coś naknoci z macierzami a warunek
sprawdzę dopiero na końcu :)
Pewnie pisząc tę wiadomość już dość mocno nadużywam Twojej
cierpliwości i dobrych chęci, zatem z góry przepraszam :)
Technical Details
Message-ID:
<1db7ace5-f629-4c01-9772-f7ad42889257@q1g2000prf.googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!news.nask.pl!news.nask.org.pl!news.uni-stuttgart.de!news.belwue.de!newsfeed01.sul.t-online.de!t-online.de!proxad.net!feeder1-2.proxad.net!64.233.178.134.MISMATCH!postnews.google.com!q1g2000prf.googlegroups.com!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> <ftske8$svs$1@inews.gazeta.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!news.nask.pl!news.nask.org.pl!news.uni-stuttgart.de!news.belwue.de!newsfeed01.sul.t-online.de!t-online.de!proxad.net!feeder1-2.proxad.net!64.233.178.134.MISMATCH!postnews.google.com!q1g2000prf.googlegroups.com!not-for-mail From: doles2@gmail.com Newsgroups: pl.comp.lang.asm Subject: Re: Transpozycja tablicy w C & Asembler Date: Sun, 13 Apr 2008 13:01:24 -0700 (PDT) Organization: http://groups.google.com Lines: 97 Message-ID: <1db7ace5-f629-4c01-9772-f7ad42889257@q1g2000prf.googlegroups.com> References: <ftm8vq$bl9$1@nemesis.news.neostrada.pl> <4800ac82$0$31457$f69f905@mamut2.aster.pl> <28cc2e2f-5986-4a3d-9ad4-2c847fa64b3d@q10g2000prf.googlegroups.com> <ftske8$svs$1@inews.gazeta.pl> NNTP-Posting-Host: 83.8.246.78 Mime-Version: 1.0 X-Trace: posting.google.com 1208116884 19882 127.0.0.1 (13 Apr 2008 20:01:24 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Sun, 13 Apr 2008 20:01:24 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: q1g2000prf.googlegroups.com; posting-host=83.8.246.78; posting-account=AhF93woAAADzKqj7ByrwtnLI5wHJPaQ_ User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.8.1.13) Gecko/20080325 Ubuntu/7.10 (gutsy) Firefox/2.0.0.13,gzip(gfe),gzip(gfe) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit