Задача такая:
Написать резидентную программу для DOS (TASM), которая устанавливает прерывание, чтобы в 0:1 (ноль часов 1 минута) вывести "Hi"
Программа компилируется, запускается, в нужный момент выводит приветствие, ног тут же падает с ошибкой
Invalid Opcode at 0007 0001 0203 057B 0000 0000 ... 0000
Код спрятал в
спойлер
.model tiny
.code
org 100h
.386
start:jmp load
ASCIInullcolumn db 30h
outchar db ?
cursor db ?
mov cursor, 0
mode db ?
doubledot db 3Ah
old dd 0
;proces
setMode proc near
mov ah, 0Fh
int 10h
mov mode,al
mov ah,00h
mov al,3
int 10h
ret
setMode endp
setCursor proc
pusha
;set cursor
mov ah, 02h
mov bh,0
mov dh,0
mov dl,cursor;êîëóìí
int 10h
popa
ret
setCursor endp
showChar proc
pusha
mov ah,0Ah
mov al, outchar
mov bh,0
mov cx,1
int 10h
popa
ret
showChar endp
showTime proc
pusha
mov cursor,0
call setMode
call setCursor
inc cursor
call setCursor
mov outchar,48h;H
call showChar
inc cursor
call setCursor
mov outchar,69h;i
call showChar
popa
ret
showTime endp
handler:
handler proc near
pushf
call cs:old
push ds
push es
push ax
push bx
push cx
push dx
push di
push cs
pop ds
call showTime
iret
handler endp
end_handler:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;load;;;;;;;;;;;;;;;;;;;;
load:mov ax, 354Ah;35 - number of function, 4A - number of interrupt
int 21h
;setup alarm
mov ch,00h
mov cl,01h
mov dh,0;
mov ah,06h
int 1Ah;
mov word ptr old, bx
mov word ptr old+2,es
mov ax,254Ah
mov dx,offset handler
int 21h
mov ax,3100h
mov dx,(end_handler-start+10Fh)/16
int 21h
ret
end start
. (не обращайте внимание на название функции showTime, она просто выводит текст. такое название, потому что в следующей доработке должна выводить время)