[BITS 16]
ORG 0
JMP start
timer db 0
old_prt_seg dw 0
old_prt_off dw 0
start:
;инициализирую регистры
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
cli
; устанавливаю стэк
mov ax, 0x0600
mov ss, ax
xor ax, ax
mov sp, ax
; сохраняю/записываю старый/новый ветора прерываний 08h
mov es, ax
mov di, 08h * 4
mov ax, [es:di]
mov [es:old_prt_off], ax
mov ax, Timer_Int
mov [es:di], ax
add di, 2
mov ax, [es:di]
mov [cs:old_prt_seg], ax
mov ax, cs
mov [es:di], ax
sti
.begin:
; пустой код - по идее, отсчет 5 секунд
mov al, 5 ;кол-во секунд
.rep
mov cx, 3500
; 1 секунда ?
.loo
dec cx
jnz .loo
dec al
jnz .rep
; преобразования числа для вывода
mov al, [cs:timer]
aam
or ax, 03030h
mov dx, ax
mov al, ah ;выводим старшую цифру
mov ah,0eh
xor bx, bx
xor cx, cx
int 10h
mov al,dl
int 10h
; ждем нажатия клавишы `1`
xor ax,ax
int 16h
cmp al, 031h
jne .begin
; перезагрузка
db 0EAh
dw 0000h
dw 0FFFFh
;новый обработчик прерывания
Timer_Int:
jmp st
tmr db 0
st:
mov ax, [cs:old_prt_seg]
mov es, ax
mov ax, [cs:old_prt_off]
mov di, ax
;имитируем int
pushf
call [es:di]
;высчитываем кол-во тиков (больше 18 - секунда)
mov al, [cs:tmr]
inc al
cmp al, 18
jl .ex
mov ah, [cs:timer]
inc ah
mov [cs:timer], ah
xor ax, ax
.ex:
mov [cs:tmr], al
iret
;446 - кол-во байт до таблицы партиций
TIMES 446-($-$$) DB 0
Не могу подменить прерывание в MBR - виснет комп
Код:
так вот, прога запускается только один цикл, выводит 80 и виснет.
подскажите, что не так?
не подскажете - как отладить? ставить VMWare? или есть эмуляторы-отладчики? переписывать код не хочется, а в MBR все залочено на 07c0h
Вместо того чтобы отлаживать, лучше внимательно просмотри свой код... наверняка так какой-то баг с сегментными/внутрисегментными адресами. И еще... для детекта сигнала от таймера в прикладных целях лучше перехватывать не сам вектор 08h, а 1Ch...
Очччень хотелось бы такую весчь (эх... если бы в VMware добавили такое дело...)
1. Зачем ты указатель стека нулем илициализируешь?
Лучче бы так сделал
Код:
xor ax, ax
mov ss, ax
mov sp, 0x7C00...
mov ss, ax
mov sp, 0x7C00...
[QUOTE=ko$mo]
Код:
mov ax, [es:di]
mov [es:old_prt_off], ax
mov [es:old_prt_off], ax
Куды ты пишешь??? в cs:old_prt_off нада! может в этом то и проблема...
Эмулятор+отладчик - Bochs. В нем есть и gdb.
Я отлаживался с помощью VMWare+ SotfIce
Хм... за совет насчет отладчика - спасибо! очень помогло, Bochs рулит... однако вопрос с перехватом прерывания так и не решился... допускать, что перехват прерываний на этапе загрузки запрещен - глупо... возможно, проблемы с дальним вызовом на Nasm`е... но тут я не силен... может кто перехватывал прерывания в MBR?
первое же прерывание требующее обработки завесит комп .
что и происходит .
В смысле - куда направил? я вызываю сохраненный вектор прерывания и, надеюсь, справедливо, считаю, что с меня взятки гладки...
ORG 0
;инициализирую регистры
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
cli
; устанавливаю стэк
mov ax, 0x0600
mov ss, ax
xor ax, ax
mov sp, ax
; сохраняю/записываю старый/новый ветора прерываний 08h
mov es, ax
mov di, 08h * 4
mov ax, [es:di]
mov [es:old_prt_off], ax
mov ax, Timer_Int
mov [es:di], ax
add di, 2
mov ax, [es:di]
mov [cs:old_prt_seg], ax
mov ax, cs
mov [es:di], ax
sti
[/QUOTE]
org 0 - это тоже интересно , но что у тебя при считывании вектора в es ?
вместо
call [es:di]
надо было поставить
call es:di
недоглядел
ежели кого интересуют исходники мини бутлоадера - обращайтесь
Для действий с векторами лучше использовать функции ОС например для DOS - int21h gподфункции 25h и 35 h, Не понятно так же, зачем усложнять работу камню, эмулировать 8253/8254. Комп возможно не виснет, а начинает програмно считать время.
sergs, а он еще не успел образ DOS, например, в MBR загнать :D
Цитата: ko$mo
или есть эмуляторы-отладчики?
Есть-Bochs или DOSBox(только туда надо самому всё прикручивать,но исходники доступны)