|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Мар 23, 2004 11:20:19 1. Почему сегменты обязательно должны быть выровнены по границе параграфа? Что это дает? 2. Зачем процессор записывает данные в память наоборот? Например, зачем слово записывать меняя местами байты, а при чтении производить обратную операцию? Какие удобства для камня это предоставляет? Спасибо. |
|
|
Дата: Мар 23, 2004 12:36:39 D1g174LM4n14c 1) Что имелось ввиду понятно. Но выраженно абсолютно не правильно. Где вы встретили эту фразу "сегменты обязательно должны быть выровнены по границе параграфа" 2) Это к спецам по устройству процессоров |
|
|
Дата: Мар 23, 2004 13:01:31 · Поправил: Valery D1g174LM4n14c Все просто, Ватсон: это спарк:)) |
|
|
Дата: Мар 23, 2004 13:22:19 D1g174LM4n14c 2) Потому как, когда то давным давно, процессоры не обладали теми объемами памяти, которой обладают сейчас. Сначала хватало для адресации 1 байта. Потом двух..., но второй байт стали записывать после первого, и т.д. вот и появилась такая система |
|
|
Дата: Мар 23, 2004 16:01:25 Меня удивляет, что кто-то на это что-то смог ответить. Я ни одного вопроса не понял. 1 вопрос? Сегменты какие? В реальном режиме? Кому они должны? В процессоре? Они не должны а так просто получается арифметически. Или в ассемблерной программе? 2 вопрос вообще чепуха дремучая. Что за обратный порядок? Кто сказал что они считываются и записываются по разному? Это более старшие разряды по более старшим адресам что-ли обратным порядком называется? Вы не путаете больше-меньше и слева-справа? У адресов нет ни лева ни права ни верха ни низа. Диагоналей тоже нет. |
|
|
Дата: Мар 23, 2004 16:19:48 1) в реальном режиме сегменты надо равнять на длинну пораграфа - требование проца, так как там смещение на четыре бита происходит при формировании физического адресса. В защищенном вроде можно хоть на байт выравнивать, или вообще как винда:) Что это дает - да ничего, просто есть такое слово НАДО! Вообще x86 камни это такая ... и чем дальше тем больше. 2) да и не у всех процев так, у мотороллы кажись как раз наоборот (всмысле не как у интел). А вообще это только человеку не удобно, ему "переворачивать" надо, а камню то как раз пофигу, он их хоть в шахматном порядке:) |
|
|
Дата: Мар 23, 2004 17:20:43 AFAIK, в реальном режиме как раз камень и смещает адрес сегмента на 4 бита учитывая то что он всегда выровнен по параграфу. в реальном режиме сегменты надо равнять на длинну пораграфа - требование проца, так как там смещение на четыре бита происходит при формировании физического адресса Так что это не причина, а следствие. |
|
|
Дата: Мар 23, 2004 17:55:01 Почему бы не ответить было на мои уточняющие вопросы? Тогда тебе же легче было понять ответы :/ Делаю вывод: ты ответить на мои вопросы не можешь. В твоём вопросе содержится уже утверждение, причём высказанное нечленораздельно, а именно: сегменты обязательно должны быть выровнены по границе параграфа Представь себе как можно было бы ответить на вопрос: "почему все славяне такие козлы?" Если бы кто вдруг решил ответить тебе, у него возник бы резонный вопрос "какие они козлы?" и следующий вопрос "кто сказал что они такие козлы?" слова "должны быть выровнены" - абсолютно непонятны, либо у тебя отсутвуют знания как образуются адреса либо ты свой вопрос неправильно поставил. Это всё равно что спрашивать почему два + два должно быть четыре. Давай сначала определим про какие сегменты ты говоришь. И что там выровнено. Ты своим игнорированием вопросов вызванных желанием тебе же и ответить, заставляешь меня гадать. Это хреновый стиль ведения беседы. Допустим ты имеешь ввиду что начальный адрес сегмента, Т.е. SEG:0 должен быть выравнен на начало параграфа. Если в защищённом режиме - они могут и не быть выровнены если страничная адресация не включена. Далее если в 20и битном режиме. Если речь идёт об адресе DS:0000 или другой сег.рег.:0000 То слово "должны" тут неуместно. Он получается арифметически выровнен. Что тут понимается под словом "выровнен" - начальный адрес (т.е. по смещению от начала сегмента 0) кратен 16и. Поскольку результирующий 20и битный адрес = ИндексСегмента*16+смещение mod 2^20. То при смещении 0 он равен ИндексСегмента*16+0=ИндексСегмента*16. Поскольку индекс сегмента целое число то умножив любое целое число на 16 получим число кратное 16и. Подставь в голове вместо слова "параграф" - "16" и всё. Это одно и то же. Чем это плохо то? Или тебя смущает что размер сегмента в досовской программе должен быть тоже кратен 16и? Это тоже легко объясняется, только чуть подлинее. Короче, ладно, я и так уже через чур долго пытался понять, что спрашивают при полной пассивности спрашивающего. Кстати смещается не адрес сегмента а индекс сегмента, это две большие разницы как говорят в Одессе. Адрес начала сегмента и получается как индекс смещённый (экспонированный) на 2^4. И это причина а не следствие. Это адрес такой получается выровнен потому что процессор так считает, а не процессор так считает чтобы выровнять адрес. Причину со следствием тут явно попутал. |
|
|
Дата: Мар 23, 2004 18:27:14 Извини что не ответил на твой вопрос... замешкался... А вот за последний ответ - спасибо! Но вот еще не до конца я понял почему ИндексСегмента*16+смещение mod 2^20??? Зчем индекс сегмента умножать на 16 и еще mod 2^20? Спасибо заранее. |
|
|
Дата: Мар 23, 2004 18:49:34 D1g174LM4n14c 2. big endian vs. little endian. У ARM как раз наоборот. |
|
|
Дата: Мар 23, 2004 21:24:36 D1g174LM4n14c Ну раз тут все такие серьезные, то и я внесу свой небольшой вклад:)) Выгоды от big endian никакой, большое эндианство поддерживается рисками только для совместимости с некоторыми юниксами (не линуксами!) При этом эндианство данных и регистрового стека можно менять, а у кода оно фиксировано. |
|
|
Дата: Мар 23, 2004 22:23:21 Шина была адресная 20и разрядная а регистры 16и разрядные, нужно было как-то найти способ сформировать адреса до 20и разрядов. Вот и выбрано было решение делать это двумя регистрами, один представлял собой одно слогаемое хранящее колличество двоек в 4ой (сегментный регистр) а второе слогаемое 16и разрядное хранило единицы и специфицировалось в машинном коде по определённым правилам. На второй вопрос "почему по модулю 2^20" - так всё сложение происходит по модулю 2^колличества разрядов. Модуль определяет число с которого у результата будет записываться только остаток от деления на это число. Можно ещё логически представлять, что будут записываться та часть которая "влезет" в разрядную сетку с младших разрядов до последнего возможного старшего. Последний сегмент который полностью "влезает" будет F000 поскольку сам он будет представлять число F0000 и при сложении от 0000 до FFFF с ним переполнения не будет. F001 уже вызовет переполнение начиная с оффсета FFF0 поэтому F001:FFF0 даст результат 00000h а не 100000h F001:FFF1 даст 00001 и так далее. Интел называет "заворачивание адреса". Видимо они вообще там боятся использовать математические термины. Это очевидно просто модульное сложение. Как XOR например, сложение по модулю 2. В схемах рисуется как + в кружочке и рядом с кружочком обычно пишется степень двойки. Если указания нет - то имеется ввиду по модулю 2а. Пришло из схемотехники. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066 |