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
Author: Andrzej Grażyński
Date: Wed, 07 Apr 2010 20:38
Date: Wed, 07 Apr 2010 20:38
3 lines
854 bytes
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
Author: Bernard
Date: Fri, 09 Apr 2010 08:52
Date: Fri, 09 Apr 2010 08:52
25 lines
1738 bytes
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
Author: Wojciech Muła
Date: Fri, 09 Apr 2010 12:37
Date: Fri, 09 Apr 2010 12:37
53 lines
2209 bytes
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
Author: Bernard
Date: Fri, 09 Apr 2010 12:47
Date: Fri, 09 Apr 2010 12:47
25 lines
1491 bytes
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
Author: Andrzej Grażyński
Date: Fri, 09 Apr 2010 20:53
Date: Fri, 09 Apr 2010 20:53
39 lines
1922 bytes
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
Author: Andrzej Grażyński
Date: Fri, 09 Apr 2010 23:09
Date: Fri, 09 Apr 2010 23:09
75 lines
2691 bytes
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
Author: Andrzej Grażyński
Date: Sat, 10 Apr 2010 19:27
Date: Sat, 10 Apr 2010 19:27
38 lines
1554 bytes
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
Author: Andrzej Grażyński
Date: Sat, 10 Apr 2010 19:42
Date: Sat, 10 Apr 2010 19:42
38 lines
1428 bytes
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
Author: Bernard
Date: Sun, 11 Apr 2010 20:00
Date: Sun, 11 Apr 2010 20:00
17 lines
1569 bytes
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
Author: Bernard
Date: Mon, 12 Apr 2010 18:13
Date: Mon, 12 Apr 2010 18:13
65 lines
2269 bytes
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
Author: Andrzej Grażyński
Date: Mon, 12 Apr 2010 23:24
Date: Mon, 12 Apr 2010 23:24
42 lines
1765 bytes
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
Author: Andrzej Grażyński
Date: Tue, 13 Apr 2010 15:16
Date: Tue, 13 Apr 2010 15:16
70 lines
2371 bytes
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
Author: Andrzej Grażyński
Date: Tue, 13 Apr 2010 15:27
Date: Tue, 13 Apr 2010 15:27
76 lines
2499 bytes
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
Author: Andrzej Grażyński
Date: Tue, 13 Apr 2010 15:31
Date: Tue, 13 Apr 2010 15:31
73 lines
2482 bytes
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
Author: Andrzej Grażyński
Date: Tue, 13 Apr 2010 15:37
Date: Tue, 13 Apr 2010 15:37
72 lines
2317 bytes
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