Понимание структуры памяти 4-байтового целого - PullRequest
0 голосов
/ 08 декабря 2011

Я работаю с архитектурой MIPS (не уверен, что это актуально, так как мы имеем дело с памятью).

Мне сказали, что 32-разрядное целое число находится в памяти по физическому адресу 0x00A0CE48.
Я полагаю, что это число 00000000111111110000000011111111.

Система с байтовой адресацией, какое значение будетпо адресу памяти 0x00A0?

Я не был уверен, были ли первые 8 битов по адресу 0x00, следующие 8 битов по 0x00A0, следующие 8 битов по 0x00A0CE и последние 8 битов по 0x00A0CE48?Я спрашиваю, потому что я должен манипулировать значением в 0x00A0, но я не уверен, что там есть.

Часть проблемы заключается в том, чтобы сначала предположить, что используется big endian, а затем little endian.

32-разрядное целое число находится в памяти по физическому адресу 0x00A0CE48.Биты в 32-битном слове пронумерованы от 0 до 31 от младшего значащего до старшего значащего бита.Приведенный ниже код извлекает один бит из этого 32-разрядного шаблона и помещает этот бит в $ t4.

lui    $t0,0x00A0
ori    $t0,$t0,0xCE48
lbu    $t4,2($t0)
srl    $t4,$t4,5
andi   $t4,$t4,1 

Следующий вопрос в моем назначении - указать номер бита (от 0 до 31) в пределах32-разрядное слово, оставляемое в $ t4, если используется порядок памяти с прямым или обратным порядком байтов.

1 Ответ

2 голосов
/ 08 декабря 2011

В системе с прямым порядком байтов старший значащий байт сохраняется первым. Таким образом, предполагая, что значение 0x12345678, 0x12 будет сохранено по адресу 0x00A0CE48, 0x34 будет сохранено по адресу 0x00A0CE49, 0x56 будет сохранено по адресу 0x00A0CE4A, а 0x78 будет сохранено по адресу 0x00A0CE4B.

С другой стороны, в системе с прямым порядком байтов младший байт будет сохранен первым. Таким образом, 0x78 будет храниться в 0x00A0CE48 и т. Д.

Обратите внимание, что если 32-разрядное слово хранится по адресу 0x00A0CE48, следующее слово будет через четыре байта по адресу 0x00A0CE4C. Арифметика должна выполняться по адресу в целом. Вы не можете рассматривать байты, составляющие адрес отдельно при чтении из памяти.

В сборке, которую вы опубликовали, lui (что означает «загрузить верхний немедленный») сместит непосредственное значение на 16 бит влево и сохранит его в $ t0. После этой инструкции значение в $ t0 будет 0x00A00000. Следующая инструкция будет ИЛИ содержимое $ t0 с 0xCE48 и сохранит результаты в $ t0. После этого $ t0 будет содержать ваш полный адрес, 0x00A0CE48.

...