2014-05-01 5 views
0

Привет, я искал онлайн по всему миру, и моя книга просто не объясняет, как работают инструкции по загрузке сборки Sparc.сборка и сборка sparc Загрузка и хранение

ldsb - load signed byte 
ldub - load unsigned byte 
ldsh - load signed half word 
Lduh - load unsigned half word 
Ld - load word 
Ldd - load double 

Я также знаю байт составляет 8 бит, и это 2 шестнадцатеричных цифр, половина составляет 16 бит, и слова составляет 32 бита.

Так что, глядя на этот пример с приведенными ниже решениями, кто-то может объяснить, как прийти, чтобы ответить на этот вопрос. Первый столбец Адрес (десятичный) и второй столбец данных (шестнадцатеричный)

300. 78 
301. 56 
302. 34 
303. 12 
304. 9a 
305. 00 
306. 'H' 
307. 'e' 
308. 'l' 
309. 'l' 
310. 'o' 


Ex. ld[%o1], %o0 %o1 = 0x12345678 
Ex2. Ldub[%o0+7], %o2 %o2 = 'e' 
Ex3. Ldsh[%o0+3], %o3 Error 
Ex4. Ldsh[%o0+4], %o4 %o4 = 0x9a 
Ex5. Ldsb[%o0+4], %o5 %o5 = ffffff9a 

мне просто нужно помочь объяснить, почему так я могу понять эту концепцию. Спасибо

ответ

2

Если ваша книга действительно не объясняет это, возможно, вам стоит искать другие ресурсы, такие как Руководство по архитектуре SPARC.

Чтобы достичь результатов, приведенных в вопросе требует несколько предположений, которые не были упомянуты в вашем вопросе: первое, что значение o0 является 300, а второй является то, что доступ к данным осуществляется в little-endian byte order.

Пример 1: должен быть очевиден (за исключением того, что он содержит опечатку, скорее всего, он должен читать ld [%o0], %o1): четыре байта 0x78, 0x56, 0x34, 0x12 загружаются в o1. В малогабаритной схеме наименьший значащий байт расположен на самом низком адресе и наиболее значимом байте с наивысшим адресом, поэтому эти четыре байта становятся 0x12345678.

Пример 2: Байт по адресу 307 (то есть 'e') имеет нулевое расширение (три наиболее значимых байта очищаются) и помещается в o2.

Пример 3: Данные должны быть выровнены по их естественным границам. Адрес 303 не выровнен по полусловам, поэтому результатом может быть ловушка memory_address_not_aligned.

Пример 4: полуслова 0x009a является sign-extended в 0x0000009a (15 бит копируется во все 16 наиболее значимых битов) и помещают в . Ведущие нули не имеют значения, поэтому 0x0000009a - это то же самое, что и 0x9a.

Пример 5: Байт 0x9a выставляется в 0xffffff9a (бит 7 копируется во все 24 наиболее значимых бита) и помещается в o5.

+0

Я всегда удивляюсь, что порядок байтов для систем Sparc всегда велик. Существуют ли небольшие варианты Endar Sparc (как и MIPS, которые могут быть настроены как маленькие или большие endian)? –

+0

Предположительно SPARC является _bi_-endian (может быть LE или BE), начиная с v9. В последний раз, когда я использовал или написал код для, машина SPARC была почти 10 лет назад, так что функция не то, что я могу вспомнить, используя себя. Было уместно указать, что для ответа на вопрос необходимы определенные предположения. – Michael

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