🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#2205
Author: Andrzej Grażyński
Date: Thu, 15 Apr 2010 22:15
14 lines
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
#2206
Author: Bogdan (bogdro)
Date: Fri, 16 Apr 2010 16:11
56 lines
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