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

Несколько вопросов начинающего

Тема в разделе "WASM.BEGINNERS", создана пользователем s3dworld, 6 окт 2010.

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Igor1024
    Я экспериментировал, поэтому так и писал.

    Z3N
    Вот Вы сразу ругаться, а я ведь указывал размер word и dword. Никакой разницы. Вот если стоит use32, то нормально; но как стоит поставить use16, так такая ошибка.

    Вы не поняли то что я хочу. Я хочу первые 512 байт чтобы были на ассемблере написаны (это загрузчик), а остальные сектора с дискеты - это C-код. Так можно сделать?
     
  2. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    s3dworld
    Да, один сектор чисто на фасм при этом тебе не надо будет никаких каллов и не надо будет линковать. Потом просто загрузишь основной код (тот, что на С) и передашь ему управление, ну или сделаешь ещё что-нибудь до этого.

    Не экономь время на чтении литературы!
     
  3. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Если хочешь бутлодер на FASM'e, то он оф.сайте в примерах.
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Да все поняли. Можно. Проблем нет. Пишешь 512 байт загрузчика - это будет 1 файл. Закидываешь в бут-сектор. Пишешь на чем-угодно что угодно, это будет 2-й файл. Не связанный с первым. Пишешь его куда хочешь. Только есть проблема: то, что ты напишешь на С, скомпилируется (как правило) в исполняемый файл, рассчитанный для какой-то ОС. То есть он будет иметь некий внутренний формат, заголовки-секции, предназначенные для конкретной операционной системы. Чтобы система а)опознала, что это ее исполняемый файл, и б) выполнила некоторые действия при размещении и передаче управления - выделила память, преобразовала некоторые байты, прочитала и заполнила таблицу импортируемых функций адресами, и так далее. Если у тебя нет файловой системы, и нет ОС, то для использования чего-либо написанного на Си, тебе придется сперва написать на ассемблере загрузчик, выполняющий аналогичные действия.

    Смысл самого названия - "загрузчик" - понятен? Его задача - до наличия ОС загрузить, посекторно, используя БИОС, что-то еще (обычно ядро ОС) в память и передать туда управление. Я извиняюсь, вы как хотите, большой массив данных, первые 512 байт загрузчик, остальное на Си? и чтоб это все 1 файл был? Можно, но не так, как вы делаете. Загрузчик пишется на ассемблере. И передает управление НЕ ПО СИМВОЛЬНОЙ МЕТКЕ, ежкин кот. А туда, куда вы загрузите остальное. Работаете с адреса 7с00, грузите что-то еще скажем в 10000, то, что вы грузите - ВАША программа, и вы знаете, что точка входа не на 1000:0000, а со смещения 200h - и после загрузки вы делаете не call kernel - хз что такое этот ваш кернел. Вы делаете jmp 1000:0200, на абсолютный адрес. Не нравится адрес прописывать - закидывайте его в регистр. Но call kernel - это в таком контексте вообще непонятно что. Слава богу что оно не компилируется, а то потом вообще никто ничего не понял бы.
     
  5. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
  6. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
  7. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    потому что в статье nasm. А ты пытался собрать результат fasm'ом, который для этого (сборки бинарника из objей) не предназначен. Потому что в статье тестовый пример предназначен для 32-битного защищенного режима, и ассемблерная и сишная части совпадают по разрядности. Потому что автор статей знает что делает, вплоть до того, как будут расположены данные и код в бинарнике. А читатели, по всей видимости, чего-то недочитали. И вообще, этот момент с extern kernel - call kernel нужен только для того, чтобы получить бинарник без заголовков, стартующий с адреса 0.

    ...и вообще, из вашего длинного топика я понял к концу, что вы пытаетесь к бут-лоадеру прикрутить написанное на Си "ядро". А оказалось, что вы идете по циклу статей, где подразумевается сделать:
    а) бут-лоадер
    б) загрузчик защищенного режима
    и только после
    в) "типа ядро", соединяющееся из 2-х модулей - ассемблерного, получающего управление, и написанной на Си основной части - то есть должен отработать boot, потом PM-loader, потом передать управление в "типа kernel".

    И в этот момент возникает вопрос: а вы шаги а) и б) сделали? вы пробовали вот то, что читаете, сами сделать? Вы обзавелись виртуальной машиной, сделали образ дискеты, или записали на дискету и смонтировали в виртуалку? скомпилировали бут-сектор и записали его? пробовали загрузиться? скомпилировали PM-loader, добавили на дискету? Или вы теоретически, по 1 экрану в день читаете, и все компилируете только в голове? :))))
     
  8. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    FatMoon
    Там вначале и фасм есть.... Мечется автор что-то от компилера к комилерру.
     
  9. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Мне нравится FASM. Я и задавал вопрос, о том, можно ли использовать C-код до перехода в защищённый режим чтобы именно в C-коде перейти в защищённый режим. Видимо, нельзя. Так?
     
  10. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    ну в Си вы никак не перейдете - так или иначе, в какой-то момент будет асм-вставка, которая и обеспечит переход. Как вы контрольные регистры без асемблера измените? Но если вы четко понимаете происходящее при компиляции, можете таблицы дескрипторов как массивы в С создать, и в асм-вставке использовать указатель на. Если хватит возможностей... и будете понимать, что можно писать, а что нет (к примеру, память вам никто не выделит - try/catch использовать нельзя, не думаю, что это без ОС сработает как ожидалось - весь ввод/вывод и операции с файлами писать с нуля самому - ну и еще чего-нибудь тоже нельзя, я не гуру в Си, всего не знаю), видимо можно. Хотя видимо геморойней, чем на асемблере. И без асемблерных вставок может и не обойтись.
     
  11. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Похоже у меня уже мозги перекипели. Не получается даже загрузить сектор с floppy-диска. Вот boot.asm:

    Код (Text):
    1. use16
    2. org 0x7C00
    3.  
    4. boot__code16:
    5.     mov AX,CS
    6.     mov DS,AX
    7.     mov ES,AX
    8.     mov FS,AX
    9.     mov GS,AX
    10.     mov SS,AX
    11.     mov AX,boot_stack16_start
    12.     mov SP,AX
    13.    
    14.     mov AH,0x02
    15.     mov AL,1                    ; Количество читаемых секторов
    16.     mov CL,2                    ; Сектор
    17.     mov CH,0                    ; Цилиндр
    18.     mov DH,0                    ; Головка
    19.     mov DL,0                    ; Диск
    20.     mov BX,boot__continuation
    21.     int 0x13
    22.    
    23.     jmp boot__continuation
    24.  
    25. boot__stack16:
    26.     db 0,0,0,0,0,0,0,0
    27.     db 0,0,0,0,0,0,0,0
    28.     db 0,0,0,0,0,0,0,0
    29.     db 0,0,0,0,0,0,0,0
    30.     db 0,0,0,0,0,0,0,0
    31.     db 0,0,0,0,0,0,0,0
    32.     db 0,0,0,0,0,0,0,0
    33.     boot_stack16_start:
    34.     db 0,0,0,0,0,0,0,0
    35.  
    36. rb 510-($-$$)
    37. db 0x55,0xAA
    38.  
    39. boot__continuation:
    40.     hlt
    41.    
    42. rb (1024*1024*1)-1-($-$$)
    43. db 0x00
    Компилирую:

    Код (Text):
    1. fasm boot.asm Test.img
    Получаю Test.img. Запускаю его через Bochs и меня не показывается что процессор выполнил HLT. Вот что пишет:

    [​IMG]

    Видимо мне сегодня уже нужно отдохнуть от компьютера. Что я делаю не так?
     
  12. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    939
    jmp boot__continuation
    &&
    boot__stack16:

    Первое - размер сектора 512 байт и BIOS wouldn't care to load more sectors for you, you've got to implement it in one sector segment. Второе - нафиг стек помещать прямо там где код сектора? Обычно делают mov sp,7C00h-2 или еще как-то - полно же памяти.
     
  13. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Что-то я не понял! Я ничего вроде бы и не менял:

    Код (Text):
    1. use16
    2. org 0x7C00
    3.  
    4. boot__code16:
    5.     mov AX,CS
    6.     mov DS,AX
    7.     mov ES,AX
    8.     mov FS,AX
    9.     mov GS,AX
    10.     mov SS,AX
    11.     mov AX,boot_stack16_start
    12.     mov SP,AX
    13.    
    14.     mov AH,0x02
    15.     mov AL,1                    ; Количество читаемых секторов
    16.     mov CL,2                    ; Сектор
    17.     mov CH,0                    ; Цилиндр
    18.     mov DH,0                    ; Головка
    19.     mov DL,0                    ; Диск
    20.     mov BX,boot__continuation
    21.     int 0x13
    22.    
    23.     jmp boot__continuation
    24.  
    25. boot__data16:
    26.     db 0,0,0,0,0,0,0,0
    27.     db 0,0,0,0,0,0,0,0
    28.     db 0,0,0,0,0,0,0,0
    29.     db 0,0,0,0,0,0,0,0
    30.     db 0,0,0,0,0,0,0,0
    31.     db 0,0,0,0,0,0,0,0
    32.     db 0,0,0,0,0,0,0,0
    33.     db 0,0,0,0,0,0,0,0
    34.  
    35. boot__stack16:
    36.     db 0,0,0,0,0,0,0,0
    37.     db 0,0,0,0,0,0,0,0
    38.     db 0,0,0,0,0,0,0,0
    39.     db 0,0,0,0,0,0,0,0
    40.     db 0,0,0,0,0,0,0,0
    41.     db 0,0,0,0,0,0,0,0
    42.     db 0,0,0,0,0,0,0,0
    43.     boot_stack16_start:
    44.     db 0,0,0,0,0,0,0,0
    45.  
    46. rb 510-($-$$)
    47. db 0x55,0xAA
    48.  
    49. boot__continuation:
    50.     hlt
    51.    
    52. rb (1024*1024*1)-1-($-$$)
    53. db 0x00
    И теперь работает. Я не понимаю!
     
  14. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    В общем создал два файла в папке src: boot.asm и preparing.asm. Код файла boot.asm:

    Код (Text):
    1. use16
    2. org 0x7C00
    3.  
    4. boot__code16:
    5.     mov AX,CS
    6.     mov DS,AX
    7.     mov ES,AX
    8.     mov FS,AX
    9.     mov GS,AX
    10.     mov SS,AX
    11.     mov AX,boot_stack16_start
    12.     mov SP,AX
    13.    
    14.     mov AH,0x02
    15.     mov AL,1                    ; Количество читаемых секторов
    16.     mov CL,2                    ; Сектор
    17.     mov CH,0                    ; Цилиндр
    18.     mov DH,0                    ; Головка
    19.     mov DL,0                    ; Диск
    20.     mov BX,boot__continuation
    21.     int 0x13
    22.    
    23.     jmp boot__continuation
    24.  
    25. boot__data16:
    26.     db 0,0,0,0,0,0,0,0
    27.     db 0,0,0,0,0,0,0,0
    28.     db 0,0,0,0,0,0,0,0
    29.     db 0,0,0,0,0,0,0,0
    30.     db 0,0,0,0,0,0,0,0
    31.     db 0,0,0,0,0,0,0,0
    32.     db 0,0,0,0,0,0,0,0
    33.     db 0,0,0,0,0,0,0,0
    34.  
    35. boot__stack16:
    36.     db 0,0,0,0,0,0,0,0
    37.     db 0,0,0,0,0,0,0,0
    38.     db 0,0,0,0,0,0,0,0
    39.     db 0,0,0,0,0,0,0,0
    40.     db 0,0,0,0,0,0,0,0
    41.     db 0,0,0,0,0,0,0,0
    42.     db 0,0,0,0,0,0,0,0
    43.     boot_stack16_start:
    44.     db 0,0,0,0,0,0,0,0
    45.  
    46. rb 510-($-$$)
    47. db 0x55,0xAA
    48.  
    49. boot__continuation:
    50.     include "preparing.asm"
    51.    
    52. rb (1024*1024*1)-1-($-$$)
    53. db 0x00
    Код файла preparing.asm:

    Код (Text):
    1. preparing__code16:
    2.     cli
    3.    
    4.     in AL,0x92
    5.     or AL,0x02
    6.     out 92h,AL
    7.    
    8.     lgdt [preparing__data16_gdtr]
    9.    
    10.     mov EAX,CR0
    11.     or EAX,00000000000000000000000000000001b
    12.     mov CR0,EAX
    13.    
    14.     jmp 00001000b:preparing__pmode
    15.  
    16. preparing__data16:
    17.     preparing__data16_gdtr:
    18.         dw 8*4-1
    19.         dd preparing__data16_gdt
    20.     preparing__data16_gdt:
    21.         preparing__data16_gdt_null:
    22.             dw 0000000000000000b    ; Segment Limit(16)
    23.             dw 0000000000000000b    ; Base Address(16)
    24.             db 00000000b            ; Base Address(8)
    25.             db 00000000b            ; P(1), DPL(2), S(1), Type(4)
    26.             db 00000000b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    27.             db 00000000b            ; Base Address(8)
    28.         preparing__data16_gdt_code:
    29.             dw 1111111111111111b    ; Segment Limit(16)
    30.             dw 0000000000000000b    ; Base Address(16)
    31.             db 00000000b            ; Base Address(8)
    32.             db 10011000b            ; P(1), DPL(2), S(1), Type(4)
    33.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    34.             db 00000000b            ; Base Address(8)
    35.         preparing__data16_gdt_data:
    36.             dw 1111111111111111b    ; Segment Limit(16)
    37.             dw 0000000000000000b    ; Base Address(16)
    38.             db 00000000b            ; Base Address(8)
    39.             db 10010010b            ; P(1), DPL(2), S(1), Type(4)
    40.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    41.             db 00000000b            ; Base Address(8)
    42.         preparing__data16_gdt_stack:
    43.             dw 1111111111111111b    ; Segment Limit(16)
    44.             dw 0000000000000000b    ; Base Address(16)
    45.             db 00000000b            ; Base Address(8)
    46.             db 10010110b            ; P(1), DPL(2), S(1), Type(4)
    47.             db 11001111b            ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4)
    48.             db 00000000b            ; Base Address(8)
    49.  
    50. preparing__pmode:
    Компилирую:

    Код (Text):
    1. fasm "src/boot.asm" BOS.img
    Получаю сырой бинарный файл BOS.img. Теперь я в защищённом режиме (P-Mode) с 32-битным кодом. Создаю файл kernel.c со следующим содержимым:

    Код (Text):
    1. void kernel(void)
    2. {
    3.     for(;;)
    4.     {
    5.     }
    6. }
    И что мне теперь сделать, чтобы я перешёл на данную функцию? Нужно ли делать ассемблерный переходник или что вообще?
     
  15. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    s3dworld,

    Для начала, избавиться от C RTL и сделать подходящий бинарий, ожидающий загрузки по определённому адресу без перемещения, ну и стэк настроить, к примеру. :derisive:
     
  16. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    s3dworld
    Раньше в где-то на сайте колибри была статья как сделать из файла скомпилированного на С/С++ сделать бинарный файл, который можно использовать в вашем случае.
     
  17. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Что-то я не понимаю. Разве нельзя использовать C-код?

    У меня осуществляется переход в защищённый режим. Но как мне заставить MinGW (gcc и ld) подставлять нужное для меня смещение в адресах?

    Вот смотрите что я только не подставлял в -Ttext, у меня всегда получается одно и то же. Вот из последнего:

    Код (Text):
    1. fasm "src/boot.asm" BOS.img
    2. gcc -fno-leading-underscore -c -o startup.o "src/startup.c"
    3. gcc -fno-leading-underscore -c -o kernel.o "src/kernel.c"
    4. ld -Ttext 0x0007C400 -o Test.img startup.o kernel.o
    5. objcopy Test.img -O binary
    6. del startup.o
    7. del kernel.o
    8. pause
    И вот что у меня получается:

    [​IMG]

    Вызов идёт по адресу 0x000000010. Кстати, это почему запись показана не в виде 32-бит? Ну вот и он уходит гулять туда, хотя данный код должен начинаться по адресу 0x7C00:0x0000 + 0x0000:0x0400, то есть 0x0007C400. Собственно что я и указываю в -Ttext. Ну делают же люди как-то. Иначе зачем мне вообще всё это нужно (язык высокого уровня, линковка), если мне вручную нужно будет каждый раз проставлять адреса. Неужели никто с этим не сталкивался?
     
  18. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Кстати, в 3.5'' дискете на 1.44 МБ, там именно 150994944 байта? То есть ни больше, ни меньше. Понятное дело что могут быть повреждены, но максимум именно 150994944 байта, да? Просто хочу свою файловую систему реализовывать.
     
  19. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    А то я вот через WinImage 8.50 создал пустой образ floppy-дискеты на 1.44 МБ, а потом посмотрел и оказалось что там 1.40 МБ (1474560 байт). Почему так?
     
  20. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    s3dworld, вам для загрузки кода через загрузчик нужно считывать файл в память и исполнять. Учитывая что вы хотите написать свою файловую систему (гхрм...), то сначала пишите её, потом на её основе пишите функцию считывания с диска.