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
Author: Andrzej Grażyński
Date: Thu, 01 Apr 2010 19:40
Date: Thu, 01 Apr 2010 19:40
3 lines
810 bytes
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
Author: Michoo
Date: Thu, 01 Apr 2010 23:36
Date: Thu, 01 Apr 2010 23:36
10 lines
1045 bytes
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
Author: Andrzej Grażyński
Date: Fri, 02 Apr 2010 09:26
Date: Fri, 02 Apr 2010 09:26
11 lines
1192 bytes
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
Author: Michoo
Date: Fri, 02 Apr 2010 16:45
Date: Fri, 02 Apr 2010 16:45
16 lines
1297 bytes
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
Author: Paweł Więcek
Date: Fri, 02 Apr 2010 18:25
Date: Fri, 02 Apr 2010 18:25
13 lines
2292 bytes
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
Author: Andrzej Grażyński
Date: Sat, 03 Apr 2010 09:43
Date: Sat, 03 Apr 2010 09:43
58 lines
2025 bytes
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
Author: Bogdan (bogdro)
Date: Tue, 06 Apr 2010 16:40
Date: Tue, 06 Apr 2010 16:40
96 lines
3362 bytes
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
Author: 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
Re: Bardzo prosta zagadka
Author: Bogdan (bogdro)
Date: Wed, 07 Apr 2010 16:24
Date: Wed, 07 Apr 2010 16:24
77 lines
3089 bytes
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
Author: Andrzej Grażyński
Date: Wed, 07 Apr 2010 20:28
Date: Wed, 07 Apr 2010 20:28
76 lines
3093 bytes
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