loop

Тема в разделе "WASM.BEGINNERS", создана пользователем DbIM, 10 мар 2006.

  1. DbIM

    DbIM New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    13
    делаю цикл

    mov cx,10; на десять шагов цикла

    metka: push cx;

    команды использующие cx

    pop cx

    dec cx

    loop metka

    Программа уходит в вечный цикл

    А вот как правильно ?
     
  2. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    mov cx,10; на десять шагов цикла

    metka: push cx;

    команды использующие cx

    pop cx

    dec cx - ТЫ ЧО СДУ..Л!!!

    loop metka



    loop это:

    dec cx

    jnz metka



    Тебе нужно RTFM:)
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Vasil

    похоже, RTFM тебе тоже не помешает :)

    Количество проходов - четное, поэтому dec cx просто сокращает вдвое количество проходов цикла.

    А причина зацикливания - в тех действиях, которые скрываются за "команды, использующие cx"



    Такой пример, без dec cx, также благополучно зацикливается:




    Код (Text):
    1.     mov     cx,10
    2.   _m:
    3.     push    cx
    4.     call    _print
    5.     pop     cx
    6.     loop    _m
    7.  
    8. _print:
    9.     PrintDec cx
    10.     ret




    Хотя cx принимает значение 0...
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Зацикливаться может в 32-битном режиме, если "команды, использующие сх" изменяют старший ворд ecx

    Нужно заменить все cx на ecx и не париться ;)
     
  5. ARMICRON

    ARMICRON New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    41
    DbIM

    Недавно тоже мучался с этими циклами, когда делал генератор последовательности случайных чисел.

    Сначала использовал ecx и программа зацикливалась, потом посмотрел в отладчике и заметил, что каждый раз ecx изменяется на "77E7F1C9" после вызова WriteFile. Поменял ecx на edi и все заработало.

    Пример в аттаче. Цикл организуется между метками cycl и close.

    [​IMG] 1945835267__random.rar
     
  6. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    cresta - RTFM я читал на 1-ом курсе, так что не гони пургу. У DbIM для заданных 10-ти фаз выполняются только 5 !!! :)

    А значит если DbIM не знает, что делает команда loop, то проблема одна - RTFM для push, pop, loop, и т. д.



    leo

    "Зацикливаться может в 32-битном режиме" - если бы он программировал для 32-х разрядной машины, то IP не дошёл бы и до цикла, Следовательно, задача только для DOS. ;)



    ARMICRON

    По стандарту UNIX и Windows, для API изменяются только регистры eax, ecx, edx, а остальные push'ить и pop'ить не надо.
     
  7. DbIM

    DbIM New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    13
    Спасибо всем кто ответил

    Проблема как-то неожиданно разрешилась методом создания отдельного проца

    В итоге окончаельый код выглядит так



    CSEG segment

    assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG

    org 100h



    BEGIN:

    mov ah,3ch

    mov cx,0

    mov dx,offset file_save

    int 21h

    jc bad

    mov handle,ax



    mov ax,3d00h

    xor cx,cx

    mov dx,offset file_open

    int 21h

    mov handle2,ax

    jc bad



    xor cx,cx

    mov cx,3000

    metka:push cx

    call reopen

    pop cx

    loop metka



    mov dx,offset mess1

    mov ah,9

    int 21h

    int 20h



    bad:

    mov dx,offset mess2

    jmp quit



    good:

    mov dx,offset mess1

    jmp quit



    quit:

    mov ah,9

    int 21h

    int 20h



    Handle2 dw 0

    Handle dw 0

    finish equ $



    reopen proc

    mov ah,3fh

    mov bx,handle2

    mov cx,9999

    int 21h



    mov ah,42h

    mov bx,handle2

    mov cx,9999

    int 21h



    mov ah,40h

    mov bx,handle

    mov cx,9999

    mov dx,offset file_open

    int 21h

    jc bad

    cmp ax,cx



    ret

    reopen endp





    file_open db 'z:\090306.xls',0

    file_save db 'c:\copydb.xls',0

    mess1 db 'OK!$'

    mess2 db 'NOT!$'



    Buffer equ $



    CSEG ends

    end BEGIN



    может и безграмотно НО работает :)

    Программа просто копирует файл с одного компьютера на другой.

    Еще раз спасибо всем кто помог