Код (Text): format PE GUI 4.0 entry start include 'win32a.inc' section '.data' data readable writeable _caption db 'Win32 assembly program',0 _message db 'Hello World!',0 section '.code' code readable executable start: xor ecx,ecx add ecx,3 .loop_begin: dec ecx push 0 push _caption push _message push 0 call [MessageBoxA] test ecx,ecx jnz .loop_begin jmp .exit .exit: push 0 call [ExitProcess] section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include 'api\kernel32.inc' include 'api\user32.inc' Не могу понять почему запускается бесконечный цикл вроде условия выхода я написал а все равно не работает ? Пробывал загрузить в Olly получается что после Код (Text): call [MessageBoxA] адрес возврата в стеке указывает на Код (Text): push eax kernel32.ExitThread а не на test ecx,ecx
Меняет значение еcx, можно сделать так: Код (Text): push ecx push 0 push _caption push _message push 0 call [MessageBoxA] pop ecx
В общем, вот так: Код (Text): format PE GUI 4.0 entry start include 'win32a.inc' section '.data' data readable writeable _caption db 'Win32 assembly program',0 _message db 'Hello World!',0 section '.code' code readable executable start: mov ebx, 0x3 .loop_begin: dec ebx push 0 push _caption push _message push 0 call [MessageBoxA] test ebx,ebx jnz .loop_begin .exit: push 0 call [ExitProcess] section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include 'api\kernel32.inc' include 'api\user32.inc' будет тебе счастье. Чтобы понять, почему, читаем соглашение о вызовах API -- сохранение и восстановление регистров.
Считать можно где угодно. Инструкция 'loop' действительно использует ecx, но ты ж не ее используешь. Легко находится по словам 'ebx esi edi preserve'.