Article View: pl.comp.lang.asm
Article #1788Re: Transpozycja tablicy w C & Asembler
From: doles2
Date: Sat, 12 Apr 2008 17:09
Date: Sat, 12 Apr 2008 17:09
53 lines
3613 bytes
3613 bytes
Bernard wrote:
>Zacznij od poprawienia błędu w epilogu - kolejność 2. i 3. instrukcji od
>końca. Ponadto prawdopodobnie kręcisz coś ze wskaźnikami - nietrudno o
>to przy tak zagmatwanym zapisie ich wyliczania i modyfikacji. Wyrzuć
>pushad i popad i wstaw to, co trzeba zgodnie z konwencją wołania.
Dzięki za pomoc. Faktycznie miałem skopane te rozkazy usuwające ramkę
stosu. Jednak to tylko wyeliminowało segmentation fault. Co gorsza
myślałem, że to koniec moich problemów ale oczywiście nie. 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. Użyłem takiego
głupiego kodu bo tylko tak pisząc to na kartce i robiąc próby
wychodziło mi teoretycznie dobranie się do wszystkich elementów obu
tablic. Jednak po uruchmieniu mam taki wynik:
0 1 2
3 4 5
------------------------------
196608 262144
327680 0
-1076123404 -1210122082
Wiem tylko tyle, że im bardziej się w to zagłębiam tym staję się
głupszy :(
Technical Details
Message-ID:
<28cc2e2f-5986-4a3d-9ad4-2c847fa64b3d@q10g2000prf.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!goblin1!goblin.stu.neva.ru!newspeer1.nac.net!border2.nntp.dca.giganews.com!nntp.giganews.com!postnews.google.com!q10g2000prf.googlegroups.com!not-for-mailReferences:
<ftm8vq$bl9$1@nemesis.news.neostrada.pl> <4800ac82$0$31457$f69f905@mamut2.aster.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!goblin1!goblin.stu.neva.ru!newspeer1.nac.net!border2.nntp.dca.giganews.com!nntp.giganews.com!postnews.google.com!q10g2000prf.googlegroups.com!not-for-mail From: doles2@gmail.com Newsgroups: pl.comp.lang.asm Subject: Re: Transpozycja tablicy w C & Asembler Date: Sat, 12 Apr 2008 10:09:45 -0700 (PDT) Organization: http://groups.google.com Lines: 65 Message-ID: <28cc2e2f-5986-4a3d-9ad4-2c847fa64b3d@q10g2000prf.googlegroups.com> References: <ftm8vq$bl9$1@nemesis.news.neostrada.pl> <4800ac82$0$31457$f69f905@mamut2.aster.pl> NNTP-Posting-Host: 83.8.249.10 Mime-Version: 1.0 X-Trace: posting.google.com 1208020185 491 127.0.0.1 (12 Apr 2008 17:09:45 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Sat, 12 Apr 2008 17:09:45 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: q10g2000prf.googlegroups.com; posting-host=83.8.249.10; 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