Цикл с предусловием

Тема в разделе "WASM.BEGINNERS", создана пользователем fluck, 7 окт 2009.

  1. fluck

    fluck New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    19
    Нужно написать цикл с таким условием, что он выполняется пока два числа будут не равны другу
    Вот код:
    Код (Text):
    1.  int a = 1;
    2.  int b = 5;
    3.  int c = 0;
    4. _asm{
    5.    mov eax,a
    6.    mov ecx,b
    7.    mov edx,c
    8. L1:
    9.    cmp eax,ecx ; Если eax=edx то установить флаг zf=1
    10.    je exit ; Если флаг zf=1 , то выход ;Ошибка: Произведена попытка выполнения                                                  
    11.                                                    ; неверной последовательности блокировки.
    12.    dec ecx ; ecx = ecx - 1
    13.    inc edx ; edx = edx + 1
    14.    jmp L1
    15. exit:
    16. }
    В чёем здесь дело?
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    это сравнение eax с ecx.

    Зачем тебе вообще 3 регистра? Если ты хочешь сравнивать ecx и edx, которые инициализируются в 5 и 0 и меняются на 1 каждый в разные стороны то цикл будет бесконечным т.к. сравнивать ты будешь следующие пары:
    5-0
    4-1
    3-2
    2-3
    ...


    Вобщем возимь отладчик и смотри как меняются значения регистров.
     
  3. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    asd все верно сказал, но раз ты такую задачу сюда запостил, то тебе скорее всего прост было в лом разбиратца и ждешь готового кода. Вот он:

    Код (Text):
    1.  int a = 1;
    2.  int b = 5;
    3. _asm{
    4.    mov eax,a
    5.    mov ecx,c
    6. L1:
    7.    cmp eax,ecx
    8.    je exit                           ; если еах и есх равны, то перейдет на метку ехit
    9.    dec eаx                         ; уменьшает еах до тех пор, пока не будет равен есх.
    10.    jmp L1
    11. exit:
    12. }
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    вы что-то не то пишете, начиная с ТС

    По порядку: что за ошибка? Цикл написан НОРМАЛЬНЫЙ, не бесконечный, и вполне правильный

    По #3: это совсем другое, не то что в 1-м посте. У ТС цикл должен завершиться после 4-х итераций (но 5 сравнений - поскольку сначала сравнение, потом декремент и "тело" с инкрементом edx):
    1 и 5
    1 и 4
    1 и 3
    1 и 2
    1 и 1 (выход)
    и на выходе edx будет =4

    ошибки могут быть на стадии компиляции:
    - из-за "ассемблерных" комментариев в inline-ассемблере. Убрать комментарии.

    - из-за большого расстояния между je и меткой (по идее, нормальные компиляторы это разруливают - но вдруг?) - если ТС привел примерный код, опустив в теле цикла здоровенный кусок, по его мнению не существенный для понимания :)

    - из-за ссылки вперед, если ассемблерный код по какой-то причине компилируется в 1 проход.

    - маловероятно, но из-за использования в качестве метки слова "exit" - вдруг оно еще где-то фигурирует? Назвать метку L2.

    Но это гадание на кофейной гуще - я так и не понял, в каком месте проблема с внешне правильным циклом?
     
  5. fluck

    fluck New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    19
    Маловероятно...а оказалось именно из за этого) Видимо какое то ключевое слово.А в 1-ом комметарии я напутал eax=ecx вместо eax=edx
     
  6. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Доктор Хаус к вашим услугам :lol:
     
  7. fluck

    fluck New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2009
    Сообщения:
    19
    ага :=)