Article View: pl.comp.lang.asm
Article #2171Re: Bardzo prosta zagadka
From: Andrzej Grażyński
Date: Wed, 07 Apr 2010 08:00
Date: Wed, 07 Apr 2010 08:00
114 lines
3627 bytes
3627 bytes
Bogdan (bogdro) pisze: > W dniu 03.04.2010 11:43, Andrzej Grażyński pisze: >> Paweł Więcek pisze: >>> Thus wrote Michoo <michoo_news@vp.pl>: >>>> ZF, ale nadal nie wiem po co - przecież SCAS/CMPS ustawią ją w wyniku >>>> porównania. >>> O ile porównuje cokolwiek. A dwa ciagi zerowej długości też są równe. >>> >>> Paweł >>> >> No i o to chodzi. >> >> Oto na pozór poprawny fragment, szukający pierwszego znaku różnego od >> spacji w pewnym obszarze: >> >> LES EDI, <adres obszaru> >> MOV ECX, <długość obszaru> >> CLD >> MOV AL,32 >> >> REPE SCASB >> JE @@NotFound >> >> ; znaleziono znak różny od spacji, jego adres jest w ES:[EDI-1] >> >> >> >> .... >> >> @@NotFound: >> >> >> Fragment jest błędny, bo założenie wyartykułowane w komentarzu jest >> nieprawdziwe. >> >> Program będzie poprawny, jeśli instrukcję REPE SCASB poprzedzimy >> instrukcją OR ECX,ECX. >> >> >> >> Sytuacja podobna: co należy wstawić przed REPNE SCASB, by uniknąć błedu >> w powyższym fragmencie: >> >> >> LES EDI, <adres obszaru> >> MOV ECX, <długość obszaru> >> CLD >> MOV AL,13 >> >> REPNE SCASB >> JNE @@NotFound >> >> ; znaleziono znak końca wiersza, jego adres jest w ES:[EDI-1] >> >> >> >> .... >> >> @@NotFound: > > Wszyscy znają odpowiedź, ale ja przełamię milczenie: zapewne chodzi o > sytuację odwrotną, czyli o kod, który wyzeruje flagę ZF, zwłaszcza gdy > ECX=0. Wtedy, jeśli ECX=0, to JNE poprawnie skoczy do @@NotFound. Ale > bardziej chciałem zapytać (z ciekawości, długo nad tym nie myślałem), > czy rozwiążesz tę zagadkę na samym ECX tuż przed REPNE i bez > niszczenia ECX (tzn. ustawiając tylko flagi)? Bo taki kod: > > LES EDI, <adres obszaru> > MOV ECX, <długość obszaru> > CLD > MOV AL,13 > > test al, al > REPNE SCASB > JNE @@NotFound > > lub też > > LES EDI, <adres obszaru> > MOV ECX, <długość obszaru> > CLD > MOV AL,13 > > add ecx, 1 > sub ecx, 1 > REPNE SCASB > JNE @@NotFound > > to nawet ja potrafię wstawić :) Ale może znasz jakąś instrukcję XOR, > SETcc czy inną, która ustawi ZF=0, gdy ECX=0. > Po co komplikować życie? We fragmencie szukającym #13 wystarczy wstawić OR AL,AL przed REPNE SCASB. Proste, prawda? To teraz trochę trudniejsze - co tutaj trzeba wstawić przed REPNE SCASB? Oczywiście tylko jedna instrukcja. Szukamy zerowego ogranicznika stringa ASCIIZ: XOR AL,AL MOV ECX,długość obszaru LES DI,adres obszaru REPNE SCASB JE @@Found ; nie znaleziono ogranicznika
Technical Details
Message-ID:
<hphe2i$3bm$1@news.onet.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mailReferences:
<hp2ss9$12j$1@news.onet.pl> <hp3al9$4cc$1@news.onet.pl> <hp4d7v$7ik$1@news.onet.pl> <hp5701$jvj$1@news.onet.pl> <6dph87-n3j.ln1@lilith.rlyeh.org> <hp72m0$bon$1@news.onet.pl> <hpfo6b$clk$1@inews.gazeta.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail From: Andrzej Grażyński <grazynsk@petex.com.pl> Newsgroups: pl.comp.lang.asm Subject: Re: Bardzo prosta zagadka Date: Wed, 07 Apr 2010 10:00:06 +0200 Organization: http://onet.pl Lines: 117 Message-ID: <hphe2i$3bm$1@news.onet.pl> References: <hp2ss9$12j$1@news.onet.pl> <hp3al9$4cc$1@news.onet.pl> <hp4d7v$7ik$1@news.onet.pl> <hp5701$jvj$1@news.onet.pl> <6dph87-n3j.ln1@lilith.rlyeh.org> <hp72m0$bon$1@news.onet.pl> <hpfo6b$clk$1@inews.gazeta.pl> NNTP-Posting-Host: public-gprs109491.centertel.pl Mime-Version: 1.0 X-Trace: news.onet.pl 1270627220 3446 79.162.45.181 (7 Apr 2010 08:00:20 GMT) X-Complaints-To: niusy@onet.pl NNTP-Posting-Date: Wed, 7 Apr 2010 08:00:20 +0000 (UTC) User-Agent: Thunderbird 2.0.0.24 (Windows/20100228) In-Reply-To: <hpfo6b$clk$1@inews.gazeta.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit