Почему даже компьютеры с прямым порядком байтов читают из более низкой памяти в более высокую?Для big-endianness противоположность может быть более оптимальной - PullRequest
2 голосов
/ 29 сентября 2019

Я прочитал о порядке байтов в вики и попытался найти мой вопрос, обнаружил, что сообщение Влияет ли порядок байтов на то, как элементы структуры хранятся в памяти , где это объясняетсяПорядковый номер не влияет на последовательность элементов структуры в памяти (от низшей к высшей) для C.

Также в вики:

Система с прямым порядком байтов обладает свойством, что одно и то же значение может быть прочитано из памяти с разной длиной без использования разных адресов

но это только в том случае, если мы читаем от малого к большому адресу.

Мне интересно, где (какие архитектуры / языки) используют последовательность памяти от более высокого (чтобы быть понятным: больший адрес) до более низкого?Это будет означать, что big-endianness для таких же преимуществ будет правильно упомянуто в вики, цитированной выше.

Также, например, это может означать, что на языке, подобном C malloc, будет возвращен самый большой адрес, и программа заполнит память, выполнивreceived_address-- не ++ (надеюсь, я ясно дал понять) .

Я не смог найти с помощью веб-поиска, почему разработка компьютеров не пошла по этому пути (читать память от большого к маленькомуадрес) (потому что, если эта фраза в вики верна, она действительно не пошла).

Ответы [ 3 ]

3 голосов
/ 29 сентября 2019

Обычно существует нулевая связь между порядком байтов в слове и тем, в каком порядке вы обращаетесь к словам. Аргументация / выгода / и т.д., которая мотивирует выбор порядков в слове, вообще не относится к тому, как вы индексируете массивы.

Например, Intel изобрела (или, по крайней мере, использовала) переменную порядка байтов, чтобы сделать 8008 более похожим на ЦП с последовательным битовым АЛУ и хранилищем сдвигового регистра, с которым она хотела быть совместимым.( Почему x86 имеет младший порядковый номер? , а также см. https://retrocomputing.stackexchange.com/questions/2008/were-people-building-cpus-out-of-ttl-logic-prior-to-the-4004-8080-and-the-6800/8664#8664 Очевидно, Datapoint хотел, чтобы Intel создала последовательную битовую машину, и сохранение цели перехода в порядке LSB было своего рода сохранениемони счастливы, даже если процессор оказался не последовательным.)

Это, очевидно, не имеет никакого отношения к отдельному доступу к отдельным словам.

"Преимущество", процитированное википедией, больше похоже на«забавный факт», а не то, что действительно чего-то стоит.Изгибать ISA, чтобы получить его, не имеет смысла, когда он делает что-то еще хуже или дороже, или даже труднее людям работать с ним.Только если вы создаете ЦП, который декодирует инструкции по байту за раз или что-то и может перекрывать выборку с декодированием, если декодирование все равно будет многоцикловым (потому что перенос распространяется от младших битов к старшим битам).

Хотя вы могли бы сделать тот же аргумент о создании первого процессора с прямым порядком байтов в первую очередь, когда люди считали, что big-endian является «естественным» в то время.


В предложенном вами дизайне адрес слова будет являться адресом его наименее значимого байта. (я думаю).

Это больше похоже на little-endian с all aboutадресация памяти обратная / перевернутая / отрицательная.

В противном случае это просто соглашение о программном обеспечении, которое возвращает указатель на один конец конца выделения, что, очевидно, менее удобно, поскольку для его использования требуется смещение.Но если вы возвращаете указатель на последнее слово выделения, откуда вы знаете, что вызывающая сторона хотела рассматривать его как слова вместо байтов?malloc возвращает void*.Если вы возвращаете указатель на последний байт выделения, вам нужно выполнить математические вычисления, чтобы получить указатель на последнее слово.

Так что, если вы не выполните обратный-младший-порядковый номер, возвращающий что-либо кромеуказатель на первый (или единственный) байт / слово / doubleword / float / что-либо из выделенного буфера явно хуже , особенно с учетом такого распределителя, как malloc, который не знает размер элемента, на который собирается его вызывающая сторонаиспользуйте для доступа к памяти.


Модель машины C едва совместима с системой с обратным порядком байтов, я думаю .Вы бы хотели, чтобы arr[i] означало *(arr - i) вместо arr + i, а индексированные режимы адресации, вероятно, поддерживали бы - вместо +.Тогда arr[i] может работать прозрачно с malloc, который возвращает указатель на конец.Но C определяет x[y] в терминах *(x+y), и есть код, который заметил бы разницу и разрыв.

В противном случае вы захотите пересчитать отрицательный индекс в направлении от нуля до цикла от низкого довысокие адреса, если адресация все еще работает как обычно?

Если ваш "обычный" вариант использования был for(i=0; i<n ; i++) и доступ к arr[-i], это могло бы работать примерно так же, как на обычной машине.Но затем вам нужно изменить исходный код на C, чтобы это работало на такой машине.

Или, если вы хотите записать циклы типа for(i=0 ; i>=-n ; i--), тогда ваш самый большой индекс станет отрицательным, а ваш размер все еще положительным.Это только кажется намного более запутанным.

(@ Ответ Алексея Мартианова поднимает хороший вопрос: ЦПУ, вероятно, потребуется двоичный вычитатель внутри блоков генерации адресов и в других местах, где обычные ЦП используют сумматор. I думаю, что для вычитателя обычно требуется немного больше оборудования, чем для сумматора. Это находится за пределами основного ALU, который, конечно, должен уметь и то, и другое поддерживать эффективную целочисленную математику.)

2 голосов
/ 29 сентября 2019

Если я понимаю ваш вопрос как «можно ли заставить процессоры и программное обеспечение переходить с наименьшего адреса вниз вместо наименьшего вверх?», Ответ - да.Это сделано так, как это основано на человеческом соглашении, начиная с 0, но есть исключения.

Например, в большинстве систем, таких как Unix, стек программ расширяется сверху вниз, а в Multics - снизу вверхВверх.Идея Multics заключалась в том, что если бы код записывался после конца массива или структуры, он записывал бы в пустое пространство стека и не переписывал бы значения стека, которые были бы по более низкому адресу, тогда как в Unix значения стека по более высоким адресамперезаписывается и приводит к сбою при возврате или разрешении использования безопасности.

Начиная с 0, кажется разумным для более старых систем без отображения памяти, где вы не можете быть уверены, сколько памяти установлено и какова максимальная допустимая памятьадрес.Для систем с отображением памяти не было причин менять это соглашение.

2 голосов
/ 29 сентября 2019

Насколько я знаю, операции сложения легче выполнять с помощью процессора, чем с помощью вычитания, поэтому более эффективно / оптимально переходить от более низкой к более высокой памяти, а не наоборот.

PS Подстановка, как правило, инверсия плюс сложение: Вычитание занимает больше времени, чем сложение в ЦП?

...