2013-05-19 4 views
1

Рассмотрим систему с байтовой адресной памятью, организованную в 32-битных словах в соответствии с схемой big-endian. Программа считывает символы ASCII, вводимые с клавиатуры, и сохраняет их в последовательных байтовых местоположениях, начиная с местоположения 1000.Little Endian - Содержание/адрес памяти

Показывает содержимое двух слов памяти в местах 1000 и 1004 после ввода имени johnson. Напишите это в схеме маленького конца.

Что я получил:

[NULL, п], [O, S], [п, ч], [о, J] 00, 6E 6F, 73 6E, 68 6F, 6А

Я просто хочу знать, правильно ли это, а если нет, то что я сделал не так.

Спасибо всем!

+0

Ответ Игнасио Васкеса-Абрамса правильный, но только комментарий к вашему предварительному ответу: если ваша машина имеет 32-битные слова, вы должны «упаковывать» 4 символа в слово, а не два, как кажется, вы делаете с вашими обозначениями. Правильный ответ должен быть [6a, 6f, 68,6e], [73,6f, 6e, 00]. Похоже, может быть, это трюк, потому что я думаю, что многие люди могут изменить порядок байтов в двух словах, когда увидит «маленькую сущность» в проблеме. –

+0

Эй, Рэй! Большое спасибо за ваш комментарий. Я был в замешательстве, потому что увидел, что у Endian есть самый значительный байт с наименьшим байтовым адресом и наоборот для Little Endian. Означает ли это, что оба ответа с маленьким концом/большим концом совпадают? Для большого Endian я получил: характер: Джонсон [NULL] содержания в шестнадцатеричном: 6A, 6F, 68, 6E, 73, 6F, 6E, 00 байт адреса: 1000, 1001, 1002, 1003, 1004, 1005 , 1006, 1007 Маленький сущ.: –

+0

Дело в том, что утверждение относится к словам или размерам большего размера, а не к размерам байтов. Поэтому, если бы я захотел сохранить значение 7 по адресу 1000 и значение 260 (это 104 в шестнадцатеричном формате) по адресу 1004, то в _литом endian_ два слова будут иметь значение 07000000 и 04010000, но в случае с большим концом мы будем иметь 00000007 и 00000104 Таким образом, вы видите только разницу для многобайтовых величин. Символы ASCII кодируются по одному байту, поэтому они выглядят одинаково в любом случае. Тоже для таких вещей, как UTF-8, которые явно используют куски размером _byte. –

ответ

1

Для хранения одного байта (например, символа ASCII) нет таких элементов, как endianes. Endianes вступает в игру только тогда, когда значение представлено в виде нескольких байтов. Так, например, сохранение последовательности байтов одинаково для маленьких и больших чисел, только представление байтов отличается. Возьмем, например, число 3 735 928 559 (или 0xDEADBEEF в шестнадцатеричном виде) и хранить, что в 32-битное слово (например, INT) в ячейке памяти 1000 даст:

ADR: 1000 1001 1002 1004 
BE: de ad be ef 
LE: ef be ad de 

Итак, если вы должны были фактически представлять ваш символ ASCII в виде 32-битного слова, которое вы получите:

[0, 0, 0, 6a], [0, 0, 0, 6f], ... or, 
[6a, 0, 0, 0], [6f, 0, 0, 0], ... 

для BE и LE соответственно.

0

Я нахожу этот вопрос довольно запутанным.

byte обычно определяется как наименьшее адресуемое устройство, поэтому, говоря, что у машины есть байт-адресуемая память, просто ничего не говорится: каждая машина имеет байтовую адресную память, потому что это определение того, что такое байт, что может измениться, сколько бит - это байт.

Если речь идет о 32-разрядной байт-машине (я знаю, что они существуют, но я лично использовал только машины с 8-битными и 16-разрядными байтами), тогда неясно, какую роль играет конечная информация что для хранения ASCII не требуется многобайтовой обработки. Что часто делается на больших байт-машинах, однако, хранение нескольких символов на байт для экономии места (не обязательно, что 16-разрядная байт-машина «большая»: тот, который я знаю, является DSP с очень ограниченным объемом памяти), но это кажется не связанным с вопросом, и там так «стандартный» способ сделать это в любом случае.

Если вместо этого вопрос предполагает, что байт всегда по 8 бит по определению и говорит о сохранении символов ASCII, то снова endian-ness не играет никакой роли; символы просто хранятся в памяти один за другим в последовательных местах. Например, если строка "johnson" была сохранена (в предположении С строковое конвенции) содержание памяти будет:

0x6A 0x6F 0x68 0x6E 0x73 0x6F 0x6E 0x00 

Чтение этого содержимого памяти в виде двух 32-битовых слов будут затронуты порядок байтов, конечно, но говоря, что машина использует big-endian и просят отобразить результат в little-endian схеме, это вздор.

В схеме большого конца (например, 68k) два 32-разрядных слова будут 0x6A6F686E и 0x736F6E00 в схеме с маленьким концом (например,x86), они будут 0x6E686F6A и 0x006E6F73.

+0

Я тоже думал, что, поскольку я знаю, что ASCII не зависит от сущности, но будут ли символы оставаться в том же положении в байтовом адресе? Я понимаю содержимое в шестнадцатеричном виде и переключатели, сделанные между маленькими endian/big endian, но будут ли персонажи в обеих синтаксических/малоразмерных ситуациях одинаковыми? Например: Большие знаковые символы: J ohnson [null] (так как в общей сложности 8 адресов от 1000-1007) Маленькие символы конца: J ohnson [null] В основном то, что я прошу, это если символы оставаться в том же положении в байтовом адресе, или если они затронуты. –

+0

@DavisApanasova: endian-ness - это многобайт, то есть о том, как хранить атомарные значения, которые слишком велики, чтобы вписаться в один байт, а два стандартных варианта - это наиболее важные биты сначала (по-биндиански) или наименее важные биты (мало- обратный порядок байт). Это не влияет на то, как машина сохраняет значения, которые вписываются в байты. Строки обрабатываются по одному символу за раз, и сохранение строки ASCII не зависит от сущности. – 6502

+0

Хорошо, так что это тот же порядок символов, но переключатель между содержимым в шестнадцатеричном формате между ними. Спасибо 6502 !! –

Смежные вопросы