🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Transpozycja tablicy w C & Asembler

#1790
From: doles2
Date: Sun, 13 Apr 2008 20:01
87 lines
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-mail
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>

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