Проблема в программе.(исчезает часть кода)

Тема в разделе "WASM.BEGINNERS", создана пользователем lolo, 13 май 2007.

  1. lolo

    lolo New Member

    Публикаций:
    0
    Регистрация:
    13 май 2007
    Сообщения:
    4
    Вот программка(планеровщик 3 процессов-простенький, суть скакать по ним и сохранять для каждого процесса все регистры в отдельной стэке для каждого процесса):
    Код (Text):
    1. .286
    2. CSEG segment
    3. assume CS:CSEG,DS:CSEG,SS:CSEG
    4.  
    5. start:
    6.     xor ax,ax
    7.     mov ES,ax
    8.  
    9.     cli
    10.     mov ax,ES:[08h*4]
    11.     mov word ptr CS:[timer],ax
    12.     mov ax,ES:[08h*4+2]
    13.     mov word ptr CS:[timer+2],ax
    14.  
    15.         mov ax,offset f_start
    16.     mov word ptr ES:[08h*4],ax
    17.     mov word ptr ES:[08h*4+2],CS
    18.    
    19.     push ax
    20.     mov ax,0
    21.     mov [current],ax
    22.     pop ax
    23.     sti
    24.  
    25. stop_prog:
    26.     mov ax,[max]
    27.     cmp CS:[counter],ax
    28.         jb stop_prog
    29.  
    30.     xor ax,ax
    31.     mov es,ax
    32.  
    33.     cli
    34.     mov ax,word ptr CS:[timer]
    35.     mov word ptr ES:[08h*4],ax
    36.     mov ax,word ptr CS:[timer+2]
    37.     mov word ptr ES:[08h*4+2],ax
    38.     sti
    39.  
    40.     int 20h
    41.    
    42. f_start:
    43.     ;Задержка
    44.     push cx
    45.         mov cx,65000
    46. d1:
    47.     push cx
    48.         mov cx,5000
    49. d2:
    50.         loop d2
    51.     pop cx 
    52.         loop d1
    53.     pop cx     
    54.    
    55.     sti
    56.     pushf
    57.     call dword ptr CS:[timer]
    58.     ;Увеличиваем счетчик входа в прерывание
    59.     add counter,1
    60.    
    61.     cmp current,4
    62.         je endml
    63.  
    64.     cmp current,0
    65.         je began
    66.  
    67.     pusha
    68.     mov ax,[max]
    69.     cmp [counter],ax
    70.     popa
    71.         ja done0
    72.  
    73.     pusha
    74.  
    75.     mov si,[current]
    76.     sub si,1
    77.     cmp [cprior+si],1
    78.     jne runcur
    79.     mov ax,[current]
    80.     add ax,1
    81.     cmp ax,4
    82.     je ax1
    83.     jmp anc
    84. ax1:
    85.     mov ax,1
    86.     jmp anc
    87. runcur:
    88.     sub [cprior+si],1
    89.     popa
    90.         jmp endml
    91. done0:
    92.         jmp done
    93.  
    94. endml:
    95.     iret
    96.        
    97.     anc:
    98.     mov [new],ax
    99.     mov al,[dprior+si]
    100.     mov [cprior+si],al
    101.     popa
    102.         jmp change
    103.    
    104.     ;Код первого запуска
    105. began:
    106.     pusha
    107.     mov word ptr [sssp],ss
    108.     mov word ptr [sssp+2],sp   
    109.    
    110.     mov sp,offset stack3+100h
    111.     pushf
    112.     push CS
    113.         push offset process3
    114.     pusha
    115.     push es
    116.     mov word ptr [sssp+12],ss
    117.     mov word ptr [sssp+14],sp
    118.  
    119.     mov sp,offset stack2+100h
    120.     pushf
    121.     push CS
    122.         push offset process2
    123.     pusha
    124.     push es
    125.     mov word ptr [sssp+8],ss
    126.     mov word ptr [sssp+10],sp
    127.        
    128.     mov sp,offset stack1+100h
    129.     pushf
    130.     push CS
    131.         push offset process1
    132.     mov word ptr [sssp+4],ss
    133.     mov word ptr [sssp+6],sp
    134.     push ax
    135.     mov ax,1
    136.     mov current,ax
    137.     pop ax
    138.         jmp endml
    139. done:
    140.     mov ss,word ptr [sssp]
    141.     mov sp,word ptr [sssp+2]
    142.     popa
    143.     push ax
    144.     mov ax,4
    145.     mov current,ax
    146.     pop ax
    147.  
    148.         jmp endml
    149.  
    150. change:
    151.     ;Сохраняем ES и регистры
    152.     pusha
    153.     push es
    154.  
    155.     ;Подменяем стеки
    156.     mov di,current
    157.     mov si,new
    158.     shl di,2
    159.     shl si,2
    160.     mov ax,word ptr [sssp+si]
    161.     mov bx,word ptr [sssp+si+2]
    162.     mov word ptr [sssp+di],ss
    163.     mov word ptr [sssp+di+2],sp
    164.     mov ss,ax
    165.     mov sp,bx
    166.    
    167.     ;Current:=New
    168.     push ax
    169.     mov ax,[new]
    170.     mov CS:[current],ax
    171.     pop ax
    172.        
    173.     ;Восстанавливаем ES и регистры
    174.     pop es
    175.     popa
    176.         jmp endml
    177.  
    178. process1 proc
    179. p1l1:
    180.     push 0B800h
    181.     pop es
    182.     mov di,140
    183.     mov ah,101
    184.     mov al,'1'
    185.     mov es:[di],al
    186.     jmp p1l1
    187. process1 endp
    188.  
    189. process2 proc
    190. p2l1:
    191.     push 0B800h
    192.     pop es
    193.     mov di,142
    194.     mov al,'2'
    195.     mov es:[di],al
    196.     jmp p2l1
    197. process2 endp
    198.  
    199. process3 proc
    200. p3l1:
    201.     push 0B800h
    202.     pop es
    203.     mov di,144
    204.     mov al,'3'
    205.     mov es:[di],al
    206.     jmp p3l1
    207. process3 endp
    208.  
    209.  
    210.  
    211. timer dd 0
    212. counter dw 0
    213. max dw 20
    214. current dw ?
    215. new dw 0
    216.  
    217. sssp dd 0
    218.      dd 0
    219.      dd 0
    220.      dd 0
    221.  
    222. stack1 db 100h dup(0)
    223. stack2 db 100h dup(0)
    224. stack3 db 100h dup(0)
    225.  
    226. dprior db 1
    227.        db 2
    228.        db 3
    229. cprior db 1
    230.        db 2
    231.        db 3
    232.        
    233. pcount db 0
    234.        db 0
    235.        db 0
    236.  
    237. CSEG ends
    238.  
    239. end start
    История такова: первый раз,когда вызывается обработчик наш f_start, на строчке
    Код (Text):
    1.     cmp current,0
    2.         je began
    он понимает, что ничего не инициализированно, идет на began, там делает своё дело, присваивает current=1,мол все сделано, по команде iret выходит в 1 процесс, по истечению 55 миллисекунд вызывается опять наш обработчик, далее строчку
    Код (Text):
    1.     cmp current,0
    2.         je began
    он естественно теперь минует, дальше идут строки
    Код (Text):
    1.     mov ax,[max]
    2.     cmp [counter],ax
    3.     popa
    4.         ja done0
    5.  
    6.     pusha
    7.  
    8.     mov si,[current]
    9.     sub si,1
    10.     cmp [cprior+si],1
    !!! При просмотре в отладчике, после строки popa и ja done0 идут строки add чего-то or чего-то и call кого-то, который уходит в никуда.
    Итак, знатоки, вопрос: а собственно какого фига, половина кода куда-то девается и на её месте образуется ерундятита?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    lolo
    1) Терминология. Планировщик потоков, а не процессов.
    2) Не очевиден тип исполняемого модуля - Com или Exe.
    3) Реентерабельность.

    ps
    Код (Text):
    1. ...
    2. began:
    3. ...
    4. push ax
    5. mov ax,1
    6. mov current,ax
    7. pop ax
    8. jmp  endml
    9. ...
    выполняется один раз, потоки еще не стартовали. Imho можно выполнить его до замены обработчика int8h, который и без того трудно читаем.
     
  3. horpis

    horpis New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    154
    а какой оладчик??? В Olly такое бывает.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    horpis
    Программа под dos. Причем тут Olly?
     
  5. lolo

    lolo New Member

    Публикаций:
    0
    Регистрация:
    13 май 2007
    Сообщения:
    4
    Программа под dos, отладчик turbo debugger, с tasm, который по стандарту идет. Проблемма не в отладчике, программа примерно на этом моменте виснет и в отладчике видно где она виснет, причина тому отстутствие при втором вызове обработчика части кода, очень нужна помощь, где чего может не хватает и вообще в чем проблема.
    q_q - спасибо за терминологию. Вроде как exe файл,в институтском учебнике вся разница сводится к написанию org 100h или нет. Про инициализацию ты прав, так думаю будет лучше, сейчас изменю.
     
  6. lolo

    lolo New Member

    Публикаций:
    0
    Регистрация:
    13 май 2007
    Сообщения:
    4
    после переброса инициализации в главную программу, упрощение(небольшого) самого планеровщика, вроде теперь нормально стал перепрыгивать по процессам, но так и не ясно, почему в предыдущем случае выдавал такие неожиданные результаты, тему пока не закрывайте,прогу пока не доделал, будут вопросы сюда отпишусь, q_q great respect.
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    lolo
    Проблемма не в отладчике
    В методе отладки есть проблема. Пока ты в отладчике смотришь код под отладчиком, прерывание int8h произойдет _очень_ много раз. Поэтому код обработчика необходимо изменить
    Код (Text):
    1. already db 0   ;; для обеспечения реентерабельности
    2. even
    3. f_start:
    4.   pushf
    5.   call dword ptr CS:[timer]
    6.   cmp cs:[already],0
    7.   jz short int_continue
    8.   iret
    9. int_continue:
    10.   mov cs:[already],1
    11.   sti
    12. ...
    13.   mov cs:[already],0
    14.   iret
    Вроде как exe файл,в институтском учебнике вся разница сводится к написанию org 100h
    Не только. Использование директивы ASSUME не достаточно. Необходимо программно настроить регистры SS и DS. В твоем коде присутствует обращение к переменным без указания CS, т.е. подразумевается DS, а он настроен на PSP (убедиться в этом можно в отладчике). Между ними разница 256 байт.
     
  8. lolo

    lolo New Member

    Публикаций:
    0
    Регистрация:
    13 май 2007
    Сообщения:
    4
    респект, ща буду править. Блииииин, сколько я с ней сидел, просто мега респект, вся проблема была в ненастроенных регистрах DS и SS, настроил, сразу все залетало!!! Правда там еще один маленький баг был, ну это фигня. СПАСИБО!!!
     
  9. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    q_q Да ну! В комках CS=DS=ES=SS в отладчике можно посмотреть :derisive:
    На что по-твоему должны быть настроены регистры, как не на PSP?
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Vov4ick
    В комках CS=DS=ES=SS
    Не спорю.
    Будь внимательнее. На мой вопрос о типе файла, был получен ответ: "Вроде как exe файл". Поэтому я и упомянул о необходимости настроить сегментные регистры.
     
  11. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Действительно, извиняюсь. Но вообще DOS сама устанавливает SS при старте ехешника.
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Vov4ick
    DOS сама устанавливает SS при старте ехешника
    Согласен.
    Только в показанном в #1 коде не определен сегмент стека, линкер предупредит о его отсутствии, а dos'у укажет настроить ss:sp на cs:0. Для данной программы это не проблема.
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Укажет - т.е. сформирует соответствующий заголовок exe'шника.