физический адрес в реальном режиме

Тема в разделе "WASM.BEGINNERS", создана пользователем asm, 28 сен 2007.

  1. asm

    asm New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    6
    Всем привет! заранее прошу прощения за возможный флуд.Вопрос такой:
    читаю Юрова там написано что при формировании физического адреса 16-ти битный адрес сегмента умножается на Ah и к нему прибавляется 16-ти битный адрес смещения в сегменте. короче:
    XXXXXXXXXXXXXXXX0000+
    YYYYYYYYYYYYYYYY
    ---------------------------
    ?????????????????????YYYY
    как тогда сегмент и смещение восстанавливаются обратно? ведь на месте "...???..." получается, простите, "каша" точно можно восстановить только те самые 4 бита YYYY смещения остальные цифры "испорчены". что если
    11111111111111110000 segment
    0000000000010000 offset
    -------------------------
    (1)00000000000000000000 (вообще непонятно что получилось.1 потеряна)
    искал в инэте инфу на эту тему но там все тоже непонятно.Объясните пожалуйста.
    заранее спасибо
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    обратное преобразование не единозначно. так как и разложение числа на слагаемые
    5=3+2
    5=4+1
     
  3. asm

    asm New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    6
    я до этого догадывался просто я не понимаю смысла существования этой "неправильной" системы. Ведь если преобразование неоднозночно то и программа при первой же инструкции
    использующей адреса в 99% случаев должна совершить ошибку.но тот факт что этот режим реально существует и используется(использовался) а значет работает наталкивает меня на мысль что должен сущесвовать некий механизм позволяющий хотя-бы снизить вероятность ошибки
    (боюсь двигаться дальше вглубь ассемблера пока пока не пойму эту "элементарную" вещь)
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    нормальная система :) сегмент указывает номер параграфа. смещение - номер байта относительна начала этого параграфа. все довольно прозрачно. даже есть выбор, можно использовать 0001:0010 или 0002:0000 :)
     
  5. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    asm
    Просто в реальном режиме 0000:0136 и 0010:0036, и 0003:0106, и 0013:0006 - это все один и тот же адрес, без разницы, какой сегмент и смещение. Физический 00136, и все.

    А верхние 64 К (UMB), это как раз для случая с потерянной единицей. Сначала открывают 20-ю линию адресации, чтоб адрес учитывался 21-битный, потом используют. Когда в ДОС himem.sys запускается, он как раз, в том числе, открывает эту возможность. И получается, что можно адресовать чуть больше 1М в реальном режиме...
     
  6. asm

    asm New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    6
    благодарю. и последний вопрос
    в книге есть схема согласно которой смещение может браться из нескольких источников.
    немогу понять зачем одно число складывать несколько раз с самим собой
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кхм кхм это как
     
  8. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    типа из регистра или пары регистров (когда mov eax,[ebx+edx]) :)
     
  9. asm

    asm New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    6
    нет там на схеме показано, что в пределах АЛУ происходит суммирование (смещение из команды)+(базовый регистр bx или bp)+(индексный регистр si или di)=эффективный адрес
    немогу понять смысла суммирования
     
  10. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    например есть двумерный массив. адрес начала массива задается смещением, смещение строки относительно начала массива регистром ВХ, смещение эл-нта масива от начала строки регистром SI. тогда если массив из байтов с размерностью 5х5, то доступ к элементу (2,3) будет осуществелен как
    mov bx,2*5
    mov si,3
    mov al,byte[address_massiva+bx+si]
     
  11. asm

    asm New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    6
    еще вопросы
    ну допустим машина интерпретирует тот-же адрес 00136 как 0000:0136, 0010:0036, 0003:0106, и 0013:0006, программа обращается по адресу 0003:0106 а машина обратится, например, к сегменту 0000(про смещение говорить уже не имеет смысла) при обратном преобразовании, тогда выйдет ошибка? что если программа в разных местах кода обращается к совершенно разным сегментам и смещениям например 0000:0136 и 0010:0036(а значит к разным адресам) а машина перепутает их?
    (все-таки до меня что-то не доходит)
     
  12. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    А зачем тебе обратное преобразование??? Ты задаешь при обращении к памяти сегмент и смещение, все. Традиционно стараются задать сегмент так, чтобы к массивам (к первому элементу) обращаться с 0-м смещением. Если нужны нижние 64К, где векторы прерываний и служебные переменные, то наоборот, легче задать 0-й сегмент. Если используются какие-то данные, которые ты сам и задал - в сегменте кода или данных - ты на самом деле даже не подозреваешь, каково значение сегмента! Просто загружаешь в ds некоторое значение (например, из ах или cs).

    Машина ничего не перепутает - потому что это один и тот же адрес! Если ты занесешь по 0000:0136 число 10, то это же самое число ты прочитаешь из 0010:0036 :))))))) Сегменты перекрываются. В реальном режиме, для большинства адресов есть громадное количество вариантов сегмент-смещение, кроме самых нижних и самых верних адресов:
    0000:1152
    0001:1142
    0002:1132
    ...
    0010:1052
    ...
    0100:0152
    ...
    0115:0002

    и все они указывают на один и тот же адрес :))
     
  13. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Сегмент умножается не на 0Ah, а на 16 = 10h.
     
  14. asm

    asm New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    6
    пасибо вам! Вот щас дzействительно всё понял