🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #2171

Re: Bardzo prosta zagadka

#2171
From: Andrzej Grażyński
Date: Wed, 07 Apr 2010 08:00
114 lines
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-mail
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>

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