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

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

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

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    А вот смотрите, я не использую страничную адресацию. Просто создал дескриптор сегмента кода и дескриптор сегмента данных на всё адресное пространство. Сами по себе эти функции же будут какое-то прерывание использовать ведь? Иначе они ни откуда не возьмут свободное место. Вот если бы знать какое они вызывают, я бы тогда в ответ дал им адрес где есть место. Хм, кстати, а ОС отвечает за копирование объекта по new или же это делает C++ код, когда ему new возвращает адрес?
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.329
    Адрес:
    Ржев
    как я понял вопрос - C++
     
  3. s3dworld

    s3dworld Сергей

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

    Код (Text):
    1. struct A
    2. {
    3.     char text[32];
    4.     unsigned int age;
    5. };
    6.  
    7. class B
    8. {
    9.     public:
    10.         int zzz;
    11.  
    12.         B(void)
    13.         {
    14.             zzz=5;
    15.         }
    16.  
    17.         ~B(void)
    18.         {
    19.         }
    20. };
    21.  
    22. void main(void)
    23. {
    24.     A* a=0;
    25.     B* b=0;
    26.  
    27.     a=new A[500];
    28.     b=new B();
    29.  
    30.     delete[] a;
    31.     delete b;
    32. }
    Это у меня просто по new/new[] менеджер памяти (или просто какая-то хрень) выделяет запрашиваемый размер и назад возвращает адрес начала этого диапазона, а уже сам C++ туда вставляет данные или если конструктор, выполняет код.

    А после delete/delete[] просто освобождает (но до этого вызвав деструктор).

    То есть делом не так много, в простом случае всего лишь подсовывать адреса. Так?
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.329
    Адрес:
    Ржев
    s3dworld
    Блин ну не так прямолинейно. Но да. И не подсовывать, а спрашивать у системы или у своего 'менеджера памяти' свободный и отдавать его. Вопрос не имеет смысла. Открой исходники CRT и посмотри там new & delete.
    И спрашивай тут. Так намного быстрее будет
     
  5. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Сегодня я разработал свою файловую систему для дискет. Она простая такая, но просто решил сделать чтобы как бы быть на высоте хоть в том, что это я сделал. Написал программу, которая форматирует образ дискеты в мою файловую систему. Теперь нужно как-то научиться в защищённом режиме загружать сектора с дискеты. Никто не подскажет?

    И но второе что важно - это научиться с клавиатурой работать в защищённом режиме. Хочу для этого отдельно написать библиотеку (у меня ведь файловая система есть), но не знаю как с клавиатуры получать данные.
     
  6. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Кто-нибудь знает где можно скачать книгу "Программирование аппаратных средств в Windows. 2-ое издание"?
     
  7. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    А что, Bochs не поддерживает VBE2? А то он начинает глючить когда я пытаюсь узнать где будет находиться 32-битный линейный адрес начала видеобуфера в защищённом режиме. Решил использовать режим такой:

    Код (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 [0x7A00],byte 'V'
    15.     mov [0x7A01],byte 'B'
    16.     mov [0x7A02],byte 'E'
    17.     mov [0x7A03],byte '2'
    18.    
    19.     mov AH,0x4F
    20.     mov AL,0x01
    21.     mov CX,0100000100010010b
    22.     mov DI,0x7A00
    23.     int 0x10
    24.    
    25.     mov AH,0x4F
    26.     mov AL,0x02
    27.     mov BX,0100000100010010b
    28.     int 0x10
    29.    
    30.     mov AH,0x02
    31.     mov AL,18                   ; Количество читаемых секторов
    32.     mov CL,2                    ; Сектор
    33.     mov CH,0                    ; Цилиндр
    34.     mov DH,0                    ; Головка
    35.     mov DL,0                    ; Диск
    36.     mov BX,boot__continuation
    37.     int 0x13
    38.    
    39.     jmp boot__continuation
    40.  
    41. boot__data16:
    42.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    43.  
    44. boot__stack16:
    45.     db 0,0,0,0,0,0,0,0
    46.     db 0,0,0,0,0,0,0,0
    47.     db 0,0,0,0,0,0,0,0
    48.     db 0,0,0,0,0,0,0,0
    49.     db 0,0,0,0,0,0,0,0
    50.     db 0,0,0,0,0,0,0,0
    51.     db 0,0,0,0,0,0,0,0
    52.     boot_stack16_start:
    53.     db 0,0,0,0,0,0,0,0
    54.  
    55. rb 510-($-$$)
    56. db 0x55,0xAA
    57.  
    58. boot__continuation:
    59.     include "Preparing.asm"
    60.  
    61. rb 1023-($-$$)
    62. db 0x00
    Что не так?
     
  8. 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 [0x7A00],byte 'V'
    15.     mov [0x7A01],byte 'B'
    16.     mov [0x7A02],byte 'E'
    17.     mov [0x7A03],byte '2'
    18.    
    19.     mov AH,0x4F
    20.     mov AL,0x00
    21.     mov DI,0x7A00
    22.     int 0x10
    23.    
    24.     cmp AH,1
    25.     jz label1
    26.     jmp label2
    27.    
    28. label1:
    29.     hlt
    30.    
    31. label2:
    32.    
    33.     mov AH,0x4F
    34.     mov AL,0x01
    35.     mov CX,0100000100010010b
    36.     mov DI,0x7A00
    37.     int 0x10
    38.    
    39.     mov AH,0x4F
    40.     mov AL,0x02
    41.     mov BX,0100000100010010b
    42.     int 0x10
    43.    
    44.     mov AH,0x02
    45.     mov AL,18                   ; Количество читаемых секторов
    46.     mov CL,2                    ; Сектор
    47.     mov CH,0                    ; Цилиндр
    48.     mov DH,0                    ; Головка
    49.     mov DL,0                    ; Диск
    50.     mov BX,boot__continuation
    51.     int 0x13
    52.    
    53.     jmp boot__continuation
    54.  
    55. boot__data16:
    56.     db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    57.  
    58. boot__stack16:
    59.     db 0,0,0,0,0,0,0,0
    60.     db 0,0,0,0,0,0,0,0
    61.     db 0,0,0,0,0,0,0,0
    62.     db 0,0,0,0,0,0,0,0
    63.     db 0,0,0,0,0,0,0,0
    64.     db 0,0,0,0,0,0,0,0
    65.     db 0,0,0,0,0,0,0,0
    66.     boot_stack16_start:
    67.     db 0,0,0,0,0,0,0,0
    68.  
    69. rb 510-($-$$)
    70. db 0x55,0xAA
    71.  
    72. boot__continuation:
    73.     include "Preparing.asm"
    74.  
    75. rb 1023-($-$$)
    76. db 0x00
    Запускаю Bochs и вижу:

    [​IMG]

    Не понял ничего. Тогда решил в режиме отладки зайти. Ввёл точку останова:

    И запустил на выполнение - Continue. Пришло время, и он остановился на моей контрольной точке:

    [​IMG]

    Тут я стал шаг за шагом (F11) смотреть что происходит. Проверил внёс ли он сигнатуру VBE2:

    [​IMG]

    Тут он справился. Далее я дошёл уже до прерывания 0x10 и поставил контрольную точку, чтобы остановиться после кода прерывания:

    [​IMG]

    И решил продолжить путешествие - Continue. Но почему-то у меня больно долго был тёмный экран:

    [​IMG]

    Тогда я решил прервать выполнение - Break и увидел:

    [​IMG]

    Почему же он тогда там завис и не дошёл до моей контрольной точки?
     
  9. 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,25                   ; Количество читаемых секторов
    16.     mov CL,2                    ; Сектор
    17.     mov CH,0                    ; Цилиндр
    18.     mov DH,0                    ; Головка
    19.     mov DL,0                    ; Диск
    20.     mov BX,boot__font
    21.     int 0x13
    22.    
    23.     mov AH,0x11
    24.     mov AL,0x03
    25.     mov BH,8
    26.     mov BL,0
    27.     mov CX,128
    28.     mov DX,128
    29.     mov BP,boot__font
    30.     int 0x10
    31.    
    32.     jmp boot__continuation
    33.  
    34. boot__data16:
    35.     db 0,0,0,0,0,0,0,0
    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.  
    44. boot__stack16:
    45.     db 0,0,0,0,0,0,0,0
    46.     db 0,0,0,0,0,0,0,0
    47.     db 0,0,0,0,0,0,0,0
    48.     db 0,0,0,0,0,0,0,0
    49.     db 0,0,0,0,0,0,0,0
    50.     db 0,0,0,0,0,0,0,0
    51.     db 0,0,0,0,0,0,0,0
    52.     boot_stack16_start:
    53.     db 0,0,0,0,0,0,0,0
    54.  
    55. rb 510-($-$$)
    56. db 0x55,0xAA
    57.  
    58. boot__font:
    59.     include "Font.asm"
    60.  
    61. boot__continuation:
    62.     include "Preparing.asm"
    63.  
    64. rb 2047-($-$$)
    65. db 0x00
    Всё это работает, однако почему-то шрифты русскими не стали (почему?). Но не понятно мне то, что когда я делаю так:

    Код (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,0x00
    15.     mov AL,0x03
    16.     int 0x10
    17.    
    18.     mov AH,0x02
    19.     mov AL,25                   ; Количество читаемых секторов
    20.     mov CL,2                    ; Сектор
    21.     mov CH,0                    ; Цилиндр
    22.     mov DH,0                    ; Головка
    23.     mov DL,0                    ; Диск
    24.     mov BX,boot__font
    25.     int 0x13
    26.    
    27.     mov AH,0x11
    28.     mov AL,0x03
    29.     mov BH,8
    30.     mov BL,0
    31.     mov CX,128
    32.     mov DX,128
    33.     mov BP,boot__font
    34.     int 0x10
    35.    
    36.     jmp boot__continuation
    37.  
    38. boot__data16:
    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.     db 0,0,0,0,0,0,0,0
    44.     db 0,0,0,0,0,0,0,0
    45.     db 0,0,0,0,0,0,0,0
    46.     db 0,0,0,0,0,0,0,0
    47.  
    48. boot__stack16:
    49.     db 0,0,0,0,0,0,0,0
    50.     db 0,0,0,0,0,0,0,0
    51.     db 0,0,0,0,0,0,0,0
    52.     db 0,0,0,0,0,0,0,0
    53.     db 0,0,0,0,0,0,0,0
    54.     db 0,0,0,0,0,0,0,0
    55.     db 0,0,0,0,0,0,0,0
    56.     boot_stack16_start:
    57.     db 0,0,0,0,0,0,0,0
    58.  
    59. rb 510-($-$$)
    60. db 0x55,0xAA
    61.  
    62. boot__font:
    63.     include "Font.asm"
    64.  
    65. boot__continuation:
    66.     include "Preparing.asm"
    67.  
    68. rb 2047-($-$$)
    69. db 0x00
    В общем добавил код переключения режима:

    Код (Text):
    1. mov AH,0x00
    2. mov AL,0x03
    3. int 0x10
    И у меня вот что пишет Bochs:

    [​IMG]

    Почему же он зацикливается? Ничего не понимаю, добавил то безобидные команды.
     
  10. s3dworld

    s3dworld Сергей

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

    Файловая система BFS (Basic Files System) разработана Дубровкиным Сергеем. Данная файловая система предназначается для дискет, объёмом в 1474560 байт (1440 КБ). Минимальной единицей является кластер, который является либо одним сектором, либо объединением секторов.

    Структура файловой системы BFS изображена в таблице:

    [​IMG]

    Структура bootData располагается в самом начале дискеты и занимает 4096 байт (от 0x0000 до 0x0FFF). Вот её формат:

    [​IMG]

    Структура filesList располагается, начиная со смещения 0x1000. Её формат следующий:

    [​IMG]

    Как видно, максимум может быть 44 файла. Структура fileDescription занимает 64 байта. Вот её формат:

    [​IMG]

    Структура data включает в себя данные всех файлов. Если представить за N номер файла (первый файл начинается с индекса 0), то найти адрес начала файла можно по следующей формуле:

    [​IMG]

    Структура user включает оставшиеся байты, которые программист может использовать по своему усмотрению. Эти данные занимают 25600 байт (50 КБ).
     
  11. kossr85

    kossr85 New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2010
    Сообщения:
    1
    обалдеть............
     
  12. s3dworld

    s3dworld Сергей

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

    s3dworld Сергей

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

    Всё таки решил воспользоваться советами умных людей и стал использовать файловую систему FAT. Хочу поделиться с Вами тем, что я сейчас написал. Именно меня волнует сам код. Хочу чтобы Вы мне по поводу него дали советы. Вот сам код:

    Код (Text):
    1. ; Загрузочный сектор
    2. ; Дубровкин Сергей
    3. ; 20.01.2011 - 18:06
    4.  
    5. use16
    6. org 0x7C00
    7.  
    8. ; Структура заголовка FAT12
    9. ; {
    10.     jmp code16
    11.  
    12.     BS_jmpBoot      db 0x90             ; Прыжок на код
    13.     BS_OEMName      db "ULTRAISO"
    14.     BPB_BytsPerSec  dw 512              ; Количество байт в секторе
    15.     BPB_SecPerClus  db 1                ; Количество секторов в кластере
    16.     BPB_RsvdSecCnt  dw 1                ; Количество зарезервированных секторов перед первой FAT
    17.     BPB_NumFATs     db 2                ; Количество таблиц FAT
    18.     BPB_RootEntCnt  dw 224              ; Максимальное количество элементов в корневом каталоге
    19.     BPB_TotSec16    dw 2880             ; Общее число секторов
    20.     BPB_Media       db 0xF0             ; Тип устройства
    21.     BPB_FATSz16     dw 9                ; Количество секторов на элемент таблицы FAT
    22.     BPB_SecPerTrk   dw 18               ; Количество секторов на дорожку
    23.     BPB_NumHeads    dw 2                ; Число головок
    24.     BPB_HiddSec     dd 0                ; Количество скрытых секторов
    25.     BPB_TotSec32    dd 0                ; Общее число секторов
    26.     BS_DrvNum       db 0x00             ; Номер устройства
    27.     BS_Reserved     db 0x00             ; Зарезервированно
    28.     BS_BootSig      db 0x29             ; Сигнатура 0x29, что нижние поля присутствуют
    29.     BS_VolID        dd 0x03,0x76,0x30,0x5D
    30.     BS_VolLab       db "SOS        "
    31.     BS_FilSysType   db "FAT12   "
    32. ; }
    33.  
    34. code16:
    35.     mov AX,CS
    36.     mov DS,AX
    37.     mov ES,AX
    38.     mov FS,AX
    39.     mov GS,AX
    40.     mov SS,AX
    41.     mov AX,0x7C00-4
    42.     mov SP,AX
    43.    
    44.     push 0
    45.     call WriteLN
    46.    
    47.     push message
    48.     call Write
    49.    
    50.     hlt
    51.    
    52. ; Вывод символов
    53. ; В качестве параметра нужно указать адрес символа
    54. Write:
    55.     push BP
    56.     mov BP,SP
    57.    
    58.     mov AH,0x0E
    59.     mov BH,0
    60.     mov SI,[BP+4]
    61.    
    62.     test SI,SI
    63.     jz Write_Exit
    64.    
    65.     Write_Loop:
    66.     mov DL,byte [SI]
    67.     test DL,DL
    68.     jz Write_Exit
    69.     mov AL,DL
    70.     int 0x10
    71.     inc SI
    72.     jmp Write_Loop
    73.    
    74.     Write_Exit:
    75.     mov SP,BP
    76.     pop BP
    77. ret
    78.  
    79. ; Вывод символов с последующим переходом на новую строку
    80. ; В качестве параметра нужно указать адрес символа
    81. WriteLN:
    82.     push BP
    83.     mov BP,SP
    84.    
    85.     mov AH,0x0E
    86.     mov BH,0
    87.     mov SI,[BP+4]
    88.    
    89.     test SI,SI
    90.     jz WriteLN_Exit
    91.    
    92.     WriteLN_Loop:
    93.     mov DL,byte [SI]
    94.     test DL,DL
    95.     jz WriteLN_Exit
    96.     mov AL,DL
    97.     int 0x10
    98.     inc SI
    99.     jmp WriteLN_Loop
    100.    
    101.     WriteLN_Exit:
    102.     mov AL,0x0A
    103.     int 0x10
    104.     mov AL,0x0D
    105.     int 0x10
    106.    
    107.     mov SP,BP
    108.     pop BP
    109. ret
    110.    
    111. data16:
    112.     message db "Simple Operating System loading...",0x00
    113.  
    114. rb 510-($-$$)
    115. db 0x55,0xAA
    116.  
    117. ; Дубровкин Сергей © 2011
    Вот результат работы в Bochs:

    [​IMG]

    И ещё хочется спросить, стоит ли делать в загрузчике возможность для пользователя выбирать запускать операционную систему или не запускать, или это уже лучше сделать не в 512 байтах загрузочного сектора? Просто без выбора я думаю не правильно будет.
     
  14. vladimir_ch

    vladimir_ch New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    8
    Обычно в бут-секторе хранится только часть загрузчика, которая простите за тавтологию, загружает загрузчик. И эта вторая часть загрузчика позволяет выбирать ОС и т.д. Я бы не советовал этим заниматься - убъете много времени, которое могли бы потратить на изучение непосредственно архитектуры x86. Проще сделать так, чтобы ядро соответствовало спецификации Multiboot и заняться непосредственно изучением разработки ОС, используя в качестве загрузчика GRUB, например, а не написанием загрузчика. Хотя свой загрузчик - тоже хороший способ ознакомиться с принципами работы процессора.
     
  15. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.204
    s3dworld
    Я согласен с vladimir_ch, но так же хочу добавить, что из загрузочного сектора лучше вообще ничего не выводить, хотя бы до тех пор, пока загрузчик не до грузит сам себя и не начнет выполнять до загруженный код.
    Или можете пойти путем мелкомягких, который я лично не одобряю. Вторая часть загрузчика располагается строго в определенном месте и в первой части размещен мизерный код для ее загрузки, зато также настраиваются различные фишки (типа часов реального времени) и лежат сообщения об ошибках.