Как рассчитать количество секторов,номер головки, номер дорожки и номер сектора для загрузчика? У меня есть загрузка кода : Код (ASM): mov ax,0x1100 mov es,ax mov bx,0x00 mov ah,0x02 mov dl,1 mov dh,0 mov ch,0 mov cl,2 mov al,15 int 0x13 Где DL - это номер диска DH - номер головки CL - номер сектора АL - количество секторов И есть загрузка данных mov ax,0x1300 mov es,ax mov bx,0x00 mov ah,0x02 mov dl,1 mov dh,0 mov cl,6 mov ch,0 mov al,1 int 0x13 Числа , которые сейчас стоят - не совсем верные , я пользуюсь dumpbin /headers kernel.bin и вот, что она выводит: Код (Text): C:\Users\Elvin\source\repos\KR>dumpbin /headers kernelKR.bin Microsoft (R) COFF/PE Dumper Version 14.12.25835.0 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file kernelKR.bin PE signature found File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (x86) 2 number of sections 5C7ADA4B time date stamp Sat Mar 2 22:32:27 2019 0 file pointer to symbol table 0 number of symbols E0 size of optional header 103 characteristics Relocations stripped Executable 32 bit word machine OPTIONAL HEADER VALUES 10B magic # (PE32) 14.12 linker version 1E00 size of code C00 size of initialized data 0 size of uninitialized data 1000 entry point (00011000) 1000 base of code 3000 base of data 10000 image base (00010000 to 00013FFF) 1000 section alignment 200 file alignment 6.00 operating system version 0.00 image version 6.00 subsystem version 0 Win32 version 4000 size of image 200 size of headers 6A9F checksum 1 subsystem (Native) 500 DLL characteristics NX compatible No structured exception handler 100000 size of stack reserve 1000 size of stack commit 100000 size of heap reserve 1000 size of heap commit 0 loader flags 10 number of directories 0 [ 0] RVA [size] of Export Directory 0 [ 0] RVA [size] of Import Directory 0 [ 0] RVA [size] of Resource Directory 0 [ 0] RVA [size] of Exception Directory 0 [ 0] RVA [size] of Certificates Directory 0 [ 0] RVA [size] of Base Relocation Directory 3170 [ 1C] RVA [size] of Debug Directory 0 [ 0] RVA [size] of Architecture Directory 0 [ 0] RVA [size] of Global Pointer Directory 0 [ 0] RVA [size] of Thread Storage Directory 0 [ 0] RVA [size] of Load Configuration Directory 0 [ 0] RVA [size] of Bound Import Directory 0 [ 0] RVA [size] of Import Address Table Directory 0 [ 0] RVA [size] of Delay Import Directory 0 [ 0] RVA [size] of COM Descriptor Directory 0 [ 0] RVA [size] of Reserved Directory SECTION HEADER #1 .text name 1D01 virtual size 1000 virtual address (00011000 to 00012D00) 1E00 size of raw data 200 file pointer to raw data (00000200 to 00001FFF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 60000020 flags Code Execute Read SECTION HEADER #2 .data name A60 virtual size 3000 virtual address (00013000 to 00013A5F) C00 size of raw data 2000 file pointer to raw data (00002000 to 00002BFF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers C0000040 flags Initialized Data Read Write Debug Directories Time Type Size RVA Pointer -------- ------- -------- -------- -------- 5C7ADA4B coffgrp 60 00003A00 2A00 Summary 1000 .data 2000 .text И вот такая таблица , она приведена на картинке Помогите разобраться
Код (ASM): ; входные параметры ; EAX - LBA адрес ; DS:SI адрес загрузки Read_LBA: PUSHA PUSH DX PUSH EAX MOV ah,08 ; Читаем параметры диска int 13h ; AH - статус 00h нет ошибки ; CX - с 0 по 6 бит число секторов (от 1 до 63) ; CX - с 8 по 15 бит и с 7 по 8 биты число цилиндров (от 0 до 3FFFh) ; +---------+--------+ ; |15 8|7 0| ; +---------+--------+ ; |876543210|09 | ; +---------+--------+ ; |876543210| 543210| ; +---------+--------+ ; DL - число подключенных дисков ; DH - макс число головок (от 0 до 255) MOV AL,CL AND AL,111111b ; число секторов на дорожку (биты 5-0) CBW ; Конвертируем Байт в Слово. MOV BL,DH ; MOV BH,AH INC BX ; число головок на цилиндр XCHG AX,BX MUL BX ; AX:DX := (число головок x Сектора) MOV CX,AX ; CX := AX (DX- всегда ноль) LBA_2_CHS: ; Пересчитываем адрес из LBA в CHS ; LBA = (((Цилиндр * головок_на_цилиндр)+головка)*секторов_на_дорожку)+сектор - 1 ; Цилиндр=LBA div (головок_на_цилиндр*секторов_на_дорожку) ; временная_переменная=LBA MOD (головок_на_цилиндр*секторов_на_дорожку) ; головка=временная_переменная DIV секторов_на_дорожку ; сектор=временная_переменная DIV секторов_на_дорожку +1 POP EAX mov bp,sp mov dx,Word PTR [bp-2] DIV CX PUSH AX MOV AX,DX XOR DX,DX DIV BX INC DX MOV CX,DX MOV DH,AL POP AX MOV CH,AL SHL AH, 6 OR CL,AH READ_CHS: MOV AL,1 MOV AH,2 mov bp,sp MOV DL,byte ptr [bp] MOV BX,DI int 13h jc Error1 POP DX POPA RETF Error1: mov CX,(offset the_end) -(offset SystemEror1) MOV bp, offset SystemEror1 CALL Far ptr WriteStr int 18h ; Ждём нажатия клавиши