Построение модуля динамической структуры. Прерывание Ctrl + C - Assembler

Узнай цену своей работы

Формулировка задачи:

помогите пожалуйста, не могу понять почему прерывание ctrl+c не работает, вместо него выводит просто символ как и в других случаях. Суть программы мы запускаем 6.exe и к ней подключается 2.com.Дочерний модуль ждёт нажатия клавиши. Если нажать любую клавишу, то код клавиши запишется в регистр AL, а дочерний модуль завершится и управление перейдёт вызывающей программе. Вызывающая программа выведет символ, который был нажат для завершения работы дочернего модуля.Также требуется прерывание сочетанием ctrl+c, которое у меня выводит просто символ.Выручает, молю.
.model small
.data
succ_comp_msg db 13, 10, "The process was successfully completed, with the code: $"
err_comp_msg db 13, 10, "ERROR: The file doesn't find!", 13, 10, "$"
ctrl_c db 13, 10, "Process was ended with ctrl+c$"
PSP dw ?
namefile db 50 dup(0)
eol db "$"
argu dw 7 dup(?)
reg_ss dw ?
reg_sp dw ?
reg_ds dw ?
f_mem_err db 0
.stack 100h
.code
;-----------------------------------------------------
TETR_TO_HEX   PROC  near
    and      AL,0Fh
    cmp      AL,09
    jbe      NEXT
    add      AL,07
    NEXT:      add      AL,30h
    ret
TETR_TO_HEX   ENDP
BYTE_TO_HEX   PROC  near
    push     CX
    mov      AH,AL
    call     TETR_TO_HEX
    xchg     AL,AH
    mov      CL,4
    shr      AL,CL
    call     TETR_TO_HEX 
    pop      CX         
    ret
BYTE_TO_HEX  ENDP
 
write_str PROC
    push ax
    mov ah, 09h
    int 21h
    pop ax
    ret
write_str ENDP
;-----------------------------------------------------
freeMem PROC
    lea bx, PROGEND
    mov ax, es
    sub bx, ax
    mov cl, 4
    shr bx, cl
    mov ah, 4Ah 
    int 21h
    jc err
    jmp noterr
    err:
        mov f_mem_err, 1
    noterr:
        ret
freeMem ENDP
;-----------------------------------------------------
exitProg PROC
    mov ah, 4Dh
    int 21h
    cmp ah, 1
    je errchild
    lea bx, succ_comp_msg
    mov [bx], ax
    lea dx, succ_comp_msg
    push ax
    call write_str
    pop ax
    call byte_to_Hex
    push ax
    mov dl, ' '
    mov ah, 2h
    int 21h
    pop ax
    push ax
    mov dl, al
    mov ah, 2h
    int 21h
    pop ax
    mov dl, ah
    mov ah, 2h
    int 21h
    jmp exget
    errchild:
        lea dx, ctrl_c
        call write_str
    exget:
        ret
exitProg ENDP
;-----------------------------------------------------
Main proc
    mov ax, @data
    mov ds, ax
    push si
    push di
    push es
    push dx
    mov es, es:[2Ch]
    xor si, si
    lea di, namefile
    env_char: 
        cmp byte ptr es:[si], 00h
        je env_crlf
        inc SI
        jmp env_next
    env_crlf:   
        inc si
    env_next:       
        cmp word ptr es:[si], 0000h
        jne env_char
        add si, 4           
    abs_char:
        cmp byte ptr es:[si], 00h
        je vot
        mov dl, es:[si]
        mov [di], dl
        inc si
        inc di
        jmp abs_char       
    vot:
        sub di, 5
        mov dl, '2'
        mov [di], dl
        add di, 2
        mov dl, 'c'
        mov [di], dl
        inc di
        mov dl, 'o'
        mov [di], dl
        inc di
        mov dl, 'm'
        mov [di], dl
        inc di

        mov [di], dl
        inc di
        mov dl, eol
        mov [di], dl
        pop dx
        pop es
        pop di
        pop si
        call freeMem
        cmp f_mem_err, 0
        jne ex
        push ds
        pop es
        lea dx, namefile 
        lea bx, argu 
        mov reg_ss, ss
        mov reg_sp, sp
        mov reg_ds, ds
        mov ax, 4b00h
        int 21h
        mov ss, reg_ss
        mov sp, reg_sp
        mov ds, reg_ds
        jc erld
        jmp noterld
    erld:
        lea dx, err_comp_msg
        call write_str
        lea dx, namefile
        call write_str
        jmp ex
    noterld:
        call exitProg
    ex:
        mov ah, 4Ch
        int 21h
main ENDP
;-----------------------------------------------------
PROGEND PROC
PROGEND ENDP
;-----------------------------------------------------
end main
Вот дочерняя программка для запуска.
TESTPC     SEGMENT
           ASSUME  CS:TESTPC, DS:TESTPC, ES:NOTHING, SS:NOTHING
           ORG     100H
START:     JMP     BEGIN
STR_NUM     db      "0000$"
 
lock_mem db "Address not available memory.: $"
env_addr db 10, 13, "Address of environment: $$"
tail_comm db 10, 13, "The tail command line: $"
cont_str db 10, 13, "Contents: $"
path_mem db 10, 13, "Path: $"
press_key db 13, 10, "Press any key...", 13, 10, "$"
child_proc db 13, 10, "Launched a child process.", 13, 10, "$"
;-----------------------------------------------------
TETR_TO_HEX   PROC  near
           and      AL,0Fh
           cmp      AL,09
           jbe      @NEXT
           add      AL,07
@NEXT:     add      AL,30h
           ret
TETR_TO_HEX   ENDP
 
BYTE_TO_HEX   PROC  near
           push     CX
           mov      AH,AL
           call     TETR_TO_HEX
           xchg     AL,AH
           mov      CL,4
           shr      AL,CL
           call     TETR_TO_HEX
           pop      CX         
           ret
BYTE_TO_HEX  ENDP
 
WRD_TO_HEX   PROC  near
           push     BX
           mov      BH,AH
           call     BYTE_TO_HEX
           mov      [DI],AH
           dec      DI
           mov      [DI],AL
           dec      DI
           mov      AL,BH
           call     BYTE_TO_HEX
           mov      [DI],AH
           dec      DI
           mov      [DI],AL
           pop      BX
           ret
WRD_TO_HEX ENDP
 
BYTE_TO_DEC   PROC  near
           push     CX
           push     DX
 
           xor      AH,AH
           xor      DX,DX
           mov      CX,10
loop_bd:   div      CX
           or       DL,30h
           mov      [SI],DL
           dec      SI
           xor      DX,DX
           cmp      AX,10
           jae      loop_bd
           cmp      AL,00h
           je       end_l
           or       AL,30h
           mov      [SI],AL
end_l:     pop      DX
           pop      CX
           ret
BYTE_TO_DEC    ENDP
;-----------------------------------------------------
BEGIN:
    lea dx, child_proc
    mov AH,09h
    int 21h
 
    mov DX, offset lock_mem
    mov AH, 09h
    int 21h
 
    mov ax, ds:[0002h]
    mov di, offset STR_NUM + 3
    call WRD_TO_HEX
    mov dx, offset STR_NUM
    mov ah, 09h
    int 21h 
    
    mov dx, offset env_addr
    mov ah, 09h
    int 21h    
 
    mov ax, ds:[002Ch]
    mov di, offset STR_NUM + 3
    call WRD_TO_HEX
    mov dx, offset STR_NUM
    mov ah, 09h
    int 21h 
 
    mov dx, offset tail_comm
    mov ah, 09h
    int 21h  
 
    xor cx, cx      
    xor bx, bx
    mov cl, byte ptr ds:[80h]    
    cmp cl, 0h
    je no_args    
    next:        
        mov dl, byte ptr ds:[bx + 81h]
        mov ah, 02h   
        int 21h      
        inc bx
        loop next   
    no_args:        
        mov dx, offset cont_str
        mov ah, 09h
        int 21h  
        
        push es
        push ds:[02ch]
        pop es     
        xor bx, bx
        mov dl, byte ptr es:[bx]
    next2:
        cmp dl, 0
        je one_zero
        mov ah, 02h   
        int 21h    
        inc bx
        mov dl, byte ptr es:[bx]    
        jmp next2
    one_zero:    
        mov ah, 02h   
        mov dl, 10
        int 21h    
        mov dl, 13
        int 21h
        inc bx    
        mov dl, byte ptr es:[bx]        
        cmp dl, 0
        je program_path
        jmp next2
    program_path: 
        mov dx, offset path_mem    
        mov ah, 09h
        int 21h
        add bx, 3    
    next3:    
        mov dl, byte ptr es:[bx]
        mov ah, 02h   
        int 21h 
        inc bx
        cmp dl, 0          
        jne next3   
        pop es
    exit:
        lea dx, press_key
        mov ah, 09h
        int 21h
        mov ah, 1
        int 21h
        mov ah, 4Ch
        int 21h
TESTPC     ENDS
           END     START

Решение задачи: «Построение модуля динамической структуры. Прерывание Ctrl + C»

textual
Листинг программы
1
2
3
4
5
6
7
8

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5
Похожие ответы