🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
11 messages
11 total messages Started by Andrzej Grażyński Wed, 07 Apr 2010 20:36
Jeszcze prostsza zagadka
#2174
Author: Andrzej Grażyński
Date: Wed, 07 Apr 2010 20:36
8 lines
1106 bytes
Są instrukcje CPMS?, MOVS?, SCAS?, LODS? i STOS?, nie ma instrukji 
ZAMIENIAJĄCYCH ZAWARTOŚĆ: XCHGS? (ES:[DI] <-> DS:[SI]) ani SWAPS? 
(akumulator<-> ES:[DI})


No właśnie: dane są dwa pola, adresy w DS:[SI] i ES:[DI], długość w 
bajtach w ECX. Jak je efektywnie zamienić? Przewidzieć akcję w obu 
kierunkach, bo pola mogą się nakładać i efekt będzie różny.
Re: Jeszcze prostsza zagadka
#2175
Author: Bernard
Date: Fri, 09 Apr 2010 08:40
14 lines
1627 bytes
On 2010-04-07 22:36, Andrzej Grażyński wrote:
> Są instrukcje CPMS?, MOVS?, SCAS?, LODS? i STOS?, nie ma instrukji
> ZAMIENIAJĄCYCH ZAWARTOŚĆ: XCHGS? (ES:[DI] <-> DS:[SI]) ani SWAPS?
> (akumulator<-> ES:[DI})
>
>
> No właśnie: dane są dwa pola, adresy w DS:[SI] i ES:[DI], długość w
> bajtach w ECX. Jak je efektywnie zamienić? Przewidzieć akcję w obu
> kierunkach, bo pola mogą się nakładać i efekt będzie różny.

Zdefinuj najpierw co oznacza ta "wymiana" dla nakładających się 
obszarów. Weźmy np. dwa nakładające się obszary po 2 bajty, mające 
łącznie 3 bajty: 1, 2, 3. Pierwszy - to "1, 2", drugi - "2, 3". Jaki ma 
być wynik?
Re: Jeszcze prostsza zagadka
#2176
Author: Andrzej Grażyński
Date: Fri, 09 Apr 2010 20:58
27 lines
1713 bytes
Bernard pisze:
> On 2010-04-07 22:36, Andrzej Grażyński wrote:
>> Są instrukcje CPMS?, MOVS?, SCAS?, LODS? i STOS?, nie ma instrukji
>> ZAMIENIAJĄCYCH ZAWARTOŚĆ: XCHGS? (ES:[DI] <-> DS:[SI]) ani SWAPS?
>> (akumulator<-> ES:[DI})
>>
>>
>> No właśnie: dane są dwa pola, adresy w DS:[SI] i ES:[DI], długość w
>> bajtach w ECX. Jak je efektywnie zamienić? Przewidzieć akcję w obu
>> kierunkach, bo pola mogą się nakładać i efekt będzie różny.
> 
> Zdefinuj najpierw co oznacza ta "wymiana" dla nakładających się 
> obszarów. Weźmy np. dwa nakładające się obszary po 2 bajty, mające 
> łącznie 3 bajty: 1, 2, 3. Pierwszy - to "1, 2", drugi - "2, 3". Jaki ma 
> być wynik?

Już zdefiniowałem. idąc od lewej, kolejno:

A[1] <=> B[1]
A[2] <=> B[2]
A[3] <=> B[3]

Idąc od prawej, kolejno:

A[3] <=> B[3]
A[2] <=> B[2]
A[1] <=> B[1]
Re: Jeszcze prostsza zagadka
#2177
Author: Bernard
Date: Sun, 11 Apr 2010 19:56
36 lines
2352 bytes
On 2010-04-09 22:58, Andrzej Grażyński wrote:
> Bernard pisze:
>> On 2010-04-07 22:36, Andrzej Grażyński wrote:
>>> Są instrukcje CPMS?, MOVS?, SCAS?, LODS? i STOS?, nie ma instrukji
>>> ZAMIENIAJĄCYCH ZAWARTOŚĆ: XCHGS? (ES:[DI] <-> DS:[SI]) ani SWAPS?
>>> (akumulator<-> ES:[DI})
>>>
>>>
>>> No właśnie: dane są dwa pola, adresy w DS:[SI] i ES:[DI], długość w
>>> bajtach w ECX. Jak je efektywnie zamienić? Przewidzieć akcję w obu
>>> kierunkach, bo pola mogą się nakładać i efekt będzie różny.
>>
>> Zdefinuj najpierw co oznacza ta "wymiana" dla nakładających się
>> obszarów. Weźmy np. dwa nakładające się obszary po 2 bajty, mające
>> łącznie 3 bajty: 1, 2, 3. Pierwszy - to "1, 2", drugi - "2, 3". Jaki
>> ma być wynik?
>
> Już zdefiniowałem. idąc od lewej, kolejno:
>
> A[1] <=> B[1]
> A[2] <=> B[2]
> A[3] <=> B[3]
>
> Idąc od prawej, kolejno:
>
> A[3] <=> B[3]
> A[2] <=> B[2]
> A[1] <=> B[1]


Nic nie zdefiniowałeś ;)

Mamy trzy bajty, o wartościach 1, 2 i 3. Tworzą one nakładające się dwa 
obszary po dwa bajty każdy (1, 2) i (2, 3), które należy zamienić 
miejscami. Wynik to albo 2, 3, 2 albo 2, 1, 2 i nie da się powiedzieć, 
który lepszy, więc nie da się tego sensownie zdefiniować.
Re: Jeszcze prostsza zagadka
#2178
Author: Michoo
Date: Sun, 11 Apr 2010 20:10
15 lines
1522 bytes
Bernard pisze:
> Mamy trzy bajty, o wartościach 1, 2 i 3. Tworzą one nakładające się dwa 
> obszary po dwa bajty każdy (1, 2) i (2, 3), które należy zamienić 
> miejscami. Wynik to albo 2, 3, 2 albo 2, 1, 2 i nie da się powiedzieć, 
> który lepszy, więc nie da się tego sensownie zdefiniować.

Masz 2 obszary - obszar to ciąg kolejnych LOKALIZACJI w pamięci a nie 
WARTOŚCI w pamięci - A=(A_0,A_1) i B=(B_0,B_1), przy czym B_0=A_1

najpierw zamieniasz zawartość A_0 z B_0 i dostajesz 2,1,3
potem zamieniasz A_1 z B_1 i dostajesz 2,3,1

-- 
Pozdrawiam
Michoo
Re: Jeszcze prostsza zagadka
#2179
Author: Bernard
Date: Sun, 11 Apr 2010 21:26
17 lines
1864 bytes
On 2010-04-11 22:10, Michoo wrote:
> Bernard pisze:
>> Mamy trzy bajty, o wartościach 1, 2 i 3. Tworzą one nakładające się
>> dwa obszary po dwa bajty każdy (1, 2) i (2, 3), które należy zamienić
>> miejscami. Wynik to albo 2, 3, 2 albo 2, 1, 2 i nie da się powiedzieć,
>> który lepszy, więc nie da się tego sensownie zdefiniować.
>
> Masz 2 obszary - obszar to ciąg kolejnych LOKALIZACJI w pamięci a nie
> WARTOŚCI w pamięci - A=(A_0,A_1) i B=(B_0,B_1), przy czym B_0=A_1
>
> najpierw zamieniasz zawartość A_0 z B_0 i dostajesz 2,1,3
> potem zamieniasz A_1 z B_1 i dostajesz 2,3,1
>

A jeśli najpierw zamienię A1 z B1, a potem A0 z B0?

Jak widać mocno nieostra ta "definicja".
Re: Jeszcze prostsza zagadka
#2180
Author: Andrzej Grażyński
Date: Sun, 11 Apr 2010 21:38
18 lines
1781 bytes
Bernard pisze:
> On 2010-04-11 22:10, Michoo wrote:
>> Bernard pisze:
>>> Mamy trzy bajty, o wartościach 1, 2 i 3. Tworzą one nakładające się
>>> dwa obszary po dwa bajty każdy (1, 2) i (2, 3), które należy zamienić
>>> miejscami. Wynik to albo 2, 3, 2 albo 2, 1, 2 i nie da się powiedzieć,
>>> który lepszy, więc nie da się tego sensownie zdefiniować.
>>
>> Masz 2 obszary - obszar to ciąg kolejnych LOKALIZACJI w pamięci a nie
>> WARTOŚCI w pamięci - A=(A_0,A_1) i B=(B_0,B_1), przy czym B_0=A_1
>>
>> najpierw zamieniasz zawartość A_0 z B_0 i dostajesz 2,1,3
>> potem zamieniasz A_1 z B_1 i dostajesz 2,3,1
>>
> 
> A jeśli najpierw zamienię A1 z B1, a potem A0 z B0?

No przecież wyraźnie zaznaczyłem, że efekt jest zależny od kierunku.
Re: Jeszcze prostsza zagadka
#2181
Author: Bogdan (bogdro)
Date: Fri, 16 Apr 2010 16:11
41 lines
2081 bytes
W dniu 07.04.2010 22:36, Andrzej Grażyński pisze:
> Są instrukcje CPMS?, MOVS?, SCAS?, LODS? i STOS?, nie ma instrukji
> ZAMIENIAJĄCYCH ZAWARTOŚĆ: XCHGS? (ES:[DI] <-> DS:[SI]) ani SWAPS?
> (akumulator<-> ES:[DI})
> 
> 
> No właśnie: dane są dwa pola, adresy w DS:[SI] i ES:[DI], długość w
> bajtach w ECX. Jak je efektywnie zamienić? Przewidzieć akcję w obu
> kierunkach, bo pola mogą się nakładać i efekt będzie różny.

 Chodziło o coś w tym stylu?

	mov	dx, kierunek	; 1 = do przodu, -1 = do tyłu

	cmp	dx, 1
	je	petla
		; co prawda długość jest w ECX, ale skoro adresy są
		; 16-bitowe, to starsze bity długości sobie darujemy
	add	si, cx
	dec	si
	add	di, cx
	dec	di
petla:
	mov	al, [ds:si]
	mov	bl, [es:di]
		; znana sztuczka:
	xor	al, bl
	xor	bl, al
	xor	al, bl
		; AL zamienione z BL - zapisz z powrotem
	mov	[ds:si], al
	mov	[es:di], bl
	add	si, dx		; +- 1
	add	di, dx
	loop	petla

-- 
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
Re: Jeszcze prostsza zagadka
#2182
Author: Andrzej Grażyński
Date: Fri, 16 Apr 2010 22:16
54 lines
2128 bytes
Bogdan (bogdro) pisze:
> W dniu 07.04.2010 22:36, Andrzej Grażyński pisze:
>> Są instrukcje CPMS?, MOVS?, SCAS?, LODS? i STOS?, nie ma instrukji
>> ZAMIENIAJĄCYCH ZAWARTOŚĆ: XCHGS? (ES:[DI] <-> DS:[SI]) ani SWAPS?
>> (akumulator<-> ES:[DI})
>>
>>
>> No właśnie: dane są dwa pola, adresy w DS:[SI] i ES:[DI], długość w
>> bajtach w ECX. Jak je efektywnie zamienić? Przewidzieć akcję w obu
>> kierunkach, bo pola mogą się nakładać i efekt będzie różny.
> 
>  Chodziło o coś w tym stylu?
> 
> 	mov	dx, kierunek	; 1 = do przodu, -1 = do tyłu
> 
> 	cmp	dx, 1
> 	je	petla
> 		; co prawda długość jest w ECX, ale skoro adresy są
> 		; 16-bitowe, to starsze bity długości sobie darujemy
> 	add	si, cx
> 	dec	si
> 	add	di, cx
> 	dec	di
> petla:
> 	mov	al, [ds:si]
> 	mov	bl, [es:di]
> 		; znana sztuczka:
> 	xor	al, bl
> 	xor	bl, al
> 	xor	al, bl
> 		; AL zamienione z BL - zapisz z powrotem
> 	mov	[ds:si], al
> 	mov	[es:di], bl
> 	add	si, dx		; +- 1
> 	add	di, dx
> 	loop	petla
> 


A nie lepiej zamieniać w ten sposób:


MOV  AL,ES:[DI]
MOVSB
MOV  [SI+BX],AL

(w BX jest -1 dla kierunku w przód i 1 dla kierunku w tył)

albo

MOV  BX,SI
MOV  AL,ES:[DI]
MOVSB
MOV  [BX],AL
Re: Jeszcze prostsza zagadka
#2183
Author: Andrzej Grażyński
Date: Fri, 16 Apr 2010 22:17
8 lines
973 bytes
> 		; znana sztuczka:
> 	xor	al, bl
> 	xor	bl, al
> 	xor	al, bl

a czemu nie

   xchg al,bl
Re: Jeszcze prostsza zagadka
#2184
Author: Bogdan (bogdro)
Date: Mon, 19 Apr 2010 16:29
25 lines
1780 bytes
W dniu 17.04.2010 00:17, Andrzej Grażyński pisze:
>>         ; znana sztuczka:
>>     xor    al, bl
>>     xor    bl, al
>>     xor    al, bl
> 
> a czemu nie
> 
>   xchg al,bl

 A, bo takie coś po prostu mi się przypomniało, jako ciekawostka.
Można też tradycyjnie, coś w stylu:
	mov	ah, al
	mov	al, bl
	mov	bl, ah
 Metody XOR i XCHG nie wymagają jednak dodatkowego rejestru. Nie
jestem pewien, ale chyba gdzieś metodę XOR przedstawiano jako lepszą
niż XCHG. Może ze względu na szybkość. Nie ośmielam się twierdzić, że
moje rozwiązanie jest najlepsze.

-- 
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