Построение модуля динамической структуры. Прерывание 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д