Thread View: pl.comp.lang.asm
5 messages
5 total messages
Started by Andrzej Grażyński
Fri, 09 Apr 2010 21:00
Podobna zagadka
Author: Andrzej Grażyński
Date: Fri, 09 Apr 2010 21:00
Date: Fri, 09 Apr 2010 21:00
2 lines
801 bytes
801 bytes
Dane jest pole o adresie początku w ESI i długości w bajtach w ECX. Należy odwrócić kolejność BITÓW.
Re: Podobna zagadka
Author: Bernard
Date: Sun, 11 Apr 2010 20:21
Date: Sun, 11 Apr 2010 20:21
22 lines
1474 bytes
1474 bytes
On 2010-04-09 23:00, Andrzej Grażyński wrote:
> Dane jest pole o adresie początku w ESI i długości w bajtach w ECX.
> Należy odwrócić kolejność BITÓW.
xlop:
lodsb
mov ah, al
and ax, 0x55aa
shr al, 1
aad 2
mov ah, al
and ax, 0x33cc
shr al, 2
aad 4
ror al, 4
xchg al, [esi + ecx - 2]
; i tu to samo, co powyżej - 9 instrukcji
mov [esi - 1], al
sub ecx, 2
ja xlop
razem 23 instrukcje na 1 obieg pętli
Re: Podobna zagadka
Author: Andrzej Grażyński
Date: Sun, 11 Apr 2010 21:37
Date: Sun, 11 Apr 2010 21:37
25 lines
1492 bytes
1492 bytes
Bernard pisze: > On 2010-04-09 23:00, Andrzej Grażyński wrote: >> Dane jest pole o adresie początku w ESI i długości w bajtach w ECX. >> Należy odwrócić kolejność BITÓW. > > xlop: > lodsb > mov ah, al > and ax, 0x55aa > shr al, 1 > aad 2 > mov ah, al > and ax, 0x33cc > shr al, 2 > aad 4 > ror al, 4 > xchg al, [esi + ecx - 2] > ; i tu to samo, co powyżej - 9 instrukcji > mov [esi - 1], al > sub ecx, 2 > ja xlop > > razem 23 instrukcje na 1 obieg pętli A nie lepiej użyć BT, BTS i BTR?
Re: Podobna zagadka
Author: Andrzej Grażyński
Date: Mon, 12 Apr 2010 14:14
Date: Mon, 12 Apr 2010 14:14
22 lines
1177 bytes
1177 bytes
Andrzej Grażyński pisze: > Dane jest pole o adresie początku w ESI i długości w bajtach w ECX. > Należy odwrócić kolejność BITÓW. SHL ECX,3 JZ @@Done MOV EBX,ECX XOR EDX,EDX @@Loop: DEC EBX BT [ESI],EBX SETC AL BT [ESI], EDX SBB AL,0 JZ @@Ancora BTC [ESI],EBX BTC [ESI],EDX @@Ancora: INC EDX LOOP @Loop @@Done:
Re: Podobna zagadka
Author: Bernard
Date: Mon, 12 Apr 2010 18:36
Date: Mon, 12 Apr 2010 18:36
37 lines
2085 bytes
2085 bytes
On 2010-04-12 16:14, Andrzej Grażyński wrote: > Andrzej Grażyński pisze: >> Dane jest pole o adresie początku w ESI i długości w bajtach w ECX. >> Należy odwrócić kolejność BITÓW. > > SHL ECX,3 > JZ @@Done > MOV EBX,ECX > XOR EDX,EDX > > @@Loop: > DEC EBX > BT [ESI],EBX > SETC AL > BT [ESI], EDX > SBB AL,0 > JZ @@Ancora > BTC [ESI],EBX > BTC [ESI],EDX > @@Ancora: > INC EDX > LOOP @Loop > @@Done: Przyjmując optymistycznie, że kod jest wolny od błędów, otrzymujemy 4 obiegi pętli na bajt wektora, każdy obieg średnio po 9 instrukcji z nieprzewidywalnym skokiem (JZ), czyli 36 instrukcji na bajt z ośmioma nieprzewidywalnymi skokami o koszcie kilkudziesięciu instrukcji każdy. Każdy bajt będzie przy tym odczytywany średnio 12 razy i zapisywany 4 - sporo. Moje rozwiązanie ma 11.5 instrukcji na bajt bez skoku zależnego od danych, po jednym odczycie i zapisie na bajt. Wolne pojedyncze instrukcje AAD można zastąpić szybkimi parami shl + or. c.b.d.o. :)
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