Вот программка(планеровщик 3 процессов-простенький, суть скакать по ним и сохранять для каждого процесса все регистры в отдельной стэке для каждого процесса): Код (Text): .286 CSEG segment assume CS:CSEG,DS:CSEG,SS:CSEG start: xor ax,ax mov ES,ax cli mov ax,ES:[08h*4] mov word ptr CS:[timer],ax mov ax,ES:[08h*4+2] mov word ptr CS:[timer+2],ax mov ax,offset f_start mov word ptr ES:[08h*4],ax mov word ptr ES:[08h*4+2],CS push ax mov ax,0 mov [current],ax pop ax sti stop_prog: mov ax,[max] cmp CS:[counter],ax jb stop_prog xor ax,ax mov es,ax cli mov ax,word ptr CS:[timer] mov word ptr ES:[08h*4],ax mov ax,word ptr CS:[timer+2] mov word ptr ES:[08h*4+2],ax sti int 20h f_start: ;Задержка push cx mov cx,65000 d1: push cx mov cx,5000 d2: loop d2 pop cx loop d1 pop cx sti pushf call dword ptr CS:[timer] ;Увеличиваем счетчик входа в прерывание add counter,1 cmp current,4 je endml cmp current,0 je began pusha mov ax,[max] cmp [counter],ax popa ja done0 pusha mov si,[current] sub si,1 cmp [cprior+si],1 jne runcur mov ax,[current] add ax,1 cmp ax,4 je ax1 jmp anc ax1: mov ax,1 jmp anc runcur: sub [cprior+si],1 popa jmp endml done0: jmp done endml: iret anc: mov [new],ax mov al,[dprior+si] mov [cprior+si],al popa jmp change ;Код первого запуска began: pusha mov word ptr [sssp],ss mov word ptr [sssp+2],sp mov sp,offset stack3+100h pushf push CS push offset process3 pusha push es mov word ptr [sssp+12],ss mov word ptr [sssp+14],sp mov sp,offset stack2+100h pushf push CS push offset process2 pusha push es mov word ptr [sssp+8],ss mov word ptr [sssp+10],sp mov sp,offset stack1+100h pushf push CS push offset process1 mov word ptr [sssp+4],ss mov word ptr [sssp+6],sp push ax mov ax,1 mov current,ax pop ax jmp endml done: mov ss,word ptr [sssp] mov sp,word ptr [sssp+2] popa push ax mov ax,4 mov current,ax pop ax jmp endml change: ;Сохраняем ES и регистры pusha push es ;Подменяем стеки mov di,current mov si,new shl di,2 shl si,2 mov ax,word ptr [sssp+si] mov bx,word ptr [sssp+si+2] mov word ptr [sssp+di],ss mov word ptr [sssp+di+2],sp mov ss,ax mov sp,bx ;Current:=New push ax mov ax,[new] mov CS:[current],ax pop ax ;Восстанавливаем ES и регистры pop es popa jmp endml process1 proc p1l1: push 0B800h pop es mov di,140 mov ah,101 mov al,'1' mov es:[di],al jmp p1l1 process1 endp process2 proc p2l1: push 0B800h pop es mov di,142 mov al,'2' mov es:[di],al jmp p2l1 process2 endp process3 proc p3l1: push 0B800h pop es mov di,144 mov al,'3' mov es:[di],al jmp p3l1 process3 endp timer dd 0 counter dw 0 max dw 20 current dw ? new dw 0 sssp dd 0 dd 0 dd 0 dd 0 stack1 db 100h dup(0) stack2 db 100h dup(0) stack3 db 100h dup(0) dprior db 1 db 2 db 3 cprior db 1 db 2 db 3 pcount db 0 db 0 db 0 CSEG ends end start История такова: первый раз,когда вызывается обработчик наш f_start, на строчке Код (Text): cmp current,0 je began он понимает, что ничего не инициализированно, идет на began, там делает своё дело, присваивает current=1,мол все сделано, по команде iret выходит в 1 процесс, по истечению 55 миллисекунд вызывается опять наш обработчик, далее строчку Код (Text): cmp current,0 je began он естественно теперь минует, дальше идут строки Код (Text): mov ax,[max] cmp [counter],ax popa ja done0 pusha mov si,[current] sub si,1 cmp [cprior+si],1 !!! При просмотре в отладчике, после строки popa и ja done0 идут строки add чего-то or чего-то и call кого-то, который уходит в никуда. Итак, знатоки, вопрос: а собственно какого фига, половина кода куда-то девается и на её месте образуется ерундятита?
lolo 1) Терминология. Планировщик потоков, а не процессов. 2) Не очевиден тип исполняемого модуля - Com или Exe. 3) Реентерабельность. ps Код (Text): ... began: ... push ax mov ax,1 mov current,ax pop ax jmp endml ... выполняется один раз, потоки еще не стартовали. Imho можно выполнить его до замены обработчика int8h, который и без того трудно читаем.
Программа под dos, отладчик turbo debugger, с tasm, который по стандарту идет. Проблемма не в отладчике, программа примерно на этом моменте виснет и в отладчике видно где она виснет, причина тому отстутствие при втором вызове обработчика части кода, очень нужна помощь, где чего может не хватает и вообще в чем проблема. q_q - спасибо за терминологию. Вроде как exe файл,в институтском учебнике вся разница сводится к написанию org 100h или нет. Про инициализацию ты прав, так думаю будет лучше, сейчас изменю.
после переброса инициализации в главную программу, упрощение(небольшого) самого планеровщика, вроде теперь нормально стал перепрыгивать по процессам, но так и не ясно, почему в предыдущем случае выдавал такие неожиданные результаты, тему пока не закрывайте,прогу пока не доделал, будут вопросы сюда отпишусь, q_q great respect.
lolo Проблемма не в отладчике В методе отладки есть проблема. Пока ты в отладчике смотришь код под отладчиком, прерывание int8h произойдет _очень_ много раз. Поэтому код обработчика необходимо изменить Код (Text): already db 0 ;; для обеспечения реентерабельности even f_start: pushf call dword ptr CS:[timer] cmp cs:[already],0 jz short int_continue iret int_continue: mov cs:[already],1 sti ... mov cs:[already],0 iret Вроде как exe файл,в институтском учебнике вся разница сводится к написанию org 100h Не только. Использование директивы ASSUME не достаточно. Необходимо программно настроить регистры SS и DS. В твоем коде присутствует обращение к переменным без указания CS, т.е. подразумевается DS, а он настроен на PSP (убедиться в этом можно в отладчике). Между ними разница 256 байт.
респект, ща буду править. Блииииин, сколько я с ней сидел, просто мега респект, вся проблема была в ненастроенных регистрах DS и SS, настроил, сразу все залетало!!! Правда там еще один маленький баг был, ну это фигня. СПАСИБО!!!
q_q Да ну! В комках CS=DS=ES=SS в отладчике можно посмотреть На что по-твоему должны быть настроены регистры, как не на PSP?
Vov4ick В комках CS=DS=ES=SS Не спорю. Будь внимательнее. На мой вопрос о типе файла, был получен ответ: "Вроде как exe файл". Поэтому я и упомянул о необходимости настроить сегментные регистры.
Vov4ick DOS сама устанавливает SS при старте ехешника Согласен. Только в показанном в #1 коде не определен сегмент стека, линкер предупредит о его отсутствии, а dos'у укажет настроить ss:sp на cs:0. Для данной программы это не проблема.