[Asm]Dziwaczny błąd w kodzie

0

elo Bracia

napisałem sobie program,pod Win32

mov ecx,wartość
....................
gdzieś:
.................
push ecx
......................
pop ecx
...............
loop gdzieś

i teraz,śledząc wykonywanie się go pod debuggerem,okazuje się że nie wykonuje skoku po natrafieniu na loop,mimo że ecx ma wartość różną od zera! :O
Wie ktoś,jaka jest tego przyczyna?

0

Hm, rzeczywiście dziwne. Zawsze myślałem, że to jest coś w stylu: if(eax != 0) { dec ecx; jmp; } Na 4p stoi natomiast, że: LOOP Decrement CX and Loop if CX Not Zero>. To chyba błąd ;)

Wracając do problemu. Jesteś absolutnie pewien, że ecx!=0? Bo przy loop na pewno powinno wykonać skok. Może etykieta jest za daleko?

0

Loop gdzieś

to jest to samo co

dec cx
jnz gdzieś

i niestety wg mnie nie ma tutaj żadnego błędu. Przestrzegam was przed wstawieniem 0 do cx przed pętlą bo wtedy będzie ona trwała bardzo długo.

mov ecx,wartość
gdzieś:
push ecx
.................
(coś)
......................
pop ecx
loop gdzieś

Czyli coś będzie wykonane "wartość" razy. Skoro masz program do debugowania to radze odpowiednio z niego skorzystać i troche pomyśleć, a odpowiedz się znajdzie.

0

tak,jestem pewien,że ECX<>0,upewniałem się parokrotnie na różnych debuggerach.
Sposób z dec ECX,jnz gdzieś zastosowałem zanim dałem post,ale chciałbym się dowiedzieć co tu za szopki odchodzą,że procek ignoruje rozkaz :O

0

Wrzuć tu zdeasemblowany kawałek kodu ( najlepiej z RVA ), który się wysypuje. Może to być listing z debugera. Dodatkowo możesz załączyć stany rejestrów z czasu tuż przed wykonaniem komendy LOOP ( pamiętaj o rejestrze flag ).

może flaga zero jest po prostu ustawiona od samego początku ;)

http://faydoc.tripod.com/cpu/loop.htm

Some forms of the loop instruction (LOOPcc) also accept the ZF flag as a condition for terminating the loop before the count reaches zero. With these forms of the instruction, a condition code (cc) is associated with each instruction to indicate the condition being tested for. Here, the LOOPcc instruction itself does not affect the state of the ZF flag; the ZF flag is changed by other instructions in the loop.

0

Może się tak dziać dlatego, że debuger przechodzi tą pentlę tyle tazy ile jest w ecx i przechodzi do następnej instrukcji po loop. Czyli nie śledzi tej pętli tylko przechodzi do jej zakończenia. Jak dasz link do kodu to sie powinno od razu rozjaśnić czy jest dobrze napisany.

Nie wiem co oznacza "ECX<>0".

0

To samo co ECX != 0, tylko w wydaniu pascalowym :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1