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
Author: Andrzej Grażyński
Date: Wed, 07 Apr 2010 20:36
Date: Wed, 07 Apr 2010 20:36
8 lines
1106 bytes
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
Author: Bernard
Date: Fri, 09 Apr 2010 08:40
Date: Fri, 09 Apr 2010 08:40
14 lines
1627 bytes
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
Author: Andrzej Grażyński
Date: Fri, 09 Apr 2010 20:58
Date: Fri, 09 Apr 2010 20:58
27 lines
1713 bytes
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
Author: Bernard
Date: Sun, 11 Apr 2010 19:56
Date: Sun, 11 Apr 2010 19:56
36 lines
2352 bytes
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
Author: Michoo
Date: Sun, 11 Apr 2010 20:10
Date: Sun, 11 Apr 2010 20:10
15 lines
1522 bytes
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
Author: Bernard
Date: Sun, 11 Apr 2010 21:26
Date: Sun, 11 Apr 2010 21:26
17 lines
1864 bytes
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
Author: Andrzej Grażyński
Date: Sun, 11 Apr 2010 21:38
Date: Sun, 11 Apr 2010 21:38
18 lines
1781 bytes
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
Author: Bogdan (bogdro)
Date: Fri, 16 Apr 2010 16:11
Date: Fri, 16 Apr 2010 16:11
41 lines
2081 bytes
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
Author: Andrzej Grażyński
Date: Fri, 16 Apr 2010 22:16
Date: Fri, 16 Apr 2010 22:16
54 lines
2128 bytes
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
Author: Andrzej Grażyński
Date: Fri, 16 Apr 2010 22:17
Date: Fri, 16 Apr 2010 22:17
8 lines
973 bytes
973 bytes
> ; znana sztuczka: > xor al, bl > xor bl, al > xor al, bl a czemu nie xchg al,bl
Re: Jeszcze prostsza zagadka
Author: Bogdan (bogdro)
Date: Mon, 19 Apr 2010 16:29
Date: Mon, 19 Apr 2010 16:29
25 lines
1780 bytes
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