Сборка MIPS - lui $ t0, 4097? - PullRequest
       5

Сборка MIPS - lui $ t0, 4097?

5 голосов
/ 05 декабря 2011

Может кто-нибудь объяснить мне, как работает lui, что означает "4097", что означает добавление 8 к $t0?

.data        0x10010000
    blank:   .asciiz " "  # 4097
    newline: .asciiz "\n" # 4097 + 2

    #input_start
    Alength: .word 13
    Aarray:  .word 130, 202, 30, 4440, 530, 532, 33, 204, 8, 524, 8933, 92, 10
    #input_end

.text
    lui $t0, 4097
    ori $a0, $t0, 8  # address of A[]
    lw  $a1, 4($t0)  # load length

Ответы [ 3 ]

15 голосов
/ 05 декабря 2011

4097 = 1001 шестнадцатеричный

Итак, первая инструкция помещает 0x10010000 в регистр t0.lui - это «загрузить верхний немедленный», где «верхний» означает старшие 16 бит, а «непосредственный» означает, что вы задаете ему буквальное значение (4097).4097 в качестве «верхнего» значения становится 0x10010000.

ori - «или немедленное», где 8 - непосредственное значение, поэтому результирующий адрес в a0 равен 0x10010008, то есть адресу, где живет Aarray.

Последней инструкцией lw является «слово загрузки», которое загружается с адреса памяти в t0 (который на данный момент все еще равен 0x10010000) плюс 4 байта (4 - это смещение от t0 и приводит к адресу, на котором живет ALength)4 байта данных в a1.

7 голосов
/ 05 декабря 2011

lui $ t0, 4097 - немедленная инструкция загрузки сверху. Непосредственное значение (4097) сдвигается влево на 16 бит и сохраняется в регистре $ t0. Младшие 16 бит являются нулями.

0 голосов
/ 05 июля 2019

Это «делает это вручную» для генерации статических адресов, как обходной путь для ассемблера MARS, которому не хватает %hi(symbol) и %lo(symbol), чтобы заставить компоновщик заполнить 4097 (0x1001) из старшей половиныадреса Alength и Aarray, а также 4 и 8 из нижней половины этих адресов.

Этот код предполагает, что MARS поместит секцию .data в 0x10010000, как этоговорит в строке с директивой .data.

Две строки суммируют до 4 байтов, поэтому значения слов уже выровнены по словам.Этот код пропускает директиву .align, даже если бы он заканчивался нулевыми байтами (пока вы не добавите еще одну строку и ваше слово не прервется).


Если вы скомпилируете этот C в проводнике компилятора Godbolt :

int x = 1;               // with no initializer it goes in the .bss as  .space 4
int foo() { return x; }

MIPS gcc5.4 -O3 дает вам этот ассм (некоторый шум убирается):

foo():
    lui     $2,%hi(x)
    lw      $2,%lo(x)($2)
    j       $31
    nop              # IDK why it didn't put the load in the branch-delay slot; clang does

 .data
 .p2align 2          # actually gcc uses .align 2 but I disambiguated
x:
    .word   1

$2 is $v0, возвращаемое значение в стандартном соглашении о вызовах MIPS.

...