Всем привет! заранее прошу прощения за возможный флуд.Вопрос такой: читаю Юрова там написано что при формировании физического адреса 16-ти битный адрес сегмента умножается на Ah и к нему прибавляется 16-ти битный адрес смещения в сегменте. короче: XXXXXXXXXXXXXXXX0000+ YYYYYYYYYYYYYYYY --------------------------- ?????????????????????YYYY как тогда сегмент и смещение восстанавливаются обратно? ведь на месте "...???..." получается, простите, "каша" точно можно восстановить только те самые 4 бита YYYY смещения остальные цифры "испорчены". что если 11111111111111110000 segment 0000000000010000 offset ------------------------- (1)00000000000000000000 (вообще непонятно что получилось.1 потеряна) искал в инэте инфу на эту тему но там все тоже непонятно.Объясните пожалуйста. заранее спасибо
я до этого догадывался просто я не понимаю смысла существования этой "неправильной" системы. Ведь если преобразование неоднозночно то и программа при первой же инструкции использующей адреса в 99% случаев должна совершить ошибку.но тот факт что этот режим реально существует и используется(использовался) а значет работает наталкивает меня на мысль что должен сущесвовать некий механизм позволяющий хотя-бы снизить вероятность ошибки (боюсь двигаться дальше вглубь ассемблера пока пока не пойму эту "элементарную" вещь)
нормальная система сегмент указывает номер параграфа. смещение - номер байта относительна начала этого параграфа. все довольно прозрачно. даже есть выбор, можно использовать 0001:0010 или 0002:0000
asm Просто в реальном режиме 0000:0136 и 0010:0036, и 0003:0106, и 0013:0006 - это все один и тот же адрес, без разницы, какой сегмент и смещение. Физический 00136, и все. А верхние 64 К (UMB), это как раз для случая с потерянной единицей. Сначала открывают 20-ю линию адресации, чтоб адрес учитывался 21-битный, потом используют. Когда в ДОС himem.sys запускается, он как раз, в том числе, открывает эту возможность. И получается, что можно адресовать чуть больше 1М в реальном режиме...
благодарю. и последний вопрос в книге есть схема согласно которой смещение может браться из нескольких источников. немогу понять зачем одно число складывать несколько раз с самим собой
нет там на схеме показано, что в пределах АЛУ происходит суммирование (смещение из команды)+(базовый регистр bx или bp)+(индексный регистр si или di)=эффективный адрес немогу понять смысла суммирования
например есть двумерный массив. адрес начала массива задается смещением, смещение строки относительно начала массива регистром ВХ, смещение эл-нта масива от начала строки регистром SI. тогда если массив из байтов с размерностью 5х5, то доступ к элементу (2,3) будет осуществелен как mov bx,2*5 mov si,3 mov al,byte[address_massiva+bx+si]
еще вопросы ну допустим машина интерпретирует тот-же адрес 00136 как 0000:0136, 0010:0036, 0003:0106, и 0013:0006, программа обращается по адресу 0003:0106 а машина обратится, например, к сегменту 0000(про смещение говорить уже не имеет смысла) при обратном преобразовании, тогда выйдет ошибка? что если программа в разных местах кода обращается к совершенно разным сегментам и смещениям например 0000:0136 и 0010:0036(а значит к разным адресам) а машина перепутает их? (все-таки до меня что-то не доходит)
А зачем тебе обратное преобразование??? Ты задаешь при обращении к памяти сегмент и смещение, все. Традиционно стараются задать сегмент так, чтобы к массивам (к первому элементу) обращаться с 0-м смещением. Если нужны нижние 64К, где векторы прерываний и служебные переменные, то наоборот, легче задать 0-й сегмент. Если используются какие-то данные, которые ты сам и задал - в сегменте кода или данных - ты на самом деле даже не подозреваешь, каково значение сегмента! Просто загружаешь в ds некоторое значение (например, из ах или cs). Машина ничего не перепутает - потому что это один и тот же адрес! Если ты занесешь по 0000:0136 число 10, то это же самое число ты прочитаешь из 0010:0036 )))))) Сегменты перекрываются. В реальном режиме, для большинства адресов есть громадное количество вариантов сегмент-смещение, кроме самых нижних и самых верних адресов: 0000:1152 0001:1142 0002:1132 ... 0010:1052 ... 0100:0152 ... 0115:0002 и все они указывают на один и тот же адрес )