2016-11-18 13 views
0

Из того, что я могу понять, существует несогласованность с контентом в сборке MIPS при запуске на QtSpim (без машины x86_64, что означает, что QtSpim является малоподобным). Однако я не уверен, что это ошибка, или если я ошибаюсь.Несоответствие Little-endian MIPS

Когда слово загружается в регистр, байты не меняются на противоположные, чтобы отражать малозначность. Например, если слово в памяти содержит 0x11223344, и мы загружаем его в регистр, получаем 0x11223344 (я бы ожидал 0x44332211).

Рассмотрим следующий фрагмент кода:

.text 
    .globl main 
main: 
    la $t0, letters 
    lw $t1, 0($t0) # Expected ($t1): 0x61626364 
    sll $t2, $t1, 8 # Expected ($t2): 0x62636400 
    sw $t2, 0($t0) # Expected (mem): 0x00646362 
    jr $ra 

    .data 
letters: 
    .ascii "abcd" 

Перед запуском программы "ABCD" хранится прямой порядок байтов, как и ожидалось: 0x64636261 (ДХБС). После завершения программы я ожидал бы, что 0x00646362 (\ 0dbc) будет сохранен в памяти, однако 0x63626100 (cba \ 0) сохраняется.

Почему это так?

Протестировано на Fedora 24, x86_64, QtSpim версии 9.1.17.

ответ

1

Нет противоречия. Вы принимаете 0x64636261 и сдвигаете его на 8 бит влево (т. Е. Сдвигайте биты влево при смещении в нулях справа). Таким образом, 0x64636261 становится 0x63626100
Если вы хотите 0x00646362, вы должны были использовать srl вместо sll.

Вот ASCII диаграмма, показывающая соотношение между 32-разрядным словом и отдельными байтами в небольшой обратном порядке байт конфигурации:

0x64636261 
    | | | | 
    | | | ----> |'a'| letters 
    | | |  ----- 
    | | ------> |'b'| letters+1 
    | |   ----- 
    | --------> |'c'| letters+2 
    |   ----- 
    ----------> |'d'| letters+3 
+0

Так как это прямой порядок байты, я хотел бы ожидать мой регистр '$ t1' содержать «0x61626364» после загрузки (байты в обратном порядке) и «0x62636400» после сдвига влево. Когда мы храним его обратно в память, он сохраняется в обратном порядке, что дало бы '0x00646362'. Я делаю какие-то неправильные предположения? – plafer

+0

_ «Я делаю какие-то неправильные предположения?» _. Да. В конфигурации с маленьким концом наименьший значащий байт расположен по наименьшему адресу. Первым символом в 'letter' является' 'a'' (0x61), затем' 'b'' (0x62) и т. Д. Следовательно,' lw' из 'letter' даст вам' 0x64636261'. – Michael

+0

строки @plafer хранятся в последовательном порядке, не зависящие от конкретизации –

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

  • Нет связанных вопросов^_^