Обращения к восьмибайтовым целым

Added by paul7 almost 3 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 almost 3 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 almost 3 years ago

Спасибо за ответ. Именно нюанс с памятью программ и данных я и упустил. С little endian все понятно, т.е. я ожидал не 0x11223344, а 0x1122334455667788, в num1 и num2 проверял оба слова.

(1-2/2)