🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
15 messages
15 total messages Started by Andrzej Grażyński Wed, 07 Apr 2010 20:38
Równie prosta zagadka
#2185
Author: Andrzej Grażyński
Date: Wed, 07 Apr 2010 20:38
3 lines
854 bytes
Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.

Wskazówka:  czy SWAPB może się tu do czegoś przydać?
Re: Równie prosta zagadka
#2186
Author: Bernard
Date: Fri, 09 Apr 2010 08:52
25 lines
1738 bytes
On 2010-04-07 22:38, Andrzej Grażyński wrote:
> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
>
> Wskazówka: czy SWAPB może się tu do czegoś przydać?

SWAPB może się przydać, ale więcej z tym kłopotu niż pożytku z powodu 
konieczności obsługi przypadków, gdy rozmiar wektora jest poniżej 4 lub 
nie jest wielokrotnością 4. Kod ze SWAPB będzie pewnie ciut szybszy i 
wyraźnie dłuższy.

Klasycznie robi się to np. tak:

; EDI - adres poczatku, ECX - l. bajtow

	lea	esi, [edi + ecx - 1]
rlop:
	mov	al, [edi]
	xchg	al, [esi]
	stosb
	dec 	esi
	cmp	esi, edi
	jb	rlop

Albo przed pętlą dokładamy shr ecx, 1, a pętlę zamykamy instrukcją loop, 
usuwając cmp i jb
Re: Równie prosta zagadka
#2187
Author: Wojciech Muła
Date: Fri, 09 Apr 2010 12:37
53 lines
2209 bytes
Bernard <bernard@earth.net> wrote:

> On 2010-04-07 22:38, Andrzej Grażyński wrote:
> > Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
> >
> > Wskazówka: czy SWAPB może się tu do czegoś przydać?
> 
> SWAPB może się przydać, ale więcej z tym kłopotu niż pożytku z powodu 
> konieczności obsługi przypadków, gdy rozmiar wektora jest poniżej 4 lub 
> nie jest wielokrotnością 4.

Przede wszystkim BSWAP. :)

I wcale nie tak skomplikowanie, bo trzeba brać pod uwagę końcówkę,
ale niepodzielną przez 8:

	mov esi, adres
	mov ecx, długość
	lea edi, [esi + ecx - 4]
	test ecx, 0xfffffff8
	jnz zamiana_bajt_po_bajcie
	and ecx, 0xfffffff8
.pętla:
	mov eax, [esi]
	mov ebx, [edi]
	bswap eax
	bswap ebx
	mov [edi], eax
	mov [esi], ebx
	add esi, 4
	sub edi, 4
	sub ecx, 8
	jnz .pętla

	mov ecx, długość
	and ecx, 0x7
	jnz .koniec 

	sub esi, 3	; tutaj tylko korekta
	add edi, 3	; wskaźników
	
.zamiana_bajt_po_bajcie:
	tu Twój kod
.koniec:

W podobny sposób można wykorzystać mój ulubiony rozkaz PSHUFB - przy
jego użyciu w jednej iteracji wymieniałoby się 16 bajtów. :) Jutro
się tym trochę pobawię, to wrzucę na grupę jakieś benchmarki.

w.

-- 
Mamy oswojoną sarnę i w związku z tym projektuję, by dorobić do niej kłódkę.
Re: Równie prosta zagadka
#2189
Author: Bernard
Date: Fri, 09 Apr 2010 12:47
25 lines
1491 bytes
On 2010-04-09 10:52, Bernard wrote:
> Klasycznie robi się to np. tak:
>
> ; EDI - adres poczatku, ECX - l. bajtow
>
> lea esi, [edi + ecx - 1]
> rlop:
> mov al, [edi]
> xchg al, [esi]
> stosb
> dec esi
> cmp esi, edi
> jb rlop

Popełem błąd w warunku wyjścia z pętli - powinno być ja.

Ładniejsze jest chyba jednak coś takiego - tylko goła pętla, 5 
instrukcji, 3 rejestry:

xlop:
	lodsb
	xchg	al, [esi + ecx - 2]
	mov	[esi - 1], al
	sub	ecx, 2
	ja	xlop
Re: Równie prosta zagadka
#2190
Author: Andrzej Grażyński
Date: Fri, 09 Apr 2010 20:53
39 lines
1922 bytes
Bernard pisze:
> On 2010-04-07 22:38, Andrzej Grażyński wrote:
>> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
>>
>> Wskazówka: czy SWAPB może się tu do czegoś przydać?
> 
> SWAPB może się przydać, ale więcej z tym kłopotu niż pożytku z powodu 
> konieczności obsługi przypadków, gdy rozmiar wektora jest poniżej 4 lub 
> nie jest wielokrotnością 4. Kod ze SWAPB będzie pewnie ciut szybszy i 
> wyraźnie dłuższy.
> 
> Klasycznie robi się to np. tak:
> 
> ; EDI - adres poczatku, ECX - l. bajtow
> 
>     lea    esi, [edi + ecx - 1]
> rlop:
>     mov    al, [edi]
>     xchg    al, [esi]
>     stosb
>     dec     esi
>     cmp    esi, edi
>     jb    rlop
> 
> Albo przed pętlą dokładamy shr ecx, 1, a pętlę zamykamy instrukcją loop, 
> usuwając cmp i jb

   LEA  EDI,[ESI+ECX-1]
   SHR  ECX,1
   JZ   @@Ready
   STD
@@Loop:
   MOV AL,[EDI]
   MOVSB
   INC ESI            ; MOV [ESI+1],AL
   MOV [ESI],AL       ; ADD ESI,2
   INC ESI            ; ----
   LOOP @@Loop
@@Ready:
Re: Równie prosta zagadka
#2188
Author: Andrzej Grażyński
Date: Fri, 09 Apr 2010 23:09
75 lines
2691 bytes
Wojciech Muła pisze:
> Bernard <bernard@earth.net> wrote:
> 
>> On 2010-04-07 22:38, Andrzej Grażyński wrote:
>>> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
>>>
>>> Wskazówka: czy SWAPB może się tu do czegoś przydać?
>> SWAPB może się przydać, ale więcej z tym kłopotu niż pożytku z powodu 
>> konieczności obsługi przypadków, gdy rozmiar wektora jest poniżej 4 lub 
>> nie jest wielokrotnością 4.
> 
> Przede wszystkim BSWAP. :)
> 
> I wcale nie tak skomplikowanie, bo trzeba brać pod uwagę końcówkę,
> ale niepodzielną przez 8:
> 
> 	mov esi, adres
> 	mov ecx, długość
> 	lea edi, [esi + ecx - 4]
> 	test ecx, 0xfffffff8
> 	jnz zamiana_bajt_po_bajcie
> 	and ecx, 0xfffffff8
> .pętla:
> 	mov eax, [esi]
> 	mov ebx, [edi]
> 	bswap eax
> 	bswap ebx
> 	mov [edi], eax
> 	mov [esi], ebx
> 	add esi, 4
> 	sub edi, 4
> 	sub ecx, 8
> 	jnz .pętla
> 
> 	mov ecx, długość
> 	and ecx, 0x7
> 	jnz .koniec 
> 
> 	sub esi, 3	; tutaj tylko korekta
> 	add edi, 3	; wskaźników
> 	
> .zamiana_bajt_po_bajcie:
> 	tu Twój kod
> .koniec:
> 
> W podobny sposób można wykorzystać mój ulubiony rozkaz PSHUFB - przy
> jego użyciu w jednej iteracji wymieniałoby się 16 bajtów. :) Jutro
> się tym trochę pobawię, to wrzucę na grupę jakieś benchmarki.
> 
> w.
> 

LEA EDI,[ESI+ECX-1]
MOV EDX,7
AND EDX,ECX
SETNZ DL
SHR ECX,3
ADD ECX,EDX
JZ  @@Ready



CLD
@Loop:

LODSD
MOV  EDX,[EDI]
BSWAP EAX
BSWAP EDX
STOSD
MOV [ESI-4],EDX
SUB EDI,8
LOOP @@Loop

@@Ready:
Re: Równie prosta zagadka
#2192
Author: Andrzej Grażyński
Date: Sat, 10 Apr 2010 19:27
38 lines
1554 bytes
Andrzej Grażyński pisze:
> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
> 
> Wskazówka:  czy SWAPB może się tu do czegoś przydać?




Co sądzicie o tym? (nie testowałem)


CLD
ADD ECX,4
MOV EBX,7
AND EBX,ECX
SHR ECX,3
LEA EDI,[ESI+ECX-1]
JZ  @@Partial

@@Loop:
   LODSD
   MOV EDX,[EDI]
   BSWAP EAX
   BSWAP EDX
   STOSD
   MOV [ESI-4],EDX
   SUB EDI,8
   LOOP @@Loop

@@Partial:
   SHR EBX,1
   JZ  @@Done
   MOV AL,[ESI]
   LEA EDI,[ESI+EBX-1]
   MOV AH,[EDI]
   STOSB
   MOV ESI,AH
@@Done:
Re: Równie prosta zagadka
#2193
Author: Andrzej Grażyński
Date: Sat, 10 Apr 2010 19:42
38 lines
1428 bytes
Andrzej Grażyński pisze:
> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
> 
> Wskazówka:  czy SWAPB może się tu do czegoś przydać?




Co sądzicie o tym? (nie testowałem)


CLD
ADD ECX,4
MOV EBX,7
AND EBX,ECX
SHR ECX,3
LEA EDI,[ESI+ECX-1]
JZ  @@Partial

@@Loop:
   LODSD
   MOV EDX,[EDI]
   BSWAP EAX
   BSWAP EDX
   STOSD
   MOV [ESI-4],EDX
   SUB EDI,8
   LOOP @@Loop

@@Partial:
   AND EBX,3
   JZ  @@Done
   MOV AL,[ESI]
   LEA EDI,[ESI+EBX-1]
   MOV AH,[EDI]
   STOSB
   MOV ESI,AH
@@Done:
Re: Równie prosta zagadka
#2191
Author: Bernard
Date: Sun, 11 Apr 2010 20:00
17 lines
1569 bytes
On 2010-04-09 22:53, Andrzej Grażyński wrote:
>
> LEA EDI,[ESI+ECX-1]
> SHR ECX,1
> JZ @@Ready
> STD
> @@Loop:
> MOV AL,[EDI]
> MOVSB
> INC ESI ; MOV [ESI+1],AL
> MOV [ESI],AL ; ADD ESI,2
> INC ESI ; ----
> LOOP @@Loop
> @@Ready:

No dobra, wiem, że jest cała masa rozwiązań. Moje w poście wyżej ma 
jedną pętlę z pięcioma instrukcjami i raczej nic mu nie dolega.
Re: Równie prosta zagadka
#2194
Author: Bernard
Date: Mon, 12 Apr 2010 18:13
65 lines
2269 bytes
On 2010-04-10 21:42, Andrzej Grażyński wrote:
> Andrzej Grażyński pisze:
>> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
>>
>> Wskazówka: czy SWAPB może się tu do czegoś przydać?
>
>
>
>
> Co sądzicie o tym? (nie testowałem)

No to potestujmy. Przyjmijmy ECX równe 7 i wektor bajtów o wartościach 
1, 2, 3, 4, 5, 6, 7.


> CLD
Zbędne wg ABI.
> ADD ECX,4
ECX = 11
> MOV EBX,7
> AND EBX,ECX
EBX = 3
> SHR ECX,3
ECX = 1
> LEA EDI,[ESI+ECX-1]
EDI = start
> JZ @@Partial
>
> @@Loop:
> LODSD
4, 3, 2, 1
> MOV EDX,[EDI]
4, 3, 2, 1
> BSWAP EAX
1, 2, 3, 4
> BSWAP EDX
jw.
> STOSD
początek wektora: 4, 3, 2, 1
> MOV [ESI-4],EDX
tak samo
> SUB EDI,8
start - 4
> LOOP @@Loop
>
> @@Partial:
> AND EBX,3
EBX = 3
> JZ @@Done
> MOV AL,[ESI]
5
> LEA EDI,[ESI+EBX-1]
ESI+2, czyli start + 6
> MOV AH,[EDI]
7
> STOSB
5 na koniec
> MOV ESI,AH
7 na start+4
Nie ma takiej instrukcji, alele jeśli chodziło o [ESI], to 7 na start+4
> @@Done:

Wektor po wszystkim: 4, 3, 2, 1, 7, 6, 5

No chyba nie o to chodziło... ;)
Re: Równie prosta zagadka
#2195
Author: Andrzej Grażyński
Date: Mon, 12 Apr 2010 23:24
42 lines
1765 bytes
Bernard pisze:
> On 2010-04-10 21:42, Andrzej Grażyński wrote:
>> Andrzej Grażyński pisze:
>>> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
>>>
>>> Wskazówka: czy SWAPB może się tu do czegoś przydać?
>>
>>
>>
>>
>> Co sądzicie o tym? (nie testowałem)
> 
> No to potestujmy. Przyjmijmy ECX równe 7 i wektor bajtów o wartościach 
> 1, 2, 3, 4, 5, 6, 7.
> 
> 
>> CLD
> Zbędne wg ABI.
>> ADD ECX,4
> ECX = 11
>> MOV EBX,7
>> AND EBX,ECX
> EBX = 3
>> SHR ECX,3
> ECX = 1
>> LEA EDI,[ESI+ECX-1]


Tu się pomyliłem. EDI powinno być tak ustawione, żeby najbardziej 
znaczacy bajt 4-bajtowego słowa wskazywanego przez EDI pokrywał się z 
ostatnim bajtem obszaru. Czyli EDI powinno wskazywać 4. bajt od końca

CLD

LEA EDI,[ESI+ECX-4]

ADD ECX,4
MOV EBX,7
AND EBX,ECX
SHR ECX,3

...
Re: Równie prosta zagadka
#2196
Author: Andrzej Grażyński
Date: Tue, 13 Apr 2010 15:16
70 lines
2371 bytes
Bernard pisze:
> On 2010-04-10 21:42, Andrzej Grażyński wrote:
>> Andrzej Grażyński pisze:
>>> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
>>>
>>> Wskazówka: czy SWAPB może się tu do czegoś przydać?
>>
>>
>>
>>
>> Co sądzicie o tym? (nie testowałem)
> 
> No to potestujmy. Przyjmijmy ECX równe 7 i wektor bajtów o wartościach 
> 1, 2, 3, 4, 5, 6, 7.
> 
> 
>> CLD
> Zbędne wg ABI.
>> ADD ECX,4
> ECX = 11
>> MOV EBX,7
>> AND EBX,ECX
> EBX = 3
>> SHR ECX,3
> ECX = 1
>> LEA EDI,[ESI+ECX-1]


Tym razem sprawdziłem:

     CLD

     LEA EDI,[ESI+ECX-4]

     PUSH  ECX

     ADD ECX,4
     SHR ECX,3
     JZ  @@Partial

@@Loop:
     LODSD
     MOV EDX,[EDI]
     BSWAP EAX
     BSWAP EDX
     STOSD
     MOV [ESI-4],EDX
     SUB EDI,8
     LOOP @@Loop

@@Partial:


     POP EBX
     AND EBX,7
     JZ  @@Done
     TEST EBX,4
     JNZ @@Done

     MOV AL,[ESI]
     LEA EDI,[ESI+EBX-1]
     MOV AH,[EDI]
     STOSB
     MOV [ESI],AH
@@Done:


Na pewno NIE jest to prostsze ani czytelniejsze od zwykłego 
przestawiania bajtów. Ale ciekawe jak z szybkością. Czy ktoś może 
porównać z innymi przykładami wcześniej tu prezentowanymi?
Re: Równie prosta zagadka
#2197
Author: Andrzej Grażyński
Date: Tue, 13 Apr 2010 15:27
76 lines
2499 bytes
Bernard pisze:
> On 2010-04-10 21:42, Andrzej Grażyński wrote:
>> Andrzej Grażyński pisze:
>>> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
>>>
>>> Wskazówka: czy SWAPB może się tu do czegoś przydać?
>>
>>
>>
>>
>> Co sądzicie o tym? (nie testowałem)
> 
> No to potestujmy. Przyjmijmy ECX równe 7 i wektor bajtów o wartościach 
> 1, 2, 3, 4, 5, 6, 7.
> 
> 
>> CLD
> Zbędne wg ABI.
>> ADD ECX,4
> ECX = 11
>> MOV EBX,7
>> AND EBX,ECX
> EBX = 3
>> SHR ECX,3
> ECX = 1
>> LEA EDI,[ESI+ECX-1]


Tym razem sprawdziłem:

     CLD

     LEA EDI,[ESI+ECX-4]

     PUSH  ECX

     ADD ECX,4
     SHR ECX,3
     JZ  @@Partial

@@Loop:
     LODSD
     MOV EDX,[EDI]
     BSWAP EAX
     BSWAP EDX
     STOSD
     MOV [ESI-4],EDX
     SUB EDI,8
     LOOP @@Loop

@@Partial:


     POP EBX

     ; być może ten kawałek można lepiej zrobić
     AND EBX,7
     JZ  @@Done
     TEST EBX,4
     JNZ @@Done
;---------------------------

     MOV AL,[ESI]
     LEA EDI,[ESI+EBX-1]
     MOV AH,[EDI]
     STOSB
     MOV [ESI],AH
@@Done:

Zauważ, że "reszta" (@@Partial) ma zawsze długość od 0 do 3 i obywa się 
najwyżej JEDNYM przestawieniem.


Na pewno NIE jest to prostsze ani czytelniejsze od zwykłego
przestawiania bajtów. Ale ciekawe jak z szybkością. Czy ktoś może
porównać z innymi przykładami wcześniej tu prezentowanymi?
Re: Równie prosta zagadka
#2198
Author: Andrzej Grażyński
Date: Tue, 13 Apr 2010 15:31
73 lines
2482 bytes
Bernard pisze:
> On 2010-04-10 21:42, Andrzej Grażyński wrote:
>> Andrzej Grażyński pisze:
>>> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
>>>
>>> Wskazówka: czy SWAPB może się tu do czegoś przydać?
>>
>>
>>
>>
>> Co sądzicie o tym? (nie testowałem)
> 
> No to potestujmy. Przyjmijmy ECX równe 7 i wektor bajtów o wartościach 
> 1, 2, 3, 4, 5, 6, 7.
> 
> 
>> CLD
> Zbędne wg ABI.
>> ADD ECX,4
> ECX = 11
>> MOV EBX,7
>> AND EBX,ECX
> EBX = 3
>> SHR ECX,3
> ECX = 1
>> LEA EDI,[ESI+ECX-1]


Tym razem sprawdziłem:

     CLD

     LEA EDI,[ESI+ECX-4]

     MOV EBX,ECX

     ADD ECX,4
     SHR ECX,3
     JZ  @@Partial

@@Loop:
     LODSD
     MOV EDX,[EDI]
     BSWAP EAX
     BSWAP EDX
     STOSD
     MOV [ESI-4],EDX
     SUB EDI,8
     LOOP @@Loop

@@Partial:

     ; być może ten kawałek można lepiej zrobić
     AND EBX,7
     JZ  @@Done
     TEST EBX,4
     JNZ @@Done
;---------------------------

     MOV AL,[ESI]
     LEA EDI,[ESI+EBX-1]
     MOV AH,[EDI]
     STOSB
     MOV [ESI],AH
@@Done:

Zauważ, że "reszta" (@@Partial) ma zawsze długość od 0 do 3 i obywa się
najwyżej JEDNYM przestawieniem.


Na pewno NIE jest to prostsze ani czytelniejsze od zwykłego
przestawiania bajtów. Ale ciekawe jak z szybkością. Czy ktoś może
porównać z innymi przykładami wcześniej tu prezentowanymi?
Re: Równie prosta zagadka
#2199
Author: Andrzej Grażyński
Date: Tue, 13 Apr 2010 15:37
72 lines
2317 bytes
Bernard pisze:
> On 2010-04-10 21:42, Andrzej Grażyński wrote:
>> Andrzej Grażyński pisze:
>>> Dane jest pole o długości L bajtów. Odrócić kolejność bajtów w tym polu.
>>>
>>> Wskazówka: czy SWAPB może się tu do czegoś przydać?
>>
>>
>>
>>
>> Co sądzicie o tym? (nie testowałem)
> 
> No to potestujmy. Przyjmijmy ECX równe 7 i wektor bajtów o wartościach 
> 1, 2, 3, 4, 5, 6, 7.
> 
> 
>> CLD
> Zbędne wg ABI.
>> ADD ECX,4
> ECX = 11
>> MOV EBX,7
>> AND EBX,ECX
> EBX = 3
>> SHR ECX,3
> ECX = 1
>> LEA EDI,[ESI+ECX-1]


Tym razem sprawdziłem:

     CLD

     LEA EDI,[ESI+ECX-4]

     MOV EBX,ECX

     ADD ECX,4
     SHR ECX,3
     JZ  @@Partial

@@Loop:
     LODSD
     MOV EDX,[EDI]
     BSWAP EAX
     BSWAP EDX
     STOSD
     MOV [ESI-4],EDX
     SUB EDI,8
     LOOP @@Loop

@@Partial:

     ; być może ten kawałek można lepiej zrobić
     AND EBX,7
     JZ  @@Done
     TEST EBX,4
     JNZ @@Done
;---------------------------
     LEA  EDI,[ESI+EBX-1]
     MOV  AL,[EDI]
     MOVSB
     MOV [ESI-1],AL

@@Done:

Zauważ, że "reszta" (@@Partial) ma zawsze długość od 0 do 3 i obywa się
najwyżej JEDNYM przestawieniem.


Na pewno NIE jest to prostsze ani czytelniejsze od zwykłego
przestawiania bajtów. Ale ciekawe jak z szybkością. Czy ktoś może
porównać z innymi przykładami wcześniej tu prezentowanymi?
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