На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Проблема с выбором пунктов меню
    Написал программу, компилируется без ошибок, все функции работают, но при выборе пункта меню tasm зависает (не реагирует на последующий ввод). Программа резидентная. Компиляцию проводил следующими командами: Прикреплённый файлПрикреплённый файлmain.asm (8,94 Кбайт, скачиваний: 151)
    tasm /zi main.asm
    tlink /t main
    Кто может помогите с пунктами меню, буду очень благодарен и в долгу не останусь, нужно срочно до завтрашнего утра. Спасибо за понимание!
    ExpandedWrap disabled
              .model  tiny
              .code
              .386            
              org 2Ch
      envseg      dw  ?      
              org 80h
      cmd_len db  ?       ;довжина командного рядка
      cmd_line    db  ?   ;командний рядок
              org 100h        
              
      start:
              LOCALS
              JUMPS
              jmp initialize  
       
      hw_reset9:  retf            
       
      int09h_handler  proc    far             ;процедура оброник переривання від клавіатури
              jmp short actual_int09h_handler
      old_int09h  dd  ?          
              dw  424Bh          
              db  00h        
              jmp short hw_reset9    
              db  7 dup (0)      
      actual_int09h_handler:  
       
              pushf
              call    dword ptr cs:old_int09h
              
              pusha      
              push    ds  
              push    es
          
              push    0040h
              pop ds  
              mov di,word ptr ds:001Ah    
                          
              cmp     di,word ptr ds:001Ch    
                              
              je      exit_09h_handler    ;якщо буфер пустий - стрибок на вихід
       
              mov     ax,word ptr [di]    ;преревірка натиснутої клавіші
              cmp     ah,02h      
              jne     proc_two
       
              call perevirka      ;виклик процедури
              
              mov word ptr ds:001Ch,di
                      
              pusha
              cli
              
              ;виведення повідомлення
              mov ah,03h
              int 10h
                      
              mov ax, cs
              mov es, ax
              mov bp, offset msgOne  
              mov cx, 23
              mov ax, 1300h
              mov bl, 00000111b
              int 10h
              
              mov ax, 0200h
              mov bh, 0
              mov dl, 0
              inc dh
              int 10h
       
              sti
              popa
                      
              jmp     exit_09h_handler
              
          proc_two:
          
              mov     ax,word ptr [di]    
              cmp     ah,03h      
              jne     proc_three
       
              call objednannya
              
              mov word ptr ds:001Ch,di
                      
              pusha
              cli
              
              mov ah,03h
              int 10h
                      
              mov ax, cs
              mov es, ax
              mov bp, offset msgTwo
              mov cx, 23
              mov ax, 1300h
              mov bl, 00000111b
              int 10h
              
              mov ax, 0200h
              mov bh, 0
              mov dl, 0
              inc dh
              int 10h
       
              sti
              popa
              
              jmp     exit_09h_handler
              
          proc_three:
              
              mov     ax,word ptr [di]    
              cmp     ah,04h      
              jne     proc_four
       
              call peretyn
              
              mov word ptr ds:001Ch,di
                      
              pusha
              cli
              
              mov ah,03h
              int 10h
                      
              mov ax, cs
              mov es, ax
              mov bp, offset msgThree
              mov cx, 25
              mov ax, 1300h
              mov bl, 00000111b
              int 10h
              
              mov ax, 0200h
              mov bh, 0
              mov dl, 0
              inc dh
              int 10h
       
              sti
              popa
              
              jmp     exit_09h_handler
              
          proc_four:
       
              mov     ax,word ptr [di]    
              cmp     ah,05h      
              jne     exit_09h_handler
       
              call riznucya
              
              mov word ptr ds:001Ch,di
                      
              pusha
              cli
              
              mov ah,03h
              int 10h
                      
              mov ax, cs
              mov es, ax
              mov bp, offset msgFour
              mov cx, 27
              mov ax, 1300h
              mov bl, 00000111b
              int 10h
              
              mov ax, 0200h
              mov bh, 0
              mov dl, 0
              inc dh
              int 10h
       
      exit_09h_handler:      
              pop es
              pop ds  
              popa
              iret        
       
      ; Дані які використовує процедура
      k dw 5
      m1 db 3,4,5,8
      m2 db 2,4,7
      M db ?
      P db ?
      R db ?
      per db 0
       
      msgOne db '1',13,10
      msgTwo db '2',13,10
      msgThree db '3',13,10
      msgFour db '3',13,10
      YesMessage DB 'element is in set',13,10,'$'
      NoMessage DB 'element is not in set',13,10,'$'
       
      perevirka proc near
       
      pusha
       
      mov ax,4
      mov bh,8
      div bh
      mov bl,al
      mov bh,0
      mov al,m1[bx]
      mov cl,ah
      shl al,cl
      test al,80h
      jz no
       
      yes:
       
      mov  ah,9
      mov  dx,OFFSET YesMessage
      int  21h
      ret
       
      no:
       
      mov  ah,9
      mov  dx,OFFSET NoMessage
      int  21h
       
      popa
       
      ret
       
      perevirka endp
       
      objednannya proc near
       
      pusha
       
      mov cx,3
      mov bx,0
      mov di,0
       
      ob1:
       
      push cx
      mov cx,4
       
      mov al,m1[bx]
      mov M[bx],al
      inc bx
       
      loop ob1
       
      pop cx
       
      ob2:
       
      push cx
      mov cx,4
       
      ob3:
       
      mov al,m2[bx]
      cmp al,m1[di]
      jne ob4
      mov per,1
       
      ob4:
       
      loop ob3
      cmp per,1
      je ob5
       
      mov al,m2[bx]
      mov M[bx],al
      inc bx
       
      ob5:
       
      pop cx
       
      loop ob2
       
      popa
       
      ret
       
      objednannya endp
       
      peretyn proc near
       
      pusha
       
      mov cx,12
      mov bx,0
      mov di,0
       
      z1:
       
      Z2:
       
      mov al,m1[bx]
      cmp al,m2[di]
      je z3
      inc bx
       
      loop z1
       
      inc di
      mov bx,0
       
      loop z2
       
       
      z3:
       
      mov P[bx],al
      inc bx
       
      cmp cx,0
      jne z1
       
      popa
       
      ret
      peretyn endp
       
      riznucya proc near
       
      pusha
       
      mov cx,12
      mov bx,0
      mov di,0
       
      r1:
       
      r2:
       
      mov al,m1[bx]
      cmp al,m2[di]
      je r3
      inc bx
       
      loop r1
       
      inc di
      mov bx,0
       
      loop r2
       
       
      r3:
       
      mov P[bx],al
      inc bx
       
      cmp cx,0
      jne r1
       
      popa
      ret
      riznucya endp
       
      int09h_handler  endp        
       
      hw_reset2D: retf            
       
       
      ;Процедура обробник мультиплексорного преривання
      int2Dh_handler  proc    far
              jmp short actual_int2Dh_handler
      old_int2Dh  dd  ?          
              dw  424Bh            
              db  00h        
              jmp short hw_reset2D    
              db  7 dup (0)      
      actual_int2Dh_handler:      
              db  80h,0FCh    
      mux_id      db  ?      
              je  its_us      
              jmp dword ptr cs:old_int2Dh
      its_us:
              cmp al,06      
              jae int2D_no    
              cbw        
              mov di,ax      
              shl di,1
              jmp word ptr cs:jumptable[di]
              
      ;Таблиця стрибків на функції мультиплексорного переривання
      jumptable   dw  offset int2D_00,offset int2D_no
              dw  offset int2D_02,offset int2D_no
              dw  offset int2D_04,offset int2D_05
       
      ;Функція преревірки в наявності
      int2D_00:          
              mov al,0FFh
              mov cx,0100h
              push    cs
              pop dx      
              mov di,offset amis_sign
              iret
      int2D_no:          
              mov al,00h  
              iret
       
      unload_failed:
              mov al, 01h
              iret
       
      ;Функція вивантаження з памяті
      int2D_02:          
          cli    
          push    0
          pop ds  
                  
          mov ax,cs  
       
          cmp ax,word ptr ds:[09h*4+2]
          jne unload_failed
          cmp ax,word ptr ds:[2Dh*4+2]
          jne unload_failed
       
          push    bx      
          push    dx
       
       
          mov ax,2509h
          lds dx,dword ptr cs:old_int09h
          int 21h
          mov ax,252Dh
          lds dx,dword ptr cs:old_int2Dh
          int 21h
       
          mov ah,51h  
          int 21h      
       
          mov word ptr cs:[16h],bx    
                  
          pop dx  
          pop bx
          mov word ptr cs:[0Ch],dx
          mov word ptr cs:[0Ah],bx
       
          push    cs
          pop     bx      
          mov     ah,50h  
          int     21h    
          mov     ax,4CFFh
          int     21h    
       
      ;отримати список переривань
      int2D_04:      
              mov dx,cs      
              mov bx,offset amis_hooklist
              iret
              
      ;Отримати список перехоплених клавіш
      int2D_05:        
              mov al,0FFh
              mov dx,cs      
              mov bx,offset amis_hotkeys
              iret
      int2Dh_handler  endp
       
      ;сигнатура
      amis_sign   db  "Pankiv  "  
                  db  "Course  "  
                  db  "Course Project",0
       
      ;переривання
      amis_hooklist   db  09h
                      dw  offset int09h_handler
                      db  2Dh
                      dw  offset int2Dh_handler
       
      ;Список клавіш
      amis_hotkeys    db  01h
                      db  5  
                      db  02h,03h,04h,05h,06h
                      dw  0  
                      db  1  
       
      ;Процедура ініціалізації
      initialize  proc near
                  
              jmp short initialize_entry_point
              
      exit_with_message:
              mov ah,9    
              int 21h
              ret    
       
      ;Прграма вже завантажена
      already_loaded:
          cmp byte ptr unloading,1    
          je  do_unload
          mov dx,offset already_msg
          jmp short exit_with_message
       
      ;проблеми з завантаженням
      cant_unload1:  
          mov dx,offset cant_unload1_msg
          jmp short exit_with_message
          
      ;вивантаження з памяті
      do_unload:  
          inc ah
          mov al,02h  
          mov dx,cs          
          mov bx,offset exit_point
          int 2Dh
       
          push cs
          pop ds
          mov dx,offset cant_unload2_msg
          jmp short exit_with_message
       
      ;вихід з програми
      exit_point:
          push    cs
          pop ds
          mov dx,offset unloaded_msg
          push    0      
          jmp short exit_with_message
          
      ;Перевірка командного рядка
      initialize_entry_point:
          cld
       
          cmp byte ptr cmd_line[1],'/'
          jne not_unload
          cmp byte ptr cmd_line[2],'u'
          jne not_unload
          mov byte ptr unloading,1    
      not_unload:
       
          mov ah,9
          mov dx,offset usage
          int 21h
       
          mov ah,-1      
              
      more_mux:
              mov al,00h      
              int 2Dh    
              cmp al,00h  
              jne not_free
              mov byte ptr mux_id,ah
              jmp short next_mux
      not_free:
              mov es,dx      
              mov si,offset amis_sign
              mov cx,16      
              repe    cmpsb
              jcxz    already_loaded
      next_mux:
              dec ah      
              jnz more_mux
                  
      free_mux_found:
              cmp byte ptr mux_id,0  
              je  no_more_mux    
       
              mov ax,352Dh
              int 21h
              mov word ptr old_int2Dh,bx
              mov word ptr old_int2Dh+2,es
              mov ax,3509h        
              int 21h        
              mov word ptr old_int09h,bx  
              mov word ptr old_int09h+2,es
       
              mov ax,252Dh        
              mov dx,offset int2Dh_handler
              int 21h
              mov ax,2509h        
              mov dx,offset int09h_handler
              int 21h        
       
              mov ah,49h          
              mov es,word ptr envseg
              int 21h        
       
              mov ah,9
              mov dx,offset installed_msg
              int 21h        
       
              mov dx,offset initialize
                              
              int 27h          
       
      no_more_mux:
              mov ah,9
              mov dx,offset no_more_mux_msg
              int 21h
              ret
       
      usage       db  'Course project by Volodymyr Karplyuk (SI-31, TNTU)',13,10
              db  '[1] Perevirka',0Dh,0Ah
              db  '[2] Objednannya',0Dh,0Ah
              db  '[3] Peretyn',0Dh,0Ah
              db  '[4] Riznucya',0Dh,0Ah
              
              db  'main.com /u - to unload program from memory',0Dh,0Ah
              db  '',0Dh,0Ah
              db  '$'
       
      already_msg db  'ERROR: Already loaded',0Dh,0Ah,'$'
       
      no_more_mux_msg db  'ERROR: Too many TSR programs'
              db  ' loaded',0Dh,0Ah,'$'
       
      installed_msg   db  'Installed successfully',0Dh,0Ah,'$'
      cant_unload1_msg    db  "ERROR: Can't unload: program not found in memory",0Dh,0Ah,'$'
      cant_unload2_msg    db  "ERROR: Can't unload: another TSR hooked interrupts",0Dh,0Ah,'$'
      unloaded_msg    db  'Unloaded successfully',0Dh,0Ah,'$'
      unloading   db  0
              
      initialize  endp
      ;_main endp
      end start
      perevirka:
      1. Что за странные манипуляции (результат и так очевиден: 4/8 = 0, остаток 4, но дальше зачем-то идёт сравнение результата с чем-то)?
      ExpandedWrap disabled
        mov ax,4
        mov bh,8
        div bh
      2. pusha есть, а popa (для yes нет).
      3. Текущий сегмент = 40h, что мы выводим в итоге? В общем, надо push cs / pop ds.
      И вообще, я бы не советовал использовать int 21h для вывода, только из-за этого прога уже может зависнуть, а препод снизить балл, раз у вас там всё так заморочено, что аж int 2Dh используется (читай про InDOS Flag).

      objednannya:
      1. push cx стоит в цикле loop ob1, а pop cx – после цикла.
      2. после этого цикла cx = 0, затем идёт push cx, а перед loop ob2 – pop cx. Что имеем в итоге? loop ob2 будет крутить 65536 циклов, т.е. cx не инициализирован.

      peretyn:
      1.
      ExpandedWrap disabled
        z1:
        z2:
        loop z1
        loop z2
      Циклы перекрываются, т.е. loop z2 + loop z1 было бы логичнее (а не наоборот, как тут), к тому же значение cx для второго цикла не установлено, в итоге будет 65536 циклов (но в данном случае бесконечно из-за перекрытия).
      2.
      ExpandedWrap disabled
        cmp cx,0
        jne z1
      cx тут будет всегда = 0, т.к. после loop.

      riznucya:
      Всё то же самое, что в peretyn.
        Jin X, спасибо большое, проект уже сдал, но программу доработаю, по скольку потом точно будут вопросы)
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0317 ]   [ 17 queries used ]   [ Generated: 28.03.24, 18:06 GMT ]