делаю цикл mov cx,10; на десять шагов цикла metka: push cx; команды использующие cx pop cx dec cx loop metka Программа уходит в вечный цикл А вот как правильно ?
mov cx,10; на десять шагов цикла metka: push cx; команды использующие cx pop cx dec cx - ТЫ ЧО СДУ..Л!!! loop metka loop это: dec cx jnz metka Тебе нужно RTFM
Vasil похоже, RTFM тебе тоже не помешает Количество проходов - четное, поэтому dec cx просто сокращает вдвое количество проходов цикла. А причина зацикливания - в тех действиях, которые скрываются за "команды, использующие cx" Такой пример, без dec cx, также благополучно зацикливается: Код (Text): mov cx,10 _m: push cx call _print pop cx loop _m _print: PrintDec cx ret Хотя cx принимает значение 0...
Зацикливаться может в 32-битном режиме, если "команды, использующие сх" изменяют старший ворд ecx Нужно заменить все cx на ecx и не париться
DbIM Недавно тоже мучался с этими циклами, когда делал генератор последовательности случайных чисел. Сначала использовал ecx и программа зацикливалась, потом посмотрел в отладчике и заметил, что каждый раз ecx изменяется на "77E7F1C9" после вызова WriteFile. Поменял ecx на edi и все заработало. Пример в аттаче. Цикл организуется между метками cycl и close. 1945835267__random.rar
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'ить не надо.
Спасибо всем кто ответил Проблема как-то неожиданно разрешилась методом создания отдельного проца В итоге окончаельый код выглядит так 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 может и безграмотно НО работает Программа просто копирует файл с одного компьютера на другой. Еще раз спасибо всем кто помог