Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Int 41h, адрес HDTP 
:(
    Опции темы
Nos
  Дата 25.3.2004, 18:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ув. коллеги! Может быть кто-то работал с Int 41h? По идее BIOS определяет адрес таблицы параметров, соответсвующий вектору этого прерывания... вот бы узнать этот адрес... может кто знает?
  Вверх
Chingachguk
Дата 26.3.2004, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Читал параметры хард-диска:

Цитата

.286
SectorSize equ 512
HardDiskParams struc
Heads          db ?
Cylinders      dw ?
Sectors_per_track db ?
HardDiskParams ends
LogDiskStruc struc
DiskNum        db ? ; Номер винта
FirstHead      db ? ; Номер головки начала раздела
FirstCylSec    dw ? ; Номер сектора и номер цилиндра загрузочного модуля(BOOT)
OSystem        db ? ; May be 0eh/0ch/0bh - to extended read by 42h - Идентификатор OS
LastHead      db ? ; Номер головки конца раздела
LastCylSec    dw ? ; Номер сектора и цилиндра последнего сектора раздела
AbsFirstSecNum dd ? ; Младшее и старшее двухбайтовое слово относительного номера начального сектора
TotPartSize    dd ? ; Младшее и старшее двухбайтовое слово размера раздела в секторах
LogDiskStruc ends
PartitionTable struc
LogDiskStruc1 db size LogDiskStruc dup(?)
LogDiskStruc2 db size LogDiskStruc dup(?)
LogDiskStruc3 db size LogDiskStruc dup(?)
LogDiskStruc4 db size LogDiskStruc dup(?)
PartitionTable ends
MBR struc
Code db 446 dup(?)
MBRPartitionTable db size PartitionTable dup(?)
Marker dw 0AA55h
MBR ends
SectorToRead struc
Head          db ?
Road          dw ?
SectorNumber  db ?
SectorToRead ends
text segment byte public
assume cs:text,ds:text
org  100h
begin:
  push offset MyHardDiskParams
  call GetHard80h_Info_by_INT41
  push offset MyLogDiskStruc
  call GetHard80h_Info_by_MBR
  mov  ax,MyLogDiskStruc.LastCylSec
  push ax
  and  al,00111111b
  mov  byte ptr CurrSect,al
  pop  ax
  and  al,11000000b
  xchg al,ah
  shr  ah,6
  mov  dh,MyLogDiskStruc.LastHead
  push dx
  and  dh,11000000b
  or  ah,dh
  mov  word ptr CurrCyl,ax
  pop  dx
  and  dh,00111111b
  mov  byte ptr CurrHead,dh
@@ReadSectors:
  inc  byte ptr CurrSect
  mov  al,CurrSect
  cmp  al,byte ptr MyHardDiskParams.Sectors_per_track
  jbe  @@UseTheseCylHead
  mov  byte ptr CurrSect,1
  inc  byte ptr CurrHead
  mov  al,byte ptr CurrHead
  cmp  al,byte ptr MyHardDiskParams.Heads
  jb  @@UseTheseCylHead
  mov  byte ptr CurrHead,0
  inc  word ptr CurrCyl
  mov  ax,word ptr CurrCyl
  cmp  ax,word ptr MyHardDiskParams.Cylinders
  jae  @@Exit
@@UseTheseCylHead:
  mov  cl,byte ptr CurrSect
  mov  dh,byte ptr CurrHead
  mov  ax,word ptr CurrCyl
  mov  ch,al
  mov  al,ah
  shl  ah,6
  or  cl,ah
  shl  al,4
  and  al,11000000b
  or  dh,al
  mov  ax,0201h
  mov  dl,80h
  mov  bx,offset Sector
  push ds
  pop  es
  push offset MySectorToRead
  call What_Sector
  int  13h
  jnc  @@SectorValid
  mov  al,ah
  mov  ah,0
  mov  di,offset SectorNotValid+23
  call HexChar
  mov  dx,offset SectorNotValid
  call @@Message
  jmp  @@Exit
@@SectorValid:
  mov  dx,offset SectorDone
  call @@Message
  mov  ah,1
  int  16h
  jnz  @@Exit
  call Get_CRC
  cmp  word ptr Sector,6DB6h
  jz  @@EmptySector
  test bx,bx
  jz  @@EmptySector
  push offset MySectorToRead
  call Sector_To_Disk
@@EmptySector:
  jmp  @@ReadSectors
@@Exit:
  mov  ax,4C00h
  int  21H  ; BACK TO DOS
NoFreeArea db 'Free Cylinder after OS not exist !',13,10,'$'
Get_CRC proc near
  mov  si,offset Sector
  cld
  mov  cx,SectorSize
  xor  bx,bx
@@CRC:
  lodsb
  add  bl,al
  adc  bh,0
  loop @@CRC
  retn
Get_CRC endp
Sector_To_Disk proc near
  push bp
  mov  bp,sp
  mov  si,[bp+4]
  mov  di,offset NumBuff
  xor  ax,ax
  mov  al,[si].Head
  call DecChar
  mov  ax,[di+3]
  mov  word ptr fname+4,ax
  mov  ax,[si].Road
  call DecChar
  mov  ax,[di+1]
  mov  word ptr fname+0,ax
  mov  ax,[di+3]
  mov  word ptr fname+2,ax
  xor  ax,ax
  mov  al,[si].SectorNumber
  call DecChar
  mov  ax,[di+3]
  mov  word ptr fname+6,ax
  mov  ah,3Ch
  mov  dx,offset fname
  xor  cx,cx
  int  21h
  jc  @@DiskErr
  mov  bx,ax
  mov  ah,40h
  mov  cx,512
  mov  dx,offset Sector
  int  21h
  mov  ah,3eh
  int  21h
@@DiskErr:
  pop  bp
  retn 2
fname db 'RRRRHHSS.sec',0
NumBuff db '?????'
Sector_To_Disk endp
What_Sector proc near
  push bp
  mov  bp,sp
  pusha
  mov  si,[bp+4]
  xor  ax,ax
  mov  al,dh
  and  al,00111111b
  mov  [si].Head,al
  mov  di,offset WhatSect+18
  call DecChar
  mov  al,cl
  and  ax,00111111b
  mov  [si].SectorNumber,al
  mov  di,offset WhatSect+45
  call DecChar
  mov  ax,cx
  xchg al,ah
  shr  ah,6
  shr  dh,4
  and  dh,00001100b
  or  ah,dh
  mov  [si].Road,ax
  mov  di,offset WhatSect+29
  call DecChar
  mov  dx,offset WhatSect
  call @@Message
  popa
  pop  bp
  retn 2
WhatSect db 'Read sector: Head=????? Road=????? SecNumber=?????',13,10,'$'
What_Sector endp
GetHard80h_Info_by_MBR proc near
  push bp
  mov  bp,sp
  mov  ax,0201h
  mov  bx,offset Sector
  push ds
  pop  es
  mov  cx,0001h
  mov  dx,0080h
  int  13h
  jnc  @@GetParams
  pop  ax
  pop  ax
  mov  dx,offset MbrErr
  call @@Message
  jmp  @@Exit
@@GetParams:
  add  bx,MBRPartitionTable
  mov  cx,4
@@GetActivePart:
  cmp  byte ptr [bx].DiskNum,80h
  jz  @@ActiveFound
  add  bx,size LogDiskStruc
  loop @@GetActivePart
  pop  ax
  pop  ax
  mov  dx,offset MbrNotActive
  call @@Message
  jmp  @@Exit
@@ActiveFound:
  mov  si,bx
  mov  di,[bp+4]
  cld
  mov  cx,size LogDiskStruc
  rep  movsb
  xor  ax,ax
  mov  al,[bx].FirstHead
  mov  di,offset MbrInfo2+11
  call DecChar
  mov  ax,[bx].FirstCylSec
  mov  di,offset MbrInfo2+30
  call HexChar
  xor  ax,ax
  mov  al,[bx].OSystem
  mov  di,offset MbrInfo2+44
  call DecChar
  xor  ax,ax
  mov  al,[bx].LastHead
  mov  di,offset MbrInfo3+10
  call DecChar
  mov  ax,[bx].LastCylSec
  mov  di,offset MbrInfo3+28
  call HexChar
  mov  dx,offset MbrInfo1
  call @@Message
  pop  bp
  retn 2
MbrErr db 'MBR not avaible !',13,10,'$'
MbrNotActive db 'Active Part of MBR not exist !',13,10,'$'
MbrInfo1 db 'Active Partition Info from MBR:',13,10
MbrInfo2 db 'FirstHead: ????? FirstCylSec: ???? OSystem: ?????',13,10
MbrInfo3 db 'LastHead: ????? LastCylSec: ????',13,10
        db '$'
GetHard80h_Info_by_MBR endp
GetHard80h_Info_by_INT41 proc near
  push bp
  mov  bp,sp
  mov  si,[bp+4]
; INT 41 - SYSTEM DATA - HARD DISK 0 PARAMETER TABLE
; Notes: the default parameter table array is located at F000h:E401h in 100%
;  compatible BIOSes; the pointer may be overridden by the hard disk
;  controller's BIOS to support drive formats unknown to the ROM BIOS
; not used by some PS/2 models
; SeeAlso: #2451,INT 13/AH=09h,INT 1E,INT 46"HARD DISK 1",INT 60"Adaptec"
;
; Format of fixed disk parameters:
; Offset Size Description (Table 2451)
; 00h WORD number of cylinders
; 02h BYTE number of heads
; 03h WORD starting reduced write current cylinder (XT only, 0 for others)
; 05h WORD starting write precompensation cylinder number
; 07h BYTE maximum ECC burst length (XT only)
; 08h BYTE control byte (see #2452,#2453)
; 09h BYTE standard timeout (XT only, 0 for others)
; 0Ah BYTE formatting timeout (XT and WD1002 only, 0 for others)
; 0Bh BYTE timeout for checking drive (XT and WD1002 only, 0 for others)
; 0Ch WORD cylinder number of landing zone (AT and later only)
; 0Eh BYTE number of sectors per track (AT and later only)
; 0Fh BYTE reserved
HARD_DISK0_PARAMETER_TABLE struc
number_of_cylinders dw ?
number_of_heads db ?
starting_reduced_write_current_cylinder dw ?
starting_write_precompensation_cylinder_number dw ?
maximum_ECC_burst_length db ?
control_byte db ?
standard_timeout db ?
formatting_timeout db ?
timeout_for_checking_drive db ?
cylinder_number_of_landing_zone dw ?
number_of_sectors_per_track db ?
reserved db ?
HARD_DISK0_PARAMETER_TABLE ends
  mov  ax,3541h
  int  21h ; es:bx -> HARD DISK 0 PARAMETER TABLE
  mov  ax,es:[bx].number_of_cylinders
  mov  [si].Cylinders,ax
  mov  di,offset str1+21
  call DecChar
  xor  ax,ax
  mov  al,es:[bx].number_of_heads
  mov  [si].Heads,al
  mov  di,offset str2+17
  call DecChar
  mov  ax,es:[bx].cylinder_number_of_landing_zone
  mov  di,offset str3+33
  call DecChar
  xor  ax,ax
  mov  al,es:[bx].number_of_sectors_per_track
  mov  [si].Sectors_per_track,al
  mov  di,offset str4+29
  call DecChar
  mov  dx,offset str1
  call @@Message
  pop  bp
  retn 2
str1 db 'number of cylinders: ?????',13,10
str2 db 'number of heads: ?????',13,10
str3 db 'cylinder number of landing zone: ?????',13,10
str4 db 'number of sectors per track: ?????',13,10
    db '$'
GetHard80h_Info_by_INT41 endp
HexChar proc near
  pusha
  mov  cx,4
  mov  bx,offset TabHex
@GetHex:
  rol  ax,4
  push ax
  and  al,0fh
  xlat
  mov  [di],al
  inc  di
  pop  ax
  loop @GetHex
  popa
  retn
TabHex  db '0123456789abcdef'
HexChar endp
DecChar proc near
  pusha
  mov  cx,5
  mov  bx,10000
@GetDec:
  xor  dx,dx
  div  bx
  add  al,'0'
  mov  [di],al
  inc  di
  push dx
  xor  dx,dx
  mov  ax,bx
  mov  bx,10
  div  bx
  mov  bx,ax
  pop  ax
  loop @GetDec
  popa
  retn
DecChar endp
@@Message:
  mov  ah,09h
  int  21h
  retn
ErrMess  db 'Error !','$'
SectorNotValid db 'SectorNotValid ! Error ????',13,10,'$'
SectorDone db 'Status: complete',13,10,'$'
CurrCyl dw ?
CurrHead db ?
CurrSect db ?
MyHardDiskParams HardDiskParams <>
MySectorToRead SectorToRead <>
MyLogDiskStruc LogDiskStruc <>
Sector db SectorSize dup(?)
Text Ends
end begin



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Guest
Дата 26.3.2004, 15:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мда уж...нет, большое спасибо, конечно же, но первое впечатление - "них... себе!"
  Вверх
p0s0l
Дата 26.3.2004, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Если хочешь узнать вектор прерывания, то 2 способа предложу:
1.
Код
mov ah, 35h // код функции DOS
mov al, 41h // № прерывания
int 21h
// в ES:BX - адрес


2.То же самое, но вручную:
Код
push ds

push 0
pop ds
mov bx,ds:[41h * 4] // читаем offset
mov es,ds:[41h * 4 + 2] // читаем segment

pop ds



--------------------
С уважением, г-н Посол.
PM   Вверх
Nos
Дата 29.3.2004, 14:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо!
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.