· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› 2 вопроса по низкому уровню ;)

Посл.отвђт Сообщен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