Цитата(EASports @ 12.5.2007, 01:21 ) | | Чё-т у меня ну никак не получается вызвать прерывание из прерывания. |
есть такое страшное слово - нереентерабельность. кратко суть: int21 использует при работе некий кусок данных - хранит там, грубо, свое состояние. теперь ситуация: программа вызывает функцию, например, чтения строки/символа - т.е. выполнение "циклится" внутри 21h. приходит прерывание таймера, в котором ты пытаешься вывести строку посредством вызова 21h - получается вложенный вызов: находясь в обработчике 21h(чтение строки), опять вызывается обработчик 21h(вывод). те самые данные "накрываются" - системе каюк. борьба с нереентерабельностью заключается в вывешивании флагов и опросах спец.флагов доса...
к нашим баранам: зачем тебе вообще таймер в твоей задаче? пробила меня ностальгия, так что вот тебе "пирожок"(разгрызешь, надеюсь, сам): 
| Код | ; tasm sample.asm ; tlink /t sample.obj
.model tiny .386 .code
MaxPswLen equ 8 BlFunc equ 4b00h
org 100h
start: jmp init
log_name db '4blog.txt',0
sPswPmt db 'pass: $'
BlProg db 'mem.exe' BlProgLen = ($ - BlProg)
BlPass db '123' BlPassLen = ($ - BlPass)
psw_buf db MaxPswLen + 1 psw_len db 0 psw_data db (MaxPswLen + 1) dup (0)
int_21h proc
cmp ax, BlFunc jne jmp_old
pushf pusha push ds es
;-- dbg log + pusha push ds mov si, ds mov di, dx push cs pop ds mov ax, 3d02h mov dx, offset log_name xor cx, cx int 21h mov bx, ax jnc skip_creat mov ah, 3ch mov dx, offset log_name xor cx, cx int 21h mov bx, ax skip_creat: mov ax, 4202h xor cx, cx xor dx, dx int 21h mov ds, si mov es, si mov dx, di mov cx, -1 xor ax, ax repne scasb not cx mov ah, 40h int 21h mov ah, 3eh int 21h ret_log: pop ds popa ;-- dbg log -
cld mov cx, -1 push ds pop es mov di, dx xor ax, ax repne scasb not cx dec cx mov dx, cx dec di mov al, '\' fname: cmp al, es:[di-1] je cmp_name dec di loop fname cmp_name: sub dx, cx mov cx, dx cmp cx, BlProgLen jne rest_jmp_old push cs pop ds mov si, offset BlProg next_nc: mov al, es:[di] or al, 20h cmp al, ds:[si] jne rest_jmp_old inc di inc si loop next_nc push cs pop ds mov ah, 9 mov dx, offset sPswPmt int 21h mov ah, 0ah mov dx, offset psw_buf int 21h xor cx, cx mov cl, psw_len cmp cl, BlPassLen jne rest_iret mov si, offset BlPass push cs pop es mov di, offset psw_data repe cmpsb je rest_jmp_old
rest_iret: pop es ds popa popf stc mov ax, 5 iret
rest_jmp_old: pop es ds popa popf
jmp_old: db 0eah old_21h dd 0
int_21h endp
init:
mov ax, ds:[2ch] mov es, ax mov ah, 49h int 21h mov word ptr ds:[2ch], 0
mov ax, 3521h int 21h mov word ptr old_21h, bx mov word ptr old_21h[2], es mov ax, 2521h lea dx, int_21h int 21h
lea dx, init int 27h
end start
|
ps. мысли о какой-либо оптимизации меня не посещали, поэтому тут уж сами... 
|