Thread View: pl.comp.lang.asm
15 messages
15 total messages
Started by =?ISO-8859-2?Q?A
Mon, 15 Mar 2010 20:02
Zagadka
Author: =?ISO-8859-2?Q?A
Date: Mon, 15 Mar 2010 20:02
Date: Mon, 15 Mar 2010 20:02
19 lines
474 bytes
474 bytes
1. 386 i wy�ej. W EAX i EDX s� dwie liczby ca�kowite BEZ ZNAKU. Nale�y spowodowa�, by w EAX znalaz�a si� mniejsza (w sensie relacji JB) z tych liczb - NIE WOLNO U�YWA� SKOK�W. 2. Jak wy�ej, ale zawarto�ci rejestr�w traktowane s� jako liczby ze znakiem ("mniejsza" oznacza "w sensie relacji" JL). WSKAZ�WKA: To zadanie jest w 3. tomie "Sztuki programowania" D.E. Knutha, jego rozwi�zanie z ksi��ki na nic si� tu nie przyda.
Re: Zagadka
Author: Wojciech =?ISO-8
Date: Mon, 15 Mar 2010 20:46
Date: Mon, 15 Mar 2010 20:46
31 lines
674 bytes
674 bytes
Andrzej Gra¿yñski <grazynsk@petex.com.pl> wrote: > 1. > 386 i wy¿ej. > > W EAX i EDX s± dwie liczby ca³kowite BEZ ZNAKU. Nale¿y spowodowaæ, by w > EAX znalaz³a siê mniejsza (w sensie relacji JB) z tych liczb - NIE WOLNO > U¯YWAÆ SKOKÓW. > > 2. > > Jak wy¿ej, ale zawarto¶ci rejestrów traktowane s± jako liczby ze znakiem > ("mniejsza" oznacza "w sensie relacji" JL). Dla 686 i nowszych :) cmp eax, edx cmovb eax, edx ; 1 cmovl eax, edx ; 2 Odpowied¼ poprawn± znam, ale nie chcê psuæ innym zabawy. w. -- Mamy oswojon± sarnê i w zwi±zku z tym projektujê, by dorobiæ do niej k³ódkê.
Re: Zagadka
Author: "Bogdan (bogdro)
Date: Tue, 16 Mar 2010 19:03
Date: Tue, 16 Mar 2010 19:03
38 lines
1038 bytes
1038 bytes
W dniu 15.03.2010 20:02, Andrzej Gra�y�ski pisze: > > 1. > 386 i wy�ej. > > W EAX i EDX s� dwie liczby ca�kowite BEZ ZNAKU. Nale�y spowodowa�, by w > EAX znalaz�a si� mniejsza (w sensie relacji JB) z tych liczb - NIE WOLNO > U�YWA� SKOK�W. Nietestowane, a poza tym pewnie powolne jak nie wiem co: mov ebx, eax mov ecx, edx cmp eax, edx sbb eax, eax ; 0 / -1 cmp eax, edx sbb edx, edx ; -1 / 0 and eax, ebx ; 0 / EAX and edx, ecx ; EDX / 0 add eax, edx ; EDX / EAX > 2. > > Jak wy�ej, ale zawarto�ci rejestr�w traktowane s� jako liczby ze znakiem > ("mniejsza" oznacza "w sensie relacji" JL). Jak wy�ej, ale zacz�� od add eax, 80000000h add edx, 80000000h a sko�czy� na sub eax, 80000000h -- 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: Zagadka
Author: Wojciech =?ISO-8
Date: Tue, 16 Mar 2010 20:24
Date: Tue, 16 Mar 2010 20:24
34 lines
807 bytes
807 bytes
"Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> wrote: > W dniu 15.03.2010 20:02, Andrzej Gra¿yñski pisze: > > > > 1. > > 386 i wy¿ej. > > > > W EAX i EDX s± dwie liczby ca³kowite BEZ ZNAKU. Nale¿y spowodowaæ, by w > > EAX znalaz³a siê mniejsza (w sensie relacji JB) z tych liczb - NIE WOLNO > > U¯YWAÆ SKOKÓW. > > Nietestowane, a poza tym pewnie powolne jak nie wiem co: > > mov ebx, eax > mov ecx, edx > cmp eax, edx > sbb eax, eax ; 0 / -1 > cmp eax, edx > sbb edx, edx ; -1 / 0 > and eax, ebx ; 0 / EAX > and edx, ecx ; EDX / 0 > add eax, edx ; EDX / EAX Taka ma³a uwaga: niepotrzebnie dwa razy porównujesz, wystarczy raz, a potem 'neg maska'. w. -- Mamy oswojon± sarnê i w zwi±zku z tym projektujê, by dorobiæ do niej k³ódkê.
Re: Zagadka
Author: Wojciech =?ISO-8
Date: Tue, 16 Mar 2010 21:24
Date: Tue, 16 Mar 2010 21:24
26 lines
631 bytes
631 bytes
Wojciech Mu³a <wojciech_mula@poczta.null.onet.pl.invalid> wrote: > > Nietestowane, a poza tym pewnie powolne jak nie wiem co: > > > > mov ebx, eax > > mov ecx, edx > > cmp eax, edx > > sbb eax, eax ; 0 / -1 > > cmp eax, edx > > sbb edx, edx ; -1 / 0 > > and eax, ebx ; 0 / EAX > > and edx, ecx ; EDX / 0 > > add eax, edx ; EDX / EAX > > Taka ma³a uwaga: niepotrzebnie dwa razy porównujesz, wystarczy raz, > a potem 'neg maska'. Powiem jeszcze, ¿e mo¿na zej¶æ do 6 instrukcji. Kombinujcie. :) w. -- Mamy oswojon± sarnê i w zwi±zku z tym projektujê, by dorobiæ do niej k³ódkê.
Re: Zagadka
Author: =?ISO-8859-2?Q?A
Date: Fri, 19 Mar 2010 10:00
Date: Fri, 19 Mar 2010 10:00
54 lines
1095 bytes
1095 bytes
Bogdan (bogdro) pisze: > W dniu 15.03.2010 20:02, Andrzej Gra�y�ski pisze: >> 1. >> 386 i wy�ej. >> >> W EAX i EDX s� dwie liczby ca�kowite BEZ ZNAKU. Nale�y spowodowa�, by w >> EAX znalaz�a si� mniejsza (w sensie relacji JB) z tych liczb - NIE WOLNO >> U�YWA� SKOK�W. > > Nietestowane, a poza tym pewnie powolne jak nie wiem co: > > mov ebx, eax > mov ecx, edx > cmp eax, edx > sbb eax, eax ; 0 / -1 > cmp eax, edx > sbb edx, edx ; -1 / 0 > and eax, ebx ; 0 / EAX > and edx, ecx ; EDX / 0 > add eax, edx ; EDX / EAX > >> 2. >> >> Jak wy�ej, ale zawarto�ci rejestr�w traktowane s� jako liczby ze znakiem >> ("mniejsza" oznacza "w sensie relacji" JL). > > Jak wy�ej, ale zacz�� od > add eax, 80000000h > add edx, 80000000h > a sko�czy� na > sub eax, 80000000h > EAX <- MIN(EAX, EDX) unsigned CMP EAX,EDX SBB EBX,EBX AND EAX,EBX NOT EBX AND EDX,EBX OR EAX,EDX EAX <- MIN(EAX, EDX) signed CMP EAX,EDX SETL BL NEG BL SBB EBX,EBX AND EAX,EBX NOT EBX AND EDX,EBX OR EAX,EDX
Re: Zagadka
Author: Wojciech =?ISO-8
Date: Fri, 19 Mar 2010 11:45
Date: Fri, 19 Mar 2010 11:45
64 lines
1346 bytes
1346 bytes
Andrzej Gra¿yñski <grazynsk@petex.com.pl> wrote: > Bogdan (bogdro) pisze: > > W dniu 15.03.2010 20:02, Andrzej Gra¿yñski pisze: > >> 1. > >> 386 i wy¿ej. > >> > >> W EAX i EDX s± dwie liczby ca³kowite BEZ ZNAKU. Nale¿y spowodowaæ, by w > >> EAX znalaz³a siê mniejsza (w sensie relacji JB) z tych liczb - NIE WOLNO > >> U¯YWAÆ SKOKÓW. > > > > Nietestowane, a poza tym pewnie powolne jak nie wiem co: > > > > mov ebx, eax > > mov ecx, edx > > cmp eax, edx > > sbb eax, eax ; 0 / -1 > > cmp eax, edx > > sbb edx, edx ; -1 / 0 > > and eax, ebx ; 0 / EAX > > and edx, ecx ; EDX / 0 > > add eax, edx ; EDX / EAX > > > >> 2. > >> > >> Jak wy¿ej, ale zawarto¶ci rejestrów traktowane s± jako liczby ze znakiem > >> ("mniejsza" oznacza "w sensie relacji" JL). > > > > Jak wy¿ej, ale zacz±æ od > > add eax, 80000000h > > add edx, 80000000h > > a skoñczyæ na > > sub eax, 80000000h > > > EAX <- MIN(EAX, EDX) unsigned > > > CMP EAX,EDX > SBB EBX,EBX > AND EAX,EBX > NOT EBX > AND EDX,EBX > OR EAX,EDX Mo¿na zejsæ do 5 instrukcji. > EAX <- MIN(EAX, EDX) signed > > CMP EAX,EDX > SETL BL > NEG BL > SBB EBX,EBX > AND EAX,EBX > NOT EBX > AND EDX,EBX > OR EAX,EDX Mo¿na zej¶æ do 4 instrukcji. w.
Re: Zagadka
Author: =?ISO-8859-2?Q?A
Date: Mon, 22 Mar 2010 19:18
Date: Mon, 22 Mar 2010 19:18
62 lines
1415 bytes
1415 bytes
Wojciech Mu�a pisze: > Andrzej Gra�y�ski <grazynsk@petex.com.pl> wrote: > >> Bogdan (bogdro) pisze: >>> W dniu 15.03.2010 20:02, Andrzej Gra�y�ski pisze: >>>> 1. >>>> 386 i wy�ej. >>>> >>>> W EAX i EDX s� dwie liczby ca�kowite BEZ ZNAKU. Nale�y spowodowa�, by w >>>> EAX znalaz�a si� mniejsza (w sensie relacji JB) z tych liczb - NIE WOLNO >>>> U�YWA� SKOK�W. >>> Nietestowane, a poza tym pewnie powolne jak nie wiem co: >>> >>> mov ebx, eax >>> mov ecx, edx >>> cmp eax, edx >>> sbb eax, eax ; 0 / -1 >>> cmp eax, edx >>> sbb edx, edx ; -1 / 0 >>> and eax, ebx ; 0 / EAX >>> and edx, ecx ; EDX / 0 >>> add eax, edx ; EDX / EAX >>> >>>> 2. >>>> >>>> Jak wy�ej, ale zawarto�ci rejestr�w traktowane s� jako liczby ze znakiem >>>> ("mniejsza" oznacza "w sensie relacji" JL). >>> Jak wy�ej, ale zacz�� od >>> add eax, 80000000h >>> add edx, 80000000h >>> a sko�czy� na >>> sub eax, 80000000h >>> >> EAX <- MIN(EAX, EDX) unsigned >> >> >> CMP EAX,EDX >> SBB EBX,EBX >> AND EAX,EBX >> NOT EBX >> AND EDX,EBX >> OR EAX,EDX > > Mo�na zejs� do 5 instrukcji. > >> EAX <- MIN(EAX, EDX) signed >> >> CMP EAX,EDX >> SETL BL >> NEG BL >> SBB EBX,EBX >> AND EAX,EBX >> NOT EBX >> AND EDX,EBX >> OR EAX,EDX > > Mo�na zej�� do 4 instrukcji. > > w. Ch�tnie zobaczy�bym te kr�tsze wersje.
Re: Zagadka
Author: Wojciech =?ISO-8
Date: Mon, 22 Mar 2010 19:42
Date: Mon, 22 Mar 2010 19:42
48 lines
861 bytes
861 bytes
Andrzej Gra¿yñski <grazynsk@petex.com.pl> wrote: > >> EAX <- MIN(EAX, EDX) unsigned > >> > >> > >> CMP EAX,EDX > >> SBB EBX,EBX > >> AND EAX,EBX > >> NOT EBX > >> AND EDX,EBX > >> OR EAX,EDX > > Mo¿na zejsæ do 5 instrukcji. cmp eax, edx sbb ebx, ebx xor edx, eax and edx, ebx xor eax, edx Ostanie 3 instrukcje mo¿na skojarzyæ z rozwi±zaniem stosownym w http://en.wikipedia.org/wiki/XOR_linked_list > >> EAX <- MIN(EAX, EDX) signed > >> > >> CMP EAX,EDX > >> SETL BL > >> NEG BL > >> SBB EBX,EBX > >> AND EAX,EBX > >> NOT EBX > >> AND EDX,EBX > >> OR EAX,EDX > > > > Mo¿na zej¶æ do 4 instrukcji. sub edx, eax sbb ebx, ebx and edx, ebx add eax, edx ; albo sub > Chêtnie zobaczy³bym te krótsze wersje. Proszê. :) Fajnie, ¿e trochê rozrusza³e¶ grupê. w.
Re: Zagadka
Author: =?ISO-8859-2?Q?A
Date: Wed, 24 Mar 2010 21:57
Date: Wed, 24 Mar 2010 21:57
62 lines
1350 bytes
1350 bytes
Wojciech Mu�a pisze: > Andrzej Gra�y�ski <grazynsk@petex.com.pl> wrote: > >>>> EAX <- MIN(EAX, EDX) unsigned >>>> >>>> >>>> CMP EAX,EDX >>>> SBB EBX,EBX >>>> AND EAX,EBX >>>> NOT EBX >>>> AND EDX,EBX >>>> OR EAX,EDX >>> Mo�na zejs� do 5 instrukcji. > > cmp eax, edx > sbb ebx, ebx > > xor edx, eax > and edx, ebx > xor eax, edx > > Ostanie 3 instrukcje mo�na skojarzy� z rozwi�zaniem stosownym w > http://en.wikipedia.org/wiki/XOR_linked_list > >>>> EAX <- MIN(EAX, EDX) signed >>>> >>>> CMP EAX,EDX >>>> SETL BL >>>> NEG BL >>>> SBB EBX,EBX >>>> AND EAX,EBX >>>> NOT EBX >>>> AND EDX,EBX >>>> OR EAX,EDX >>> Mo�na zej�� do 4 instrukcji. > > sub edx, eax I tu jest problem: je�eli w eax i edx b�d� liczby przeciwnych znak�w takie, �e ich r�nica nie zmie�ci si� na 32 bitach (jako signed), to CF zostanie ustawiony niezale�nie od tego, czy EDX<EAX czy EDX>êX. I ostateczny wynik mo�e nie by� poprawny. Oryginalne rozwi�zanie podane przez Knutha bazuje na formule MIN(X, y) = (X + Y - ABS(X-Y))/2 i jest tak samo wra�liwe na problem nadmiaru. > sbb ebx, ebx > > and edx, ebx > add eax, edx ; albo sub > >> Ch�tnie zobaczy�bym te kr�tsze wersje. > > Prosz�. :) Fajnie, �e troch� rozrusza�e� grup�. > > w.
Re: Zagadka
Author: Wojciech =?ISO-8
Date: Thu, 25 Mar 2010 20:26
Date: Thu, 25 Mar 2010 20:26
41 lines
1169 bytes
1169 bytes
Andrzej Gra¿yñski <grazynsk@petex.com.pl> wrote: > >>>> EAX <- MIN(EAX, EDX) signed > >>>> > >>>> CMP EAX,EDX > >>>> SETL BL > >>>> NEG BL > >>>> SBB EBX,EBX > >>>> AND EAX,EBX > >>>> NOT EBX > >>>> AND EDX,EBX > >>>> OR EAX,EDX > >>> Mo¿na zej¶æ do 4 instrukcji. > > > > sub edx, eax > > I tu jest problem: je¿eli w eax i edx bêd± liczby przeciwnych znaków > takie, ¿e ich ró¿nica nie zmie¶ci siê na 32 bitach (jako signed), to CF > zostanie ustawiony niezale¿nie od tego, czy EDX<EAX czy EDX>=EAX. I > ostateczny wynik mo¿e nie byæ poprawny. > > Oryginalne rozwi±zanie podane przez Knutha bazuje na formule > > MIN(X, y) = (X + Y - ABS(X-Y))/2 > > i jest tak samo wra¿liwe na problem nadmiaru. Faktycznie, nie zwróci³em na to uwagi. Ale dalej mo¿na wykorzystaæ trik z xorem dla dodatnich - w koñcu tylko warunkowo podmieniamy bity. Podrzuæ jeszcze jakie¶ zadanko, to mi³o czasem ruszyæ g³ow± nad zda³oby siê prostym problemem. w. -- Mamy oswojon± sarnê i w zwi±zku z tym projektujê, by dorobiæ do niej k³ódkê.
Re: Zagadka
Author: =?ISO-8859-2?Q?A
Date: Fri, 26 Mar 2010 00:12
Date: Fri, 26 Mar 2010 00:12
54 lines
1442 bytes
1442 bytes
Wojciech Mu�a pisze: > Andrzej Gra�y�ski <grazynsk@petex.com.pl> wrote: > >>>>>> EAX <- MIN(EAX, EDX) signed >>>>>> >>>>>> CMP EAX,EDX >>>>>> SETL BL >>>>>> NEG BL >>>>>> SBB EBX,EBX >>>>>> AND EAX,EBX >>>>>> NOT EBX >>>>>> AND EDX,EBX >>>>>> OR EAX,EDX >>>>> Mo�na zej�� do 4 instrukcji. >>> sub edx, eax >> I tu jest problem: je�eli w eax i edx b�d� liczby przeciwnych znak�w >> takie, �e ich r�nica nie zmie�ci si� na 32 bitach (jako signed), to CF >> zostanie ustawiony niezale�nie od tego, czy EDX<EAX czy EDX>êX. I >> ostateczny wynik mo�e nie by� poprawny. >> >> Oryginalne rozwi�zanie podane przez Knutha bazuje na formule >> >> MIN(X, y) = (X + Y - ABS(X-Y))/2 >> >> i jest tak samo wra�liwe na problem nadmiaru. > > Faktycznie, nie zwr�ci�em na to uwagi. Ale dalej mo�na wykorzysta� > trik z xorem dla dodatnich - w ko�cu tylko warunkowo podmieniamy bity. > > Podrzu� jeszcze jakie� zadanko, to mi�o czasem ruszy� g�ow� nad > zda�oby si� prostym problemem. > > w. > Ten fragment zlicza jedynki w EAX MACRO VCOUNTONESSTEP MSK, SHFT MOV ECX,&MSK MOV EDX,EAX SHR EAX,&SHFT AND EAX,ECX AND EDX,ECX ADD EAX,EDX ENDM VCOUNTONESSTEP 055555555H,1 VCOUNTONESSTEP 033333333H,2 VCOUNTONESSTEP 0F0F0F0FH,4 VCOUNTONESSTEP 00FF00FFH,8 VCOUNTONESSTEP 0000FFFFH,16
Re: Zagadka
Author: Michal Schulz
Date: Fri, 26 Mar 2010 07:40
Date: Fri, 26 Mar 2010 07:40
58 lines
1374 bytes
1374 bytes
Andrzej Grażyński wrote: >> Podrzuć jeszcze jakieś zadanko, to miło czasem ruszyć głową nad >> zdałoby się prostym problemem. >> >> w. >> > Ten fragment zlicza jedynki w EAX > > MACRO VCOUNTONESSTEP MSK, SHFT > MOV ECX,&MSK > MOV EDX,EAX > SHR EAX,&SHFT > AND EAX,ECX > AND EDX,ECX > ADD EAX,EDX > ENDM > > VCOUNTONESSTEP 055555555H,1 > VCOUNTONESSTEP 033333333H,2 > VCOUNTONESSTEP 0F0F0F0FH,4 > VCOUNTONESSTEP 00FF00FFH,8 > VCOUNTONESSTEP 0000FFFFH,16 W tym pojedynku wygral niestety gcc, ktory ten sam kod: unsigned long bfcnto(unsigned long v) { unsigned long const w = v - ((v >> 1) & 0x55555555); unsigned long const x = (w & 0x33333333) + ((w >> 2) & 0x33333333); unsigned long const c = (((x + (x >> 4)) & 0xF0F0F0F) * 0x1010101)>>24; return c; } przetworzyl na wersje prawie identyczna z twoja: mov edx, eax shr edx and edx, 0x55555555 sub eax, edx mov edx, eax and eax, 0x33333333 shr edx, 2 and edx, 0x33333333 add edx, eax mov eax, edx shr eax, 4 add eax, edx and eax, 0x0f0f0f0f imul eax, eax, 0x01010101 shr eax, 24 PS. W SSE4.2 byloby jeszcze prosciej :) -- Michal Schulz
Re: Zagadka
Author: Wojciech =?ISO-8
Date: Fri, 26 Mar 2010 09:46
Date: Fri, 26 Mar 2010 09:46
59 lines
1519 bytes
1519 bytes
Michal Schulz <michal.schulz@onet.eu> wrote: > > Ten fragment zlicza jedynki w EAX > > > > MACRO VCOUNTONESSTEP MSK, SHFT > > MOV ECX,&MSK > > MOV EDX,EAX > > SHR EAX,&SHFT > > AND EAX,ECX > > AND EDX,ECX > > ADD EAX,EDX > > ENDM > > > > VCOUNTONESSTEP 055555555H,1 > > VCOUNTONESSTEP 033333333H,2 > > VCOUNTONESSTEP 0F0F0F0FH,4 > > VCOUNTONESSTEP 00FF00FFH,8 > > VCOUNTONESSTEP 0000FFFFH,16 > > W tym pojedynku wygral niestety gcc, ktory ten sam kod: > > unsigned long bfcnto(unsigned long v) > { > unsigned long const w = v - ((v >> 1) & 0x55555555); > unsigned long const x = (w & 0x33333333) + ((w >> 2) & 0x33333333); > unsigned long const c = (((x + (x >> 4)) & 0xF0F0F0F) * 0x1010101)>>24; > > return c; > } > > przetworzyl na wersje prawie identyczna z twoja: > > mov edx, eax > shr edx > and edx, 0x55555555 > sub eax, edx > mov edx, eax > and eax, 0x33333333 > shr edx, 2 > and edx, 0x33333333 > add edx, eax > mov eax, edx > shr eax, 4 > add eax, edx > and eax, 0x0f0f0f0f > imul eax, eax, 0x01010101 > shr eax, 24 Uprzedzi³e¶ mnie: http://graphics.stanford.edu/~seander/bithacks.html > PS. W SSE4.2 byloby jeszcze prosciej :) W SSSE3 te¿ do¶æ prosto: http://wm.ite.pl/articles/sse-popcount.html w.
Re: Zagadka
Author: Tomasz Sowa
Date: Sat, 10 Apr 2010 01:14
Date: Sat, 10 Apr 2010 01:14
14 lines
251 bytes
251 bytes
Dnia Mon, 22 Mar 2010 19:42:14 +0100, Wojciech Mu�a napisa�(a): > cmp eax, edx > sbb ebx, ebx > > xor edx, eax > and edx, ebx > xor eax, edx Sprytne, tylko �e to wybiera warto�� wi�ksz� a nie mniejsz� :) -- http://www.ttmath.org
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