Thread View: pl.comp.lang.asm
2 messages
2 total messages
Started by Andrzej Grażyński
Thu, 15 Apr 2010 22:15
nic nowego - zagadka
Author: Andrzej Grażyński
Date: Thu, 15 Apr 2010 22:15
Date: Thu, 15 Apr 2010 22:15
14 lines
1108 bytes
1108 bytes
Dane są dwa pola przylegające do siebie. należy je zamienić miejscami, czyli mając AAA.....AAAABBBBBB...BBBBB zrobić BBBBBB....BBBBBBAAA....AAAA Zawartości i długości pól dowolne, jedyny warunek - pierwszy bajt pola B nastepuje bezpośrednio po ostatnim bajcie pola A. Zapis AAAAA lub BBBBB nie powinien sugerować, że wszystkie bajty w polu są jednakowe.
Re: nic nowego - zagadka
Author: Bogdan (bogdro)
Date: Fri, 16 Apr 2010 16:11
Date: Fri, 16 Apr 2010 16:11
56 lines
2765 bytes
2765 bytes
W dniu 16.04.2010 00:15, Andrzej Grażyński pisze: > Dane są dwa pola przylegające do siebie. należy je zamienić miejscami, > czyli mając > > AAA.....AAAABBBBBB...BBBBB > > zrobić > > BBBBBB....BBBBBBAAA....AAAA > > Zawartości i długości pól dowolne, jedyny warunek - pierwszy bajt pola B > nastepuje bezpośrednio po ostatnim bajcie pola A. > > Zapis AAAAA lub BBBBB nie powinien sugerować, że wszystkie bajty w polu > są jednakowe. Jak zwykle, na rozgrzewkę, podam najwolniejsze rozwiązanie: 1. Odwracasz kolejność bajtów w całym ciągu, dostając BBBB...BBBBAAA...AAAA ale z bajtami w polach w odwrotnej kolejności, niż potrzeba. 2. Odwracasz kolejność bajtów w polu "A" 3. Odwracasz kolejność bajtów w polu "B" Skoro nie zakładamy, że bajty w polach są jednakowe, to założyłem sobie, że ich długość znamy (tzn. nie musimy tego dodatkowo szukać, co dołożyłoby jeden krok do algorytmu). Sam kod (co prawda nie mój) jest jedną-dwie zagadki wcześniej - po prostu procedurę odwracania kolejności bajtów stosujemy 3 razy pod rząd (dlatego to na pewno nie będzie najszybsze rozwiązanie). Można też "przepychać" bajty po jednym na raz, coś w stylu: mov esi, adres_pola mov edi, dlugosc_B petla: mov al, [esi + dlugosc_A + dlugosc_B - 1] ; AL = ostatni bajt mov ecx, dlugosc_A + dlugosc_B - 1 mov edx, -1 petla2: mov bl, [esi + dlugosc_A + dlugosc_B - 1 + edx] mov [esi + dlugosc_A + dlugosc_B + edx], bl dec edx loop petla2 mov [esi], al ; ostatni teraz pierwszym dec edi jnz petla ; wypychamy wszystkie "B" -- 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
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads