Обычно существует нулевая связь между порядком байтов в слове и тем, в каком порядке вы обращаетесь к словам. Аргументация / выгода / и т.д., которая мотивирует выбор порядков в слове, вообще не относится к тому, как вы индексируете массивы.
Например, 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, который, конечно, должен уметь и то, и другое поддерживать эффективную целочисленную математику.)