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

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

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

  1. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Так сколько в действительно байт в 1.44 МБ дискете? Меня смущает дробное число.
     
  2. s3dworld

    s3dworld Сергей

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

    Только тогда причём тут 1.44 МБ?
     
  3. Igor1024

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

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Округлили для юзеров, появилось вследствие какой-нибудь рекламной акции... какая разница?
     
  4. s3dworld

    s3dworld Сергей

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

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Кстати, на дискете минимальное что можно извлечь - это сектор (512 байт). Получается, что если хоть один байт в секторе испорченный, то весь сектор не доступен (ошибочен). А как можно выяснить какие сектора с ошибками?
     
  6. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    s3dworld
    Записать и попытаться считать, наверно....
     
  7. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Вот скажите, пожалуйста, если у меня есть дискета 3.5' высокой плотности, которая вмещает 1474560 байт (1440 КБ), то из скольких частей она будет состоять (я имею в виду: головки, цилиндры и сектора)? Обязательно ли это будет для каждой подобной дискеты одинаковым количеством?

    1474560 байт - это 2880 секторов.

    Но сами сектора располагаются на цилиндре. А в свою очередь цилиндры располагаются на головке. На сколько я знаю, головок может быть либо 1, либо 2. От чего это зависит и как это определять? Всё-таки я должен знать как мне каждую дискету полностью считывать.

    На каждой головке располагается какое-то количество цилиндров. Это число всегда постоянно, или же оно в два раза больше если всего одна головка?

    А вот уже на каждом цилиндре располагаются сектора. Сколько их?

    Надеюсь для дискет 3.5' высокой плотности постоянно одно и то же количество всех деталей.
     
  8. s3dworld

    s3dworld Сергей

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    387
    Адрес:
    Ртищево
    Для всех 3.5' дискет высокой плотности характерно такое:

    - 2 головки;
    - на каждой головке по 80 цилиндров;
    - на каждом цилиндре по 18 секторов.

    ?
     
  9. s3dworld

    s3dworld Сергей

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

    [​IMG]
     
  10. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Цилиндр -- это группа дорожек, доступных для считывания-записи без механического перемещения блока головок. Так что ни головки на цилиндрах быть не могут, ни цилиндры на головках. Каждая дорожка состоит из одного или нескольких секторов, причём их число может быть переменным (и своим для каждой дорожки). Собственно, именно поэтому один и тот же привод способен считывать и записывать дискеты разных форматов. Никакого способа со 100% достоверностью узнать, сколько цилиндров на дискете используется и какое число секторов на каждой дорожке, не существует, не считая попыток считывания содержимого дискеты во всех мыслимых и немыслимых сочетаниях количества цилиндров, используемых головок (одна или две) и числа секторов на дорожке. Но этим никто, кроме специализированных программ, и не занимается; вместо этого используются несколько стандартных форматов дискет, а информация о том, какой именно формат применяется на данной дискете, хранится в её первом секторе (цилиндр 0, головка 0, сектор 1) в составе блока параметров BIOS (вроде так он называется, подробно уже не помню). Если дискета отформатирована нестандартным образом, то обычные ОС работать с ней не смогут как раз потому, что они не поддерживают любой изврат, какой только можно сотворить с дискетой.
     
  11. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    добавлю, что никто не мешает сделать 160 дорожек, 20 секторов и по 1024 байта на сектор (и получить совсем неприличную емкость 6400К - другой вопрос, найдется ли дискета столь хорошего качества, и привод, в котором она будет стабильно читаться, иначе получишь 95% в бэдах). Или сделать по 1024 байта на сектор и 10 секторов на дорожку начиная с дорожки 45. Один из методов защиты дискеты от копирования. Когда-то во времена ДОС были популярны программки, форматирующие дискеты совсем нестандартно. Чтоб хоть немного, а побольше влезло. Нортоновские утилиты вроде в составе такую софтину имели. На самом деле, обычным format'ом тоже можно что-то сделать. Но в то время были удобнее утилиты - показывали процесс графически, позволяли порядок секторов поменять, оптимизировали размещение секторов по сторонам с учетом 2-х головок и угловой скорости вращения. Если дискета была размечена успешно, то как минимум с дос 6.22 она нормально работала, лично имел пачку дискет, отформатированных на 1.8Мб - читались без установки каких-либо драйверов, архивы на них таскал. Так что по хорошему, не только в емкости диска нельзя быть уверенным, но даже и в емкости сектора.
     
  12. s3dworld

    s3dworld Сергей

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

    В реальном режиме загрузчик копируется по адресу 0x7C00:0x0000 и занимает 512 байт. Если выразить это в диапазоне, то получается от 0x7C00:0x0000 до 0x7C00:0x01FF. Правильно?

    А вот по какому диапазону адресов я должен обратиться в защищённом режиме, чтобы получить эти же 512 байт, которые загрузчик мне скопировал? От 0x0007C000 до 0x0007C1FF? Разумеется с учётом того, что я объявил сегмент на всё адресное пространство.
     
  13. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Да.
     
  14. s3dworld

    s3dworld Сергей

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

    Забудем на время о C-коде. Есть два файла: 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,5                    ; Количество читаемых секторов
    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 1023-($-$$)
    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 0000000000001000b: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:
    51.     use32
    52.     mov AX,0000000000010000b
    53.     mov DS,AX
    54.     mov ES,AX
    55.     mov FS,AX
    56.     mov GS,AX
    57.     mov AX,0000000000011000b
    58.     mov SS,AX
    59.     mov ESP,0x0007C1FF
    60.    
    61.     mov ECX,80*25
    62.     mov EAX,0x000B8000
    63.    
    64.     @@:
    65.         mov [EAX],byte ' '
    66.         inc EAX
    67.         mov [EAX],byte 00010000b
    68.         inc EAX
    69.     loop @b
    70.    
    71.     hlt
    Компилирую:

    Код (Text):
    1. fasm boot.asm BOS.img
    Запускаю в Bochs и всё работает как и планировалось. Но вот только стоит мне использовать стек:

    Код (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 0000000000001000b: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:
    51.     use32
    52.     mov AX,0000000000010000b
    53.     mov DS,AX
    54.     mov ES,AX
    55.     mov FS,AX
    56.     mov GS,AX
    57.     mov AX,0000000000011000b
    58.     mov SS,AX
    59.     mov ESP,0x0007C1FF
    60.    
    61.     push AX
    62.    
    63.     mov ECX,80*25
    64.     mov EAX,0x000B8000
    65.    
    66.     @@:
    67.         mov [EAX],byte ' '
    68.         inc EAX
    69.         mov [EAX],byte 00010000b
    70.         inc EAX
    71.     loop @b
    72.    
    73.     hlt
    То у меня виртуальный компьютер по кругу перезагружается, не успевая закрасить экран в синий цвет. То есть запинается на инструкции push AX.

    Что я делаю не так и как надо?
     
  15. s3dworld

    s3dworld Сергей

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

    С чужой помощью удалось добиться работы кода. Во всём был виноват дескриптор сегмента данных, который я решил описать как стек (не нравилось ему что я бит EW установил в 1). Заработал и C++ код (компилирую через g++). Смог C++ кодом очищать экран и выводить символы. Но возникла проблема с вводом текста. Почему-то у меня не передаётся в функцию указатель на текст:

    Код (Text):
    1. #define VIDEO_RAM 0x000B8000
    2.  
    3. void Clear(const char _color);
    4. void DrawChar(const char _char,const unsigned int _x,const unsigned int _y,const char _color);
    5. void DrawText(const char* _text,const unsigned int _x,const unsigned int _y,const char _color);
    6.  
    7. void kernel(void)
    8. {
    9.     Clear(0b00010000);
    10.     DrawText("Hello!\0",0,0,0b00011110);
    11.     DrawChar('1',4,1,0b00001010);
    12.  
    13.     for(;;)
    14.     {
    15.     }
    16. }
    17.  
    18. void Clear(const char _color)
    19. {
    20.     unsigned int i=0;
    21.     char* address=0;
    22.    
    23.     address=(char*)VIDEO_RAM;
    24.    
    25.     for(i=0;i<80*25*2;i+=2)
    26.     {
    27.         *(address+i)=' ';
    28.         *(address+i+1)=_color;
    29.     }
    30. }
    31.  
    32. void DrawChar(const char _char,const unsigned int _x,const unsigned int _y,const char _color)
    33. {
    34.     unsigned int i=0;
    35.     char* address=0;
    36.    
    37.     i=160*_y+2*_x;
    38.     address=(char*)VIDEO_RAM;
    39.    
    40.     *(address+i)    = _char;
    41.     *(address+i+1)  = _color;
    42. }
    43.  
    44. void DrawText(const char* _text,const unsigned int _x,const unsigned int _y,const char _color)
    45. {
    46.     unsigned int i=0;
    47.     unsigned int j=0;
    48.     unsigned int length=0;
    49.     char* address=0;
    50.    
    51.     i=160*_y+2*_x;
    52.     address=(char*)VIDEO_RAM;
    53.    
    54.     while(_text[length]) length++;
    55.    
    56.     while(length)
    57.     {
    58.         *(address+i)    = _text[j];
    59.         *(address+i+1)  = _color;
    60.        
    61.         i+=2;
    62.         j++;
    63.         length--;
    64.     }
    65. }
    В результате у меня выводится только символ 1 от функции DrawChar(). Почему функция DrawText() не получает указатель на текст и как это исправить?
     
  16. s3dworld

    s3dworld Сергей

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

    Я тут начал уже писать функции для очистки экрана, для очистки диапазона памяти и для вывода на экран текста и целых чисел. Не подскажите стать, где описано как вещественные числа (float, double и long double) переводить в текст?

    И ещё хочется понять как работают new, new[], delete и delete[]. Хотелось бы их использовать, но они к чему-то привязаны. Вообще, что мне нужно сделать, чтобы у меня программа могла с ними работать?
     
  17. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Они тянут три гигабайта кода с собой. Ну, не три, но всё равно полно. В конечном счёте эти вызовы могут обращаться к Вин32 АПИ (ну или другим АПИ в зависимости от ОС), поэтому их придётся переписывать самому.
     
  18. s3dworld

    s3dworld Сергей

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

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Выделение и освобождение памяти нужного размера. Напишите программу на Си++ для Винды, дизассемблируйте да разберитесь, какой код компилятор генерирует для этих операторов и что конкретно делают соответствующие подпрограммы.
     
  20. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.325
    Адрес:
    Fryazino
    s3dworld
    New и Delete не простые функции нюансов там много. Они вызывает malloc и free

    Их внутреннее устройство немного расписано здесь
    http://dvoika.net/infor/teor/Glava 4/Index3.htm