Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не могу подменить прерывание в MBR - виснет комп

17K
19 августа 2006 года
ko$mo
10 / / 18.08.2006
пишу на Nasm начальный загрузчик

Код:
[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


так вот, прога запускается только один цикл, выводит 80 и виснет.
подскажите, что не так?

не подскажете - как отладить? ставить VMWare? или есть эмуляторы-отладчики? переписывать код не хочется, а в MBR все залочено на 07c0h
349
19 августа 2006 года
Phantom-84
656 / / 27.10.2005
Вместо того чтобы отлаживать, лучше внимательно просмотри свой код... наверняка так какой-то баг с сегментными/внутрисегментными адресами. И еще... для детекта сигнала от таймера в прикладных целях лучше перехватывать не сам вектор 08h, а 1Ch...
334
19 августа 2006 года
HexEdit
809 / / 27.07.2006
[QUOTE=ko$mo]или есть эмуляторы-отладчики?[/QUOTE]
Очччень хотелось бы такую весчь (эх... если бы в VMware добавили такое дело...)
1. Зачем ты указатель стека нулем илициализируешь?
Лучче бы так сделал
 
Код:
xor ax, ax
mov ss, ax
mov sp, 0x7C00...

[QUOTE=ko$mo]
 
Код:
mov ax, [es:di]
  mov [es:old_prt_off], ax
[/QUOTE]
Куды ты пишешь??? в cs:old_prt_off нада! может в этом то и проблема...
16K
19 августа 2006 года
aragaer
25 / / 28.07.2006
Эмулятор+отладчик - Bochs. В нем есть и gdb.
3
19 августа 2006 года
Green
4.8K / / 20.01.2000
Я отлаживался с помощью VMWare+ SotfIce
Вот мой пост почти трехлетней давности:
http://rsdn.ru/Forum/Message.aspx?mid=472982&only=1
17K
22 августа 2006 года
ko$mo
10 / / 18.08.2006
Хм... за совет насчет отладчика - спасибо! очень помогло, Bochs рулит... однако вопрос с перехватом прерывания так и не решился... допускать, что перехват прерываний на этапе загрузки запрещен - глупо... возможно, проблемы с дальним вызовом на Nasm`е... но тут я не силен... может кто перехватывал прерывания в MBR?
252
22 августа 2006 года
koderAlex
1.4K / / 07.09.2005
ну перехватил ты прерывание , а куда ты их направил ?
первое же прерывание требующее обработки завесит комп .
что и происходит .
17K
22 августа 2006 года
ko$mo
10 / / 18.08.2006
В смысле - куда направил? я вызываю сохраненный вектор прерывания и, надеюсь, справедливо, считаю, что с меня взятки гладки...
252
22 августа 2006 года
koderAlex
1.4K / / 07.09.2005
BITS 16]
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 ?
17K
04 сентября 2006 года
ko$mo
10 / / 18.08.2006
Спасибо всем, да ошибки были элементарные

вместо
call [es:di]
надо было поставить
call es:di

недоглядел

ежели кого интересуют исходники мини бутлоадера - обращайтесь
21K
22 сентября 2006 года
sergs
2 / / 14.09.2006
Для действий с векторами лучше использовать функции ОС например для DOS - int21h gподфункции 25h и 35 h, Не понятно так же, зачем усложнять работу камню, эмулировать 8253/8254. Комп возможно не виснет, а начинает програмно считать время.
349
23 сентября 2006 года
Phantom-84
656 / / 27.10.2005
sergs, а он еще не успел образ DOS, например, в MBR загнать :D
7
21 ноября 2006 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: ko$mo
или есть эмуляторы-отладчики?


Есть-Bochs или DOSBox(только туда надо самому всё прикручивать,но исходники доступны)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог