Как рассчитать количество секторов,номер головки, номер дорожки и номер сектора?

Тема в разделе "WASM.BEGINNERS", создана пользователем 2Hard2Forget, 2 мар 2019.

  1. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    Как рассчитать количество секторов,номер головки, номер дорожки и номер сектора для загрузчика?

    У меня есть загрузка кода :
    Код (ASM):
    1. mov ax,0x1100
    2. mov es,ax
    3. mov bx,0x00
    4. mov ah,0x02
    5. mov dl,1
    6. mov dh,0  
    7. mov ch,0
    8. mov cl,2  
    9. mov al,15
    10. int 0x13
    11. Где  DL - это номер диска
    12. DH - номер головки
    13. CL - номер сектора
    14. АL - количество секторов
    15.  
    16. И есть загрузка данных
    17.  
    18. mov ax,0x1300
    19. mov es,ax
    20. mov bx,0x00
    21. mov ah,0x02
    22. mov dl,1
    23. mov dh,0  
    24. mov cl,6
    25. mov ch,0
    26. mov al,1
    27. int 0x13
    Числа , которые сейчас стоят - не совсем верные , я пользуюсь dumpbin /headers kernel.bin и вот, что она выводит:
    Код (Text):
    1. C:\Users\Elvin\source\repos\KR>dumpbin /headers kernelKR.bin
    2. Microsoft (R) COFF/PE Dumper Version 14.12.25835.0
    3. Copyright (C) Microsoft Corporation.  All rights reserved.
    4.  
    5.  
    6. Dump of file kernelKR.bin
    7.  
    8. PE signature found
    9.  
    10. File Type: EXECUTABLE IMAGE
    11.  
    12. FILE HEADER VALUES
    13.              14C machine (x86)
    14.                2 number of sections
    15.         5C7ADA4B time date stamp Sat Mar  2 22:32:27 2019
    16.                0 file pointer to symbol table
    17.                0 number of symbols
    18.               E0 size of optional header
    19.              103 characteristics
    20.                    Relocations stripped
    21.                    Executable
    22.                    32 bit word machine
    23.  
    24. OPTIONAL HEADER VALUES
    25.              10B magic # (PE32)
    26.            14.12 linker version
    27.             1E00 size of code
    28.              C00 size of initialized data
    29.                0 size of uninitialized data
    30.             1000 entry point (00011000)
    31.             1000 base of code
    32.             3000 base of data
    33.            10000 image base (00010000 to 00013FFF)
    34.             1000 section alignment
    35.              200 file alignment
    36.             6.00 operating system version
    37.             0.00 image version
    38.             6.00 subsystem version
    39.                0 Win32 version
    40.             4000 size of image
    41.              200 size of headers
    42.             6A9F checksum
    43.                1 subsystem (Native)
    44.              500 DLL characteristics
    45.                    NX compatible
    46.                    No structured exception handler
    47.           100000 size of stack reserve
    48.             1000 size of stack commit
    49.           100000 size of heap reserve
    50.             1000 size of heap commit
    51.                0 loader flags
    52.               10 number of directories
    53.                0 [       0] RVA [size] of Export Directory
    54.                0 [       0] RVA [size] of Import Directory
    55.                0 [       0] RVA [size] of Resource Directory
    56.                0 [       0] RVA [size] of Exception Directory
    57.                0 [       0] RVA [size] of Certificates Directory
    58.                0 [       0] RVA [size] of Base Relocation Directory
    59.             3170 [      1C] RVA [size] of Debug Directory
    60.                0 [       0] RVA [size] of Architecture Directory
    61.                0 [       0] RVA [size] of Global Pointer Directory
    62.                0 [       0] RVA [size] of Thread Storage Directory
    63.                0 [       0] RVA [size] of Load Configuration Directory
    64.                0 [       0] RVA [size] of Bound Import Directory
    65.                0 [       0] RVA [size] of Import Address Table Directory
    66.                0 [       0] RVA [size] of Delay Import Directory
    67.                0 [       0] RVA [size] of COM Descriptor Directory
    68.                0 [       0] RVA [size] of Reserved Directory
    69.  
    70.  
    71. SECTION HEADER #1
    72.    .text name
    73.     1D01 virtual size
    74.     1000 virtual address (00011000 to 00012D00)
    75.     1E00 size of raw data
    76.      200 file pointer to raw data (00000200 to 00001FFF)
    77.        0 file pointer to relocation table
    78.        0 file pointer to line numbers
    79.        0 number of relocations
    80.        0 number of line numbers
    81. 60000020 flags
    82.          Code
    83.          Execute Read
    84.  
    85. SECTION HEADER #2
    86.    .data name
    87.      A60 virtual size
    88.     3000 virtual address (00013000 to 00013A5F)
    89.      C00 size of raw data
    90.     2000 file pointer to raw data (00002000 to 00002BFF)
    91.        0 file pointer to relocation table
    92.        0 file pointer to line numbers
    93.        0 number of relocations
    94.        0 number of line numbers
    95. C0000040 flags
    96.          Initialized Data
    97.          Read Write
    98.  
    99.   Debug Directories
    100.  
    101.         Time Type        Size      RVA  Pointer
    102.     -------- ------- -------- -------- --------
    103.     5C7ADA4B coffgrp       60 00003A00     2A00
    104.  
    105.   Summary
    106.  
    107.         1000 .data
    108.         2000 .text
    И вот такая таблица , она приведена на картинке upload_2019-3-2_23-37-18.png
    Помогите разобраться
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Код (ASM):
    1.  
    2. ; входные параметры
    3. ; EAX - LBA адрес
    4. ; DS:SI адрес загрузки
    5. Read_LBA:
    6.     PUSHA
    7.     PUSH DX
    8.     PUSH EAX
    9.     MOV ah,08        ; Читаем параметры диска
    10.     int 13h                    ; AH - статус 00h нет ошибки
    11.                                ; CX - с 0 по 6 бит  число секторов (от 1 до 63)
    12.                                ; CX - с 8 по 15 бит и с 7 по 8 биты число цилиндров (от 0 до 3FFFh)
    13.                                ; +---------+--------+
    14.                                ; |15      8|7      0|
    15.                                ; +---------+--------+
    16.                                ; |876543210|09      |
    17.                                ; +---------+--------+
    18.                                ; |876543210|  543210|
    19.                                ; +---------+--------+
    20.                                ; DL - число подключенных дисков
    21.                                ; DH - макс число головок (от 0 до 255)
    22.     MOV     AL,CL
    23.     AND     AL,111111b         ; число секторов на дорожку (биты 5-0)
    24.     CBW                        ; Конвертируем Байт в Слово.
    25.     MOV     BL,DH              ;
    26.     MOV     BH,AH
    27.     INC     BX                 ; число головок на цилиндр
    28.     XCHG    AX,BX
    29.     MUL     BX                 ; AX:DX := (число головок x Сектора)
    30.     MOV     CX,AX              ; CX := AX   (DX- всегда ноль)
    31. LBA_2_CHS: ; Пересчитываем адрес из LBA в CHS
    32. ; LBA = (((Цилиндр * головок_на_цилиндр)+головка)*секторов_на_дорожку)+сектор - 1
    33. ; Цилиндр=LBA div (головок_на_цилиндр*секторов_на_дорожку)
    34. ; временная_переменная=LBA MOD (головок_на_цилиндр*секторов_на_дорожку)
    35. ; головка=временная_переменная DIV секторов_на_дорожку
    36. ; сектор=временная_переменная DIV секторов_на_дорожку +1
    37.     POP    EAX
    38.     mov    bp,sp
    39.     mov    dx,Word PTR [bp-2]
    40.     DIV    CX
    41.     PUSH   AX
    42.     MOV    AX,DX
    43.     XOR    DX,DX
    44.     DIV    BX
    45.     INC    DX
    46.     MOV    CX,DX
    47.     MOV    DH,AL
    48.     POP    AX
    49.     MOV    CH,AL
    50.     SHL    AH, 6
    51.     OR     CL,AH
    52. READ_CHS:
    53.     MOV    AL,1
    54.     MOV    AH,2
    55.     mov    bp,sp
    56.     MOV    DL,byte ptr [bp]
    57.     MOV    BX,DI
    58.     int    13h
    59.     jc     Error1
    60.     POP    DX
    61.     POPA
    62.     RETF
    63. Error1:
    64.     mov CX,(offset the_end) -(offset SystemEror1)
    65.     MOV bp, offset SystemEror1
    66.     CALL Far ptr WriteStr
    67.     int 18h       ; Ждём нажатия клавиши
    68.  
     
    2Hard2Forget нравится это.