1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Загрузка ядра с дискеты

Тема в разделе "WASM.OS.DEVEL", создана пользователем beginnerga, 3 дек 2019 в 22:03.

Метки:
  1. beginnerga

    beginnerga New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2019
    Сообщения:
    7
    Код (ASM):
    1.           org 0
    2.           use16
    3.           ;------------------------;
    4.           mov  ah,00h              ;
    5.           mov  al,03h              ;
    6.           int  10h                 ;
    7.           ;------------------------;
    8.  
    9.           ;------------------------;
    10.           mov ah,05h               ;
    11.           mov al,0                 ;
    12.           int 10h                  ;
    13.           ;------------------------;
    14.  
    15.           ;------------------------;
    16.           mov bx,0                 ;
    17.           mov dl,0                 ;
    18.           mov dh,25                ;
    19.           mov ah,02h               ;
    20.           int 10h                  ;
    21.           ;------------------------;
    22.  
    23.           cli
    24.           cld
    25.  
    26.           xor ax, ax
    27.           mov ds, ax
    28.           mov es, ax
    29.           mov ss, ax
    30.           mov sp, 0x8000
    31.           sti
    32.  
    33.           mov dh,0            ;
    34.           mov ch,0            ;
    35.           mov cl,1            ;
    36.           ;-------------------;
    37.           mov ax, 0000h       ;
    38.           mov es, ax          ;
    39.           mov bx, .ENDLOADER  ;
    40.           ;-------------------;
    41.           mov al, 1           ;
    42.           mov ah, 2h
    43.           int 13h
    44.           jmp .ENDLOADER
    45.  
    46. times 0x200 - 2 - ($ - $$) db 0x90
    47. db  055h, 0AAh
    48.  
    49. .ENDLOADER:
    50.  
    51. ;==============================================================================}
    52. mov edi,0B8000h
    53. mov byte[es:edi],' '
    54. inc edi
    55. mov byte[es:edi],01010101b
    56. jmp $  
    Код, размещённый в загрузчике должен загружать в RAM ядро, но почему-то этого не происходит
    Код (ASM):
    1.           mov dh,0            ;
    2.           mov ch,0            ;
    3.           mov cl,2            ;
    4.           ;-------------------;
    5.           mov ax, 0000h       ;
    6.           mov es, ax          ;
    7.           mov bx, 0x8000      ;
    8.           ;-------------------;
    9.           mov al, 30          ;
    10.           mov ah, 2h
    11.           int 13h
    12.           jmp far 0:8000h
    По адресу 0:8000h расположено ядро, если его конечно можно так назвать:)
    Код (ASM):
    1. org 0x8000
    2.  
    3.  
    4. Start:
    5.           mov  ecx,2000            ;
    6.           mov  al,' '              ;
    7.           mov  ah,01010101b        ;
    8.           ;------------------------;
    9.           mov  EDI,0B8000h         ;
    10.           ;------------------------;
    11. .CICLE:    test ecx,ecx             ;
    12.           jz  .ENDCICLE               ;
    13.           MOV [ES:EDI],al          ;
    14.           inc  EDI                 ;
    15.           MOV [ES:EDI],ah          ;
    16.           inc  EDI                 ;
    17.           dec  ecx                 ;
    18.           jmp .CICLE                ;
    19. .ENDCICLE:   ;------------------------;
    20. jmp $    
    Ядро должно заполнить экран розовым, но этого не происходит. И проблема не в этом куске кода (я тестировал - он работал в загрузчике). Просьба тем кто знает сказать, в чём дело
    Весь код:
    Код (ASM):
    1.           org 0
    2.           use16
    3.           ;------------------------;
    4.           mov  ah,00h              ;
    5.           mov  al,03h              ;
    6.           int  10h                 ;
    7.           ;------------------------;
    8.  
    9.           ;------------------------;
    10.           mov ah,05h               ;
    11.           mov al,0                 ;
    12.           int 10h                  ;
    13.           ;------------------------;
    14.  
    15.           ;------------------------;
    16.           mov bx,0                 ;
    17.           mov dl,0                 ;
    18.           mov dh,25                ;
    19.           mov ah,02h               ;
    20.           int 10h                  ;
    21.           ;------------------------;
    22.  
    23.           cli
    24.           cld
    25.  
    26.           xor ax, ax
    27.           mov ds, ax
    28.           mov es, ax
    29.           mov ss, ax
    30.           mov sp, 0x8000
    31.           sti
    32.  
    33.           mov dh,0            ;
    34.           mov ch,0            ;
    35.           mov cl,2            ;
    36.           ;-------------------;
    37.           mov ax, 0000h       ;
    38.           mov es, ax          ;
    39.           mov bx, 0x8000      ;
    40.           ;-------------------;
    41.           mov al, 30          ;
    42.           mov ah, 2h
    43.           int 13h
    44.           jmp far 0:8000h
    45.  
    46. times 0x200 - 2 - ($ - $$) db 0x90
    47. db  055h, 0AAh
    48.  
    49.  
    50.  
    51. ;==============================================================================}
    52. org 0x8000
    53.  
    54.  
    55. Start:
    56.           mov  ecx,2000            ;
    57.           mov  al,' '              ;
    58.           mov  ah,01010101b        ;
    59.           ;------------------------;
    60.           mov  EDI,0B8000h         ;
    61.           ;------------------------;
    62. .CICLE:    test ecx,ecx             ;
    63.           jz  .ENDCICLE               ;
    64.           MOV [ES:EDI],al          ;
    65.           inc  EDI                 ;
    66.           MOV [ES:EDI],ah          ;
    67.           inc  EDI                 ;
    68.           dec  ecx                 ;
    69.           jmp .CICLE                ;
    70. .ENDCICLE:   ;------------------------;
    71. jmp $
    (Обновлено)Работающий код:
    Код (ASM):
    1.           org 0
    2.           use16
    3.           ;------------------------;
    4.           mov  ah,00h              ;
    5.           mov  al,03h              ;
    6.           int  10h                 ;
    7.           ;------------------------;
    8.  
    9.           ;------------------------;
    10.           mov ah,05h               ;
    11.           mov al,0                 ;
    12.           int 10h                  ;
    13.           ;------------------------;
    14.  
    15.           ;------------------------;
    16.           mov bx,0                 ;
    17.           mov dl,0                 ;
    18.           mov dh,25                ;
    19.           mov ah,02h               ;
    20.           int 10h                  ;
    21.           ;------------------------;
    22.  
    23.           cli
    24.           cld
    25.  
    26.           xor ax, ax
    27.           mov ds, ax
    28.           mov es, ax
    29.           mov ss, ax
    30.           mov sp, 0x8000
    31.           sti
    32.  
    33.           mov dh,0            ;
    34.           mov ch,0            ;
    35.           mov cl,1            ;
    36.           ;-------------------;
    37.           mov ax, 0000h       ;
    38.           mov es, ax          ;
    39.           mov bx, .ENDLOADER  ;
    40.           ;-------------------;
    41.           mov al, 1           ;
    42.           mov ah, 2h
    43.           int 13h
    44.           jmp .ENDLOADER
    45.  
    46. times 0x200 - 2 - ($ - $$) db 0x90
    47. db  055h, 0AAh
    48.  
    49. .ENDLOADER:
    50.  
    51. ;==============================================================================}
    52. mov edi,0B8000h
    53. mov byte[es:edi],' '
    54. inc edi
    55. mov byte[es:edi],01010101b
    56. jmp $  
    P.S. Программа не моя, просто пытаюсь понять, как это работает
    P.S.S. Запускаю из-под VirtualBox
     
    Последнее редактирование: 4 дек 2019 в 20:21
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.189
    Адрес:
    Russia
    Во первых, для изучения возьмите QEMU + связку IDA (Remote GDB debugger) и вы сможете по шагам отлаживать ваши бут программы.

    Во вторых, нельзя писать код так, как написали вы. Нельзя ставить Org XXXX после того, как вы уже поставили Org 0h.
    и вообще по хорошему нужно чтоб загрузчик умел откуда-то загружать файлы. Например с дискетки, читая FAT. Тогда у вас не будет проблем. Отдельно будет бутлоадер, отдельно будет программа.
     
    Mikl___ нравится это.
  3. beginnerga

    beginnerga New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2019
    Сообщения:
    7
    Вы говорите, что после org 0 нельзя прописать org xxxx. Тогда как поменять смещение, допустим, в середине программы?
     
    Последнее редактирование: 4 дек 2019 в 18:26
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.189
    Адрес:
    Russia
    beginnerga, вы путаете
    org директива говорит компилятору сгенерировать программу, которую загрузчик загрузит по смещению внутри сегмента заданому в этой директиве
    вы должны написать программу, которая будет перемещать часть кода (которую нужно поместить в 8000h) из одного адреса, в другой. Обычное копирование - память-> память. После копирования передаете управление командой Jmp . Код должен быть базонезависимый. Иначе придется вам все смещения перерасчитывать .

    Но лучше просто сделать два исходника, как я предложил выше
    Один запишете в загрузчик, второй запишете на дискету в фс как файл, который прочитает загрузчик и передаст туда управление
     
    Последнее редактирование: 4 дек 2019 в 19:37
  5. beginnerga

    beginnerga New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2019
    Сообщения:
    7
    TermoSINteZ, Не могли бы вы привести пример программы, которую вы описали выше?
    Если нет, то посоветуйте, где можно найти исходники подобных программ
    --- Сообщение объединено, 4 дек 2019 в 20:18 ---
    TermoSINteZ, Спасибо за подсказку с org!
    Проблема была решена путём смещения "ядра" с адреса 8000h на адрес 513h (сразу после загрузочного сектора)
    --- Сообщение объединено, 4 дек 2019 в 20:27 ---
    TermoSINteZ,
    Ещё вы советовали "научить" программу читать с дискеты с ФС FAT, но, думаю, что для мини-"системы", которая весит 532 байта (хотя можно было с лёгкостью уместить её в загрузчике), такой метод загрузки был бы неэффективен
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.189
    Адрес:
    Russia
    Пример бутлоадера , загружающего exe с названием (KERNEL.EXE)
    смотрите аттач.
    Бутлоадер после компиляции - помещаете на образ дискетки. (0 сектор будет содержать бутлоадер) . Сама дискетка примет формат FAT12. В корень кидаете Kernel.exe файл.
    Код бутлоадера ищет файл по ФС (по имени) и загружает его

    И того бутлоадер весит 512 байт.
    Вам много чтоли?
    Помоему очень даже эффективно
     

    Вложения:

    • bootloader.ASM
      Размер файла:
      9,7 КБ
      Просмотров:
      7
    • KERNEL_small.ASM
      Размер файла:
      872 байт
      Просмотров:
      7
  7. beginnerga

    beginnerga New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2019
    Сообщения:
    7
    TermoSINteZ, Ваша программа должна выводить RE, либо я где-то накосячил?
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.189
    Адрес:
    Russia
    beginnerga, это ошибка бутлоадера
    MsgErrRead db "RE"

    Можете почитать исходник, чтоб понять почему не удалось прочитать файл (ошибку вернула функция биос чтения сектора)