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

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

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

Так что добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Проблема с выбором пунктов меню
Написал программу, компилируется без ошибок, все функции работают, но при выборе пункта меню tasm зависает (не реагирует на последующий ввод). Программа резидентная. Компиляцию проводил следующими командами: Прикреплённый файлПрикреплённый файлmain.asm (8,94 Кбайт, скачиваний: 6)
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.
vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
Jin X, спасибо большое, проект уже сдал, но программу доработаю, по скольку потом точно будут вопросы)
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1060 ]   [ 21 queries used ]   [ Generated: 17.07.18, 03:54 GMT ]