Forums » Мультиклеточная архитектура »
Обращения к восьмибайтовым целым
Added by paul7 about 8 years ago
Добрый день!
Обнаружил проблему при чтении/записи восьмибайтовых целых в памяти.
После выполнения на R1 следующего фрагмента программы вижу и в num1, и в num2 0x55667788, т.е. старшие 32 бита потеряны. Насколько могу судить, ни под одну из описанных в errata ошибок это поведение не попадает. Я что-то упускаю из виду?
.data .align 8 num: .quad 0x1122334455667788 num1: .quad 0 num2: .quad 0 .text test.1: jmp test.2 setl #8, num complete test.2: jmp test.3 rdq num wrq @1,num1 rdq #8 wrq @1,num2 complete test.3:
Replies (2)
RE: Обращения к восьмибайтовым целым - Added by y.chemodanov about 8 years ago
Добрый день,
Обращаю ваше внимание на то, что команды rdq и wrq корректно работают только на диапазоне адресов [0x40000,0x80000) что соответствует внутренней памяти данных на кристалле. Внутри памяти программ [0x00000,0x40000) 64-битные обращения к памяти недоступны, к внешней памяти корректны только 32-битные обращения. Передайте компилятору опцию -M при сборке для того, чтобы проконтролировать в каком биапазоне адресов размещены метки num и num1.
Кроме того, возможно вы неверно интерпретируете наблюдаемые данные. Наша память litle-endian, т.е. при условии корректного размещения данных в памяти, физически память будет выглядеть следующим образом:
[num] : 88 77 66 55 44 33 22 11
[num1]: 88 77 66 55 44 33 22 11
[num2]: 88 77 66 55 44 33 22 11
То есть при 32 битном обращении к памяти по метке num1 (rdl num1) вы действительно получите 0x55667788. Попробуйте прочитать память по метке num1+4, возможно вы обнаружите там 0x11223344.
RE: Обращения к восьмибайтовым целым - Added by paul7 about 8 years ago
Спасибо за ответ. Именно нюанс с памятью программ и данных я и упустил. С little endian все понятно, т.е. я ожидал не 0x11223344, а 0x1122334455667788, в num1 и num2 проверял оба слова.