Затем перехвать вектор обработки недействительной операции в нём распознать что у нас соотвествует mov ds,cs и тогда код из #6 и одна загвоздка остаётся - чтобы перехвать вектор обработки недействительной операции как раз и нужно применить mov ds,cs ((
Ustus А если со стеком бедэ?) А мы ее сэмулируем)) А идея ниче так )) Например, сделать MOV DS,CS как сочетание UD2 + 0xFF например )
Так... едем дальше... Задача: Установить будильник на определённое время. Выйти из проги. Через определенное время должно что-то случиться Код: ;===загрузка и запуск програм7ы=== DATA SEGMENT Message2 db 10,13,'Seting up alarm...',10,13,'Input seconds:','$' Message3 db 10,13,'Input minutes:','$' Message4 db 10,13,'Input hours:','$' Seconds DB 0 Minutes DB 0 Hours DB 0 PARAMETERS DW 7 DUP(0) ;нулевой блок параметров KEEP_SS DW 0 ;переменная для SS KEEP_SP DW 0 ;переменная для SP BUF DB 255 DUP(0) ;переменная для хранения DATA ENDS STK SEGMENT STACK ;сегмент стека DB 128 DUP(?) STK ENDS CODE SEGMENT ;сегмент кода ASSUME DSATA,CS:CODE,SS:STK; связуем регистры с сегментами INPUT PROC ;п_дпрограма вводу з клав?атури ;IN: ; CX - число символ?в для введення ; DX - адреса буфера для вводу (BUF) mov bx,dx mov [bx],cl mov ah,0ah int 21h xor ch,ch mov cl,[bx+1] add bx,cx add bx,2 mov [bx],0 RET INPUT ENDP ; ПЕРЕВОД СТРОКОВОГО ЧИСЛА В ЧИСЛОВОЙ ВИД ; Вход: ; DS:SI - адрес строки с числом. Конец числа отмечен кодом 00h ; Выход: ; CF - индикатор ошибок: ; 0 - ошибок нет; ; 1 - ошибка ; Если CF=0, то AX - число. str_10 proc push bx push cx push dx push di xor cx,cx i1: lodsb cmp al,0 je i_exit cmp al,'0' jb err cmp al,'9' ja err sub al,'0' shl cx,1 jc err mov bx,cx shl cx,1 jc err shl cx,1 jc err add cx,bx jc err cbw add cx,ax jc err i3: inc di jmp short i1 i_exit: mov ax,cx clc i4: pop di pop dx pop cx pop bx ret err: stc jmp short i4 str_10 endp Alarm Proc message10 db 'LOL','$' lea dx,Message10 mov ah,09h int 21h iret Alarm ENDP START: MOV AX,DATA ;загружаем в DS начальный адрес DATA MOV DS,AX ;---получаем параметры для работы--------------------- lea dx,Message1 mov ah,09h int 21h lea dx,Message2 mov ah,09h int 21h mov cx,4 lea dx,buf call input lea si,buf add si,2 call str_10 mov Seconds,al lea dx,Message3 mov ah,09h int 21h mov cx,4 lea dx,buf call input lea si,buf add si,2 call str_10 mov Minutes,al lea dx,Message4 mov ah,09h int 21h mov cx,4 lea dx,buf call input lea si,buf add si,2 call str_10 mov Hours,al ;---замена прерывания--------------------------------- push ds push cs pop ds mov ah,25h mov al,4ah lea dx,Alarm int 21h pop ds ;back to normal ; int 4ah ;---сбрасываем будильник------------------------------ mov ah,07h int 1ah ;---устанавливаем будильник-------]-------------------- mov ah,06h mov ch,hours mov cl,minutes mov dh,seconds int 1ah ; xor ax,ax ; int 16h; ;---возвращаемся в ДОС--------- MOV AX,4C00H INT 21H CODE ENDS END START Результат: Отсутствует