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

Discussion in 'WASM.BEGINNERS' started by s3dworld, Oct 6, 2010.

  1. max7C4

    max7C4 New Member

    Blog Posts:
    0
    Joined:
    Mar 17, 2008
    Messages:
    1,203
    А если даже предположить, что размер страничек на 4 Кб, а 20 байт и следовательно инструкция попадает на границу страницы
    то процессору все равно будет на это пофигу. Он эмитирует линейность виртуального пространства при условии наличия для этого памяти.
     
  2. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    Tronix
    Спасибо! Просто я хочу разобраться.

    Прочитал в статье http://ru.osdev.wikia.com/wiki/Определение_объёма_памяти про определение адресов оперативной памяти. И вот мне стало интересно...

    Я вот не понимаю, что значит минимум в этом случае. А что, если я укажу 40 байт, мне придёт 40 байт данных в ответ?

    Есть таблица:

    [​IMG]

    Расширенные атрибуты диапазона представляют собой двойное слово, то есть 32-бита (4 байта). Тогда получается что нужно в регистр ECX, перед вызовом функции, заносить значение 24?

    Вернёмся всё к той же таблице...

    У нас есть Начальный адрес диапазона, младшие 32 бита и Начальный адрес диапазона, старшие 32 бита. То есть данная функция BIOS предназначена для определения карты памяти в общем (x86, x64)?

    И вот ещё что:

    По этому адресу данные придут в виде текста ("12345678") или в виде числовых значений (12345678)?
     
  3. barmaley57

    barmaley57 New Member

    Blog Posts:
    0
    Joined:
    Aug 10, 2009
    Messages:
    58
    s3dworld, нескромный вопрос: сколько тебе лет?
     
  4. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    barmaley57
    22 года мне. Программированием занимаюсь с 8 лет (тогда ещё был у меня ZX-Spectrum). Жалею только об одном, что когда мне было лет 10-11, продавец CD-дисков заговорил меня и вместо того чтобы привести мне диск с ассемблером (хотел я его тогда изучать), он меня направил на языки высокого уровня (Java). А лучше бы я тогда фундамент на ассемблере построил. Но ничего, у меня ещё всё впереди. А к чему был этот вопрос?
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    s3dworld

    Нет - вам придет не больше того, что рекомендовано во входном описателе (а там рекомендовано, что текущий стандарт требует 24 байта).

    Только это не определение адресов. А определение объемов ОП.
    Внимательнее будьте.

    А вы кстати никогда не узнаете из программы, какую же именно реальную физическую память (какой банк памяти и какая ячейка) занял ваш код. За адресацию внутри ОП отвечает контроллер памяти. Вы же можете тока использовать то, что предоставляет процессор. А он вам предоставляет страничную, сегментную модели памяти и их комбинацию. Больше ничего использовать вам не дано.
    Это говорит о том, что есть еще 1 уровень трансляции: физический для процессора - в "честный физический" для ОП. Вот этим и занимается контроллер.
     
  6. barmaley57

    barmaley57 New Member

    Blog Posts:
    0
    Joined:
    Aug 10, 2009
    Messages:
    58
    Да так, просто интересно стало. Если бы у меня в 22 года появился бы такой жгучий интерес, то я бы сейчас ух.... :) А так просто офисный планктон :)
    Так что удачи тебе в изысканиях.
     
  7. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    TermoSINteZ
    Минутку, как не определяет адресов? А табличка:

    [​IMG]

    Тут же Начальный адрес диапазона и Длина диапазона. Это по Вашему что?
     
  8. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    barmaley57
    Спасибо!

    TermoSINteZ
    Если это не определяет адресов, тогда как их определить? Подскажите статьи или возможно теорию.
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    s3dworld
    Что вы хотите определить? Я не понимаю вас немного. Расшифруйте ваше "Определить адрес". Покажите пример , типа что дано, а что надо найти.
     
  10. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    TermoSINteZ
    Адресное пространство в 4 ГБ занимает всё подряд (ОЗУ, память устройств, регистры устройств и прочее). Мне из всего адресного пространства в 4 ГБ нужно определить следующее:

    1. Объём оперативной памяти (ОЗУ). У меня это 2048 МБ (2 097 152 байта). Вот мне нужно для галочки научиться определять этот объём (хотя фактически цифра может различаться, не верю я что производители байт в байт всё делают). Чтобы определив объём, я мог принять решение запускать операционную систему или нет.

    2. Составить таблицу, которая содержала бы следующие поля:

    [​IMG]

    Например, будет так:

    [​IMG]

    То есть я хочу получить адреса участков адресной памяти, которые принадлежат к оперативной памяти (ОЗУ). Конечно по этой таблице я смогу и решить свой первый вопрос (просто просуммировав все длины).

    Собственно на основании такой таблицы я составлю таблицу для страничек.
     
  11. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    Разве для этой цели мне не подходит функция, описанная выше, прерывания 0x15 системы BIOS?

    Что самое интересное: объём и адреса оперативной памяти (ОЗУ) и для 2^32 адресного пространства и для 2^64, определяются в реальном режиме (R-Mode) работы процессора (ну это и понятно, ведь прерывания BIOS доступны нам только тут).

    Так всё таки функцию для определения я правильную подметил?

    Ещё бы мне хотелось разную информацию (особенно числовую) выводить на экран монитора. Для начала мне подойдёт запись значений по адресу 0x0000B800. Но как быть с числовыми данными (пока интересуют только целые числа, да и пока пускай будут положительные). Придётся писать самому функцию конвертирования данных в текст или же есть какая-то хитрость? Просто тот же объём оперативной памяти вывести на экран.
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    s3dworld
    Чтобы получить объем памяти - да. Можно юзать. И все. А страничная адресация в защищенном режиме никак не связана с этой функцией.

    Ничего там хитрого и сложного. И обсуждалось 100500 раз на форуме. Ищите по ключевым словам ASCII, вывод чисел на экран и тп.
     
  13. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    TermoSINteZ
    Я Вас не понимаю. Ведь написано в статье что она используется для определения адресов. Я лишь хотел узнать эффективный ли это способ или есть что-то лучше. Разве через эту функцию я не получу начало адреса для ОЗУ и длину? Разве не получу через несколько вызовов этой функцию всё карту адресов ОЗУ?
     
  14. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    TermoSINteZ
    Понятное дело что страничная адресация не зависит от этой функции. Я же хочу определить где у меня ОЗУ и странички описать именно на ОЗУ, а не описывать все 1024 элемента на всю адресную память.
     
  15. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    Я тут так подумал то про страничную адресацию...

    Предположим что мы имеем дело со страницами, размером по 4 МБ. Вот у нас 32-битное значение:

    В данном случае мы будем ссылаться на страничку с индексом 0 и смещение в ней в 0 байт. Пускай мы дошли до предела странички 4194304 байт (от 0 до 4194303) - то есть 4 МБ.

    И если мы дальше куда-то соберёмся идти по адресу:

    То это у нас уже будет страничка с индексом 1 и со смещением в 0 байт. Таким образом, в коде можно обращаться, скакать и прочие операции проводить, как угодно. Всё само собой будет переведено правильно (новая страничка, смещение с начала). Важно лишь чтобы для каждой программы странички начинались с индекса 0 (либо чтобы операционная система сама индекс понижала).

    А то программа пользователя захочет получить данные по адресу:

    Code (Text):
    1. mov EAX,dword [00000000000000000000000000000011b]
    Это будет интерпретировано как получить данные со странички с индексом 0 по смещение в 3 байта. А возможно что туда доступа программе пользователя и нет. Так что получается что лучше коды и данные текущей программы держать в первых страничках. Так? Например, как обычно и делается: первая страничка с данными, вторая страничка с кодом.

    Какие будут комментарии?
     
  16. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    Что касается перевода целого положительного числа в строку...

    Алгоритм такой:

    1. Разделим число на 10 (0x0000000A, 00000000000000000000000000001010b).

    2. Остаток от деления на 10 (0x0000000A, 00000000000000000000000000001010b) записать куда-нибудь в память и прибавить к нему значение 48 (0x00000030, 00000000000000000000000000110000b). Если полученное число (не остаток от деления и не число, полученное при добавлении числа 48) равнялся нулю, то переходим к шагу 4, иначе к шагу 3.

    3. Полученное число (не остаток) от деления на 10 (0x0000000A, 00000000000000000000000000001010b) передаём в шаг 1.

    4. Если в строке получился всего один символ, то можем его вывести на экран. А если в строке больше одного символа, то выстраиваем символы в строке в обратном порядке.

    Давайте в месте всё проверим...

    Пусть у нас есть число 123 (0x0000007B, 00000000000000000000000001111011b).

    1. 123 mod 10 = 3
    2. 3 + 48 = 51 (записываем в строку - символ с индексом 0)
    3. 12 mod 10 = 2
    4. 2 + 48 = 50 (записываем в строку - символ с индексом 1)
    5. 1 mod 10 = 1
    6. 1 + 48 = 49 (записываем в строку - символ с индексом 2)
    7. Так как у нас больше одного символа в строке (51, 50, 49), то мы их записываем в обратном порядке: 49, 50, 51.

    А числа 49, 50 и 51 представляют ASCII-коды следующих символов: '1', '2' и '3' - то есть будет у нас строка "123".

    Всё верно?
     
  17. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    Вот даже кое что сообразил (надеюсь кому-то это будет в пользу):

    Code (Text):
    1. ; ********************************************************
    2. ;                   П Р О Ц Е Д У Р А
    3. ; ********************************************************
    4.  
    5. ; -------------------------------------------------------{
    6. ; Название: UnsignedNumberToString()
    7. ; Описание: Преобразование 32-битного числа в строку
    8. ; Вход:     EAX - 32-битное число
    9. ; Выход:   EDI - указатель на строку
    10. ;           ECX - количество символов в строке
    11. ; --------------------------------------------------------
    12. UnsignedNumberToString:
    13.         mov EDI,string1
    14.         mov ECX,0
    15.         mov EBX,10
    16.    
    17.     UnsignedNumberToString__Label_Div:
    18.         div EBX
    19.    
    20.         add EDX,48
    21.         mov [EDI],byte DL
    22.         inc EDI
    23.         inc ECX
    24.    
    25.         test EAX,EAX
    26.         jz UnsignedNumberToString__Label_NoDiv
    27.         jmp UnsignedNumberToString__Label_Div
    28.    
    29.     UnsignedNumberToString__Label_NoDiv:
    30.         cmp ECX,1
    31.         jz UnsignedNumberToString__Label_NoBuild
    32.         jmp UnsignedNumberToString__Label_Build
    33.    
    34.     UnsignedNumberToString__Label_Build:
    35.         mov ESI,string1
    36.         mov EDI,string2
    37.         mov EBX,0
    38.        
    39.         UnsignedNumberToString__Label_Build_Copy:
    40.             mov EDX,ECX
    41.             sub EDX,EBX
    42.             sub EDX,1
    43.            
    44.             add ESI,EBX
    45.             add EDI,EDX
    46.            
    47.             mov AL,byte [ESI]
    48.             mov [EDI],byte AL
    49.            
    50.             inc EBX
    51.  
    52.         cmp EBX,ECX
    53.         jz UnsignedNumberToString__Label_BuildConplete
    54.         jmp UnsignedNumberToString__Label_Build_Copy
    55.    
    56.     UnsignedNumberToString__Label_BuildConplete:
    57.         mov EDI,string2
    58.         jmp UnsignedNumberToString__Label_End
    59.    
    60.     UnsignedNumberToString__Label_NoBuild:
    61.         mov EDI,string1
    62.    
    63.     UnsignedNumberToString__Label_End:
    64. ret
    65. ; -------------------------------------------------------}
    66.  
    67. ; ********************************************************
    68. ;                     Д А Н Н Ы Е
    69. ; ********************************************************
    70.  
    71. UnsignedNumberToString__Data:
    72.     string1 db 0,0,0,0,0,0,0,0,0,0,0
    73.     string2 db 0,0,0,0,0,0,0,0,0,0,0
    Если есть какие-то комментарии или нашли ошибки, то пишите.
     
  18. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    Обнаружил я что моя процедура перевода числа в строку не работает. Обидно! А главное я не понимаю ошибку. Выявил что запинается у меня всё на команде div:

    Code (Text):
    1. div EBX
    Но не понимаю в чём дело. Кто поможет? Вот весь код:

    Code (Text):
    1. ; ********************************************************
    2. ;                   П Р О Ц Е Д У Р А
    3. ; ********************************************************
    4.  
    5. ; -------------------------------------------------------{
    6. ; Название: UnsignedNumberToString()
    7. ; Описание: Преобразование 32-битного числа в строку
    8. ; Вход:     EAX - 32-битное число
    9. ; Выход:   EDI - указатель на строку
    10. ;           ECX - количество символов в строке
    11. ; --------------------------------------------------------
    12. UnsignedNumberToString:
    13.         mov EDI,string1
    14.         mov ECX,0
    15.         mov EBX,10
    16.    
    17.     UnsignedNumberToString__Label_Div:
    18.         div EBX
    19.    
    20.         add EDX,48
    21.         mov [EDI],byte DL
    22.         inc EDI
    23.         inc ECX
    24.    
    25.         cmp EAX,0
    26.         jz UnsignedNumberToString__Label_NoDiv
    27.         jmp UnsignedNumberToString__Label_Div
    28.    
    29.     UnsignedNumberToString__Label_NoDiv:
    30.         cmp ECX,1
    31.         jz UnsignedNumberToString__Label_NoBuild
    32.         jmp UnsignedNumberToString__Label_Build
    33.    
    34.     UnsignedNumberToString__Label_Build:
    35.         mov ESI,string1
    36.         mov EDI,string2
    37.         mov EBX,0
    38.        
    39.         UnsignedNumberToString__Label_Build_Copy:
    40.             mov EDX,ECX
    41.             sub EDX,EBX
    42.             sub EDX,1
    43.            
    44.             add ESI,EBX
    45.             add EDI,EDX
    46.            
    47.             mov AL,byte [ESI]
    48.             mov [EDI],byte AL
    49.            
    50.             inc EBX
    51.  
    52.         cmp ECX,EBX
    53.         jz UnsignedNumberToString__Label_BuildComplete
    54.         jmp UnsignedNumberToString__Label_Build_Copy
    55.    
    56.     UnsignedNumberToString__Label_BuildComplete:
    57.         mov EDI,string2
    58.         jmp UnsignedNumberToString__Label_End
    59.    
    60.     UnsignedNumberToString__Label_NoBuild:
    61.         mov EDI,string1
    62.    
    63.     UnsignedNumberToString__Label_End:
    64. ret
    65. ; -------------------------------------------------------}
    66.  
    67. ; ********************************************************
    68. ;                     Д А Н Н Ы Е
    69. ; ********************************************************
    70.  
    71. UnsignedNumberToString__Data:
    72.     string1 db 0,0,0,0,0,0,0,0,0,0,0
    73.     string2 db 0,0,0,0,0,0,0,0,0,0,0
     
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    s3dworld
    Ну вообще да, для вашей задачи эта функция подойдет. Но зачем вам определение адресов ОЗУ . У этой функции куча ограничений. И мало того - многие адреса и так уже известно для чего используются. Так что, я считаю есть смысл использовать ее для получение объема ОЗУ, для других целей - она не имеет смысла. Вы почитайте в той статье раздел "При использовании функции E820h прерывания INT 15h следует учитывать следующие соглашения и ограничения:".

    Вы сами определяете соответствие линейных адресов с физическими - для этого вы составляете катало и таблицы страниц. И еще раз гляньте на схему формирования линейного адреса в манах интела - очень полезно.
    И вообще - вы кончайте теоретизировать. Займитесь практикой.

    На счет перевода символов - кончайте это извращение с делением. Сделайте таблицу и по ней индексируйте. Допустим по индексу 0 у вас будет храниться символ "0", и так вам нужно всего-то 10 ячеек .
    Это просто один из вариантов. И никаких делений и сложений. Просто выборка и копирование символа.
     
  20. s3dworld

    s3dworld Сергей

    Blog Posts:
    0
    Joined:
    Mar 16, 2010
    Messages:
    387
    Location:
    Ртищево
    TermoSINteZ
    И как же мне тогда выявить адреса оперативной памяти (ОЗУ)? Должен же я знать что у меня является оперативной памятью (ОЗУ).

    Да даже если через таблицу, это только избавляет от сложения (что не так существенно). А узнать циферку всё равно без деления не получится. Но не пойму, почему у меня там ошибка?