🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
10 messages
10 total messages Started by Andrzej Grażyński Thu, 01 Apr 2010 19:40
Bardzo prosta zagadka
#2164
Author: Andrzej Grażyński
Date: Thu, 01 Apr 2010 19:40
3 lines
810 bytes
Często instrukcję  REPE SCAS? i REPE CMPS? poprzedza się instrukcją OR 
CX,CX (lub OR ECX,ECX). W jakim celu?
Re: Bardzo prosta zagadka
#2165
Author: Michoo
Date: Thu, 01 Apr 2010 23:36
10 lines
1045 bytes
Andrzej Grażyński pisze:
> 
> Często instrukcję  REPE SCAS? i REPE CMPS? poprzedza się instrukcją OR 
> CX,CX (lub OR ECX,ECX). W jakim celu?
Żeby ustawić flagę, ale po co - nie mam pojęcia - przez symetrię do REP 
- gdzie ECX==0 oznacza "nie powtarzaj"?

-- 
Pozdrawiam
Michoo
Re: Bardzo prosta zagadka
#2166
Author: Andrzej Grażyński
Date: Fri, 02 Apr 2010 09:26
11 lines
1192 bytes
Michoo pisze:
> Andrzej Grażyński pisze:
>>
>> Często instrukcję  REPE SCAS? i REPE CMPS? poprzedza się instrukcją OR 
>> CX,CX (lub OR ECX,ECX). W jakim celu?
> Żeby ustawić flagę, ale po co - nie mam pojęcia - przez symetrię do REP 
> - gdzie ECX==0 oznacza "nie powtarzaj"?
> 
żeby ustawić flagę (którą?) - Tak.

Reszta bez sensu.
Re: Bardzo prosta zagadka
#2167
Author: Michoo
Date: Fri, 02 Apr 2010 16:45
16 lines
1297 bytes
Andrzej Grażyński pisze:
> Michoo pisze:
>> Andrzej Grażyński pisze:
>>>
>>> Często instrukcję  REPE SCAS? i REPE CMPS? poprzedza się instrukcją 
>>> OR CX,CX (lub OR ECX,ECX). W jakim celu?
>> Żeby ustawić flagę, ale po co - nie mam pojęcia - przez symetrię do 
>> REP - gdzie ECX==0 oznacza "nie powtarzaj"?
>>
> żeby ustawić flagę (którą?) - Tak.
ZF, ale nadal nie wiem po co - przecież SCAS/CMPS ustawią ją w wyniku 
porównania.

-- 
Pozdrawiam
Michoo
Re: Bardzo prosta zagadka
#2168
Author: Paweł Więcek
Date: Fri, 02 Apr 2010 18:25
13 lines
2292 bytes
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ł

-- 
 (___)  | Pawel Wiecek ----------------- Coven / Svart --------------------- |
< o o > |  http://www.coven.vmh.net/    <coven@vmh.net>    GSM: +48603240006 |
 \ ^ /  | GPG/PGP info in message headers  *  [ Debian GNU/Linux developer ] |
  (")   |  Despair will be brought upon the hoping children of happiness. -E |
Re: Bardzo prosta zagadka
#2169
Author: Andrzej Grażyński
Date: Sat, 03 Apr 2010 09:43
58 lines
2025 bytes
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:
Re: Bardzo prosta zagadka
#2170
Author: Bogdan (bogdro)
Date: Tue, 06 Apr 2010 16:40
96 lines
3362 bytes
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.

-- 
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: Bardzo prosta zagadka
#2171
Author: 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
Re: Bardzo prosta zagadka
#2172
Author: Bogdan (bogdro)
Date: Wed, 07 Apr 2010 16:24
77 lines
3089 bytes
W dniu 07.04.2010 10:00, Andrzej Grażyński pisze:
> Bogdan (bogdro) pisze:
>> W dniu 03.04.2010 11:43, Andrzej Grażyński pisze:

[...]
>>> 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

[...]

> Po co komplikować życie? We fragmencie szukającym #13 wystarczy wstawić
> 
> OR AL,AL
> 
> przed REPNE SCASB.
> 
> Proste, prawda?

 Czyli mój powyższy przykład z "test al, al" też zapewne by sobie
poradził :)
 To drugie było pomyłką.

> 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

 JECXZ @@NotFound

-- 
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: Bardzo prosta zagadka
#2173
Author: Andrzej Grażyński
Date: Wed, 07 Apr 2010 20:28
76 lines
3093 bytes
Bogdan (bogdro) pisze:
> W dniu 07.04.2010 10:00, Andrzej Grażyński pisze:
>> Bogdan (bogdro) pisze:
>>> W dniu 03.04.2010 11:43, Andrzej Grażyński pisze:
> 
> [...]
>>>> 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
> 
> [...]
> 
>> Po co komplikować życie? We fragmencie szukającym #13 wystarczy wstawić
>>
>> OR AL,AL
>>
>> przed REPNE SCASB.
>>
>> Proste, prawda?
> 
>  Czyli mój powyższy przykład z "test al, al" też zapewne by sobie
> poradził :)
>  To drugie było pomyłką.
> 
>> 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
> 
>  JECXZ @@NotFound
> 

Nie znam lepszej metody, zresztą projektanci procesorów x86 właśnie na 
taką okazję przewidzieli instrukcję J(E)CXZ. Żaden inny rejestr nie da 
się testować w taki sposób.
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