@DVoropaev
Ставлю + к карме на хабре за ответы на вопросы

Почему программа вылетает с ошибкой invalid Opcode?

Задача такая:
Написать резидентную программу для 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, она просто выводит текст. такое название, потому что в следующей доработке должна выводить время)
  • Вопрос задан
  • 1461 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы