Бесконечный цикл

Тема в разделе "WASM.BEGINNERS", создана пользователем tester3000, 4 апр 2008.

  1. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.  
    8.   _caption db 'Win32 assembly program',0
    9.   _message db 'Hello World!',0
    10.  
    11. section '.code' code readable executable
    12.    start:
    13.          xor ecx,ecx
    14.          add ecx,3
    15. .loop_begin:
    16.          dec ecx
    17.          push 0
    18.          push _caption
    19.          push _message
    20.          push 0
    21.          call [MessageBoxA]
    22.          test ecx,ecx
    23.          jnz .loop_begin
    24.          jmp .exit
    25. .exit:
    26.          push    0
    27.          call    [ExitProcess]
    28.  
    29. section '.idata' import data readable writeable
    30.  
    31.   library kernel32,'KERNEL32.DLL',\
    32.           user32,'USER32.DLL'
    33.  
    34.   include 'api\kernel32.inc'
    35.   include 'api\user32.inc'
    Не могу понять почему запускается бесконечный цикл вроде условия выхода я написал а все равно не работает ?
    Пробывал загрузить в Olly получается что после
    Код (Text):
    1. call [MessageBoxA]
    адрес возврата в стеке указывает на
    Код (Text):
    1. push eax
    2. kernel32.ExitThread
    а не на test ecx,ecx
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Обычно в регистре Eax значение возвращается.
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Меняет значение еcx, можно сделать так:
    Код (Text):
    1. push ecx
    2. push 0
    3. push _caption
    4. push _message
    5. push 0
    6. call [MessageBoxA]
    7. pop ecx
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    tester3000
    jmp .exit точно не надо
    подумай почему выполняется
    jnz .loop_begin
     
  5. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    блин сорри чет я ступил :)

     
  6. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    из-за ZF=0 ?
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    В общем, вот так:

    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.  
    8.   _caption db 'Win32 assembly program',0
    9.   _message db 'Hello World!',0
    10.  
    11. section '.code' code readable executable
    12.    start:
    13.          mov ebx, 0x3
    14. .loop_begin:
    15.          dec ebx
    16.          push 0
    17.          push _caption
    18.          push _message
    19.          push 0
    20.          call [MessageBoxA]
    21.          test ebx,ebx
    22.          jnz .loop_begin
    23. .exit:
    24.          push    0
    25.          call    [ExitProcess]
    26.  
    27. section '.idata' import data readable writeable
    28.  
    29.   library kernel32,'KERNEL32.DLL',\
    30.           user32,'USER32.DLL'
    31.  
    32.   include 'api\kernel32.inc'
    33.   include 'api\user32.inc'
    будет тебе счастье. Чтобы понять, почему, читаем соглашение о вызовах API -- сохранение и восстановление регистров.
     
  8. tester3000

    tester3000 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2006
    Сообщения:
    140
    Mika0x65

    для счетчика вроде же ecx применяют или без разницы ?

    А где именно это описанно можно линк
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Считать можно где угодно. Инструкция 'loop' действительно использует ecx, но ты ж не ее используешь.

    Легко находится по словам 'ebx esi edi preserve'.