Article View: pl.comp.lang.asm
Article #862Re: string reverse
From: Michal Schulz
Date: Tue, 05 Dec 2006 21:23
Date: Tue, 05 Dec 2006 21:23
63 lines
3500 bytes
3500 bytes
mikezum wrote: >> EAX = 00000000000000000000000010000000b >> >> Innymi slowy, niezaleznie z ktorej strony skanujesz EAX, bit numer 7 >> bedzie pierwszym napotkanym bitem rownym 1 >> >> wystarczy, czy bardziej po ludzku napisac? > Czyli kazdy bajt w EAX jst skanowany odzielnie ? nie. instrukcja operuje na rejestrze EAX traktujac go jako calosc. W jaki sposob z mojego opisu wyciagnales swoje wnioski? > Tak rozumiem z Twojej wypowiedzi. zatem nic nie zrozumiales > A jak najszybciej przeskanowac caly operand od nastarszego bitu w > operandzie, a nie w bajcie ? To teraz jeszcze bardziej proste wyjasnienie. Wyobraz sobie rejestr eax, skladajacy sie z 32 bitow. Bit najstarszy (najbardziej wazny) ma numer 31, bit najmlodszy ma numer 0. Liczba 128 w systemie szesnastkowym to 0x00000080, lub tez w systemie binarnym 00000000000000000000000010000000b. Innymi slowy, liczba 128 to taka liczba, w ktorej bit numer 7 jest rowny 1 (jeden), a *wszystkie* pozostale bity sa rowne 0 (zero). Instrukcja BSF (Bit scan forward) przeglada drugi operand (w naszym wypadku rejestr EAX zawierajacy liczbe 128) od najmlodszego bitu do najstarszego. Jesli nie znajdzie zadnego bitu rownego 1 (jeden), ustawi flage Z w rejestrze EFLAGS. W przeciwny wypadku flaga Z zostanie wyzerowana, a w pierwszym operandzie (EBX w przypadku twojego kodu) zostanie zapisany numer pierwszego bitu ktorego wartosc jest rowna 1 (jeden). W podanym przez ciebie przypadku bedzie to liczba 7 (bit numer 7 jest pierwszym ustawionym bitem, patrzac od PRAWEJ strony). Instrukcja BSR (Bit scan reverse) przeglada drugi operand (w naszym wypadku rejestr EAX zawierajacy liczbe 128) od najstarszego bitu do najmlodszego. Jesli nie znajdzie zadnego bitu rownego 1 (jeden), ustawi flage Z w rejestrze EFLAGS. W przeciwny wypadku flaga Z zostanie wyzerowana, a w pierwszym operandzie (EBX w przypadku twojego kodu) zostanie zapisany numer pierwszego bitu ktorego wartosc jest rowna 1 (jeden). W podanym przez ciebie przypadku bedzie to liczba 7 (bit numer 7 jest pierwszym ustawionym bitem, patrzac od LEWEJ strony). Wystarczajaco prosta odpowiedz? PS. gdyby w rejestrze EAX byla liczba 1073741826 (0x40000002 w systemie szesnastkowym, lub tez 01000000000000000000000000000010 w systemie dwojkowym), to instrukcja BSF ebx, eax owocowalaby wartoscia 1 w rejestrze ebx, natomiast instrukcja BSR ebx, eax owocowalaby wartoscia 30 w rejestrze ebx. Potrafisz zrozumiec dlaczego? -- Michal Schulz
Technical Details
Message-ID:
<el4o12$65k$1@news.onet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!newsfeed.silweb.pl!news.onet.pl!not-for-mailReferences:
<8j3qqhx2oh2t.16ahj7wfz15t2$.dlg@40tude.net> <ekrivu$srf$1@news.onet.pl> <ekrl05$9tt$1@inews.gazeta.pl> <1fa3760oiybh8.7xk0unla13io.dlg@40tude.net> <el2150$kdg$1@news.onet.pl> <1gsokugsauv6w$.bgbtbtef73ab.dlg@40tude.net>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!newsfeed.silweb.pl!news.onet.pl!not-for-mail From: Michal Schulz <michal.schulz@onet.eu> Newsgroups: pl.comp.lang.asm Subject: Re: string reverse Date: Tue, 05 Dec 2006 22:23:59 +0100 Organization: Onet.pl Lines: 64 Message-ID: <el4o12$65k$1@news.onet.pl> References: <8j3qqhx2oh2t.16ahj7wfz15t2$.dlg@40tude.net> <ekrivu$srf$1@news.onet.pl> <ekrl05$9tt$1@inews.gazeta.pl> <1fa3760oiybh8.7xk0unla13io.dlg@40tude.net> <el2150$kdg$1@news.onet.pl> <1gsokugsauv6w$.bgbtbtef73ab.dlg@40tude.net> NNTP-Posting-Host: p5485ca46.dip.t-dialin.net Mime-Version: 1.0 X-Trace: news.onet.pl 1165353827 6324 84.133.202.70 (5 Dec 2006 21:23:47 GMT) X-Complaints-To: usenet@news.onet.pl NNTP-Posting-Date: Tue, 5 Dec 2006 21:23:47 +0000 (UTC) X-Sender: 9wUCXNAIfoHJ12NLiW1DhOd3DPBVeoC1 User-Agent: KNode/0.10.4 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit