Простые инструкции и компиляторы MIPS

Часто ли компиляторы (например, gcc) генерируют инструкцию, которая загружает какой-то пустой элемент памяти в регистр? Например... lw at,0(sp) где memory[sp + 0] = 0. По сути, это просто помещает 0 в $at ($R1). Я спрашиваю, потому что просматриваю шестнадцатеричный дамп исполняемого файла (исполняемый файл является результатом компиляции файла С++), и я проверяю его вручную, и если я начну с точки входа в состояние objdump, я столкнусь с инструкцией, которая делает это. Я не уверен, следует ли считать это ошибкой, если это просто обычное действие компилятора. Это кажется плохим способом обнуления регистра. ADDU $at,$0,$0 было бы лучше. Или SLL $at,$0,$0..

Точка входа — 400890. Целью перехода jal в конце является пустая ячейка памяти (подсказывает мне, что, возможно, что-то не так...) Обратите внимание, что мой предыдущий пример был намеренно арбитрирован.

И просто для ясности, -32636+gp — это пустая ячейка памяти. Я могу опубликовать содержимое памяти, если вам нужны доказательства :).

00400890 <__start>:
  400890:   03e00021    move    zero,ra
  400894:   04110001    bal 40089c <__start+0xc>
  400898:   00000000    nop
  40089c:   3c1c0fc0    lui gp,0xfc0
  4008a0:   279c7864    addiu   gp,gp,30820
  4008a4:   039fe021    addu    gp,gp,ra
  4008a8:   0000f821    move    ra,zero
  4008ac:   8f848034    lw  a0,-32716(gp)
  4008b0:   8fa50000    lw  a1,0(sp)
  4008b4:   27a60004    addiu   a2,sp,4
  4008b8:   2401fff8    li  at,-8
  4008bc:   03a1e824    and sp,sp,at
  4008c0:   27bdffe0    addiu   sp,sp,-32
  4008c4:   8f878054    lw  a3,-32684(gp)
  4008c8:   8f888084    lw  t0,-32636(gp)<------ this instruction
  4008cc:   00000000    nop
  4008d0:   afa80010    sw  t0,16(sp)
  4008d4:   afa20014    sw  v0,20(sp)
  4008d8:   afbd0018    sw  sp,24(sp)
  4008dc:   8f998068    lw  t9,-32664(gp)
  4008e0:   00000000    nop
  4008e4:   0320f809    jalr    t9
  4008e8:   00000000    nop

Цель Jal — 4010c0.

4010c0: 8f998010    lw  t9,-32752(gp)
  4010c4:   03e07821    move    t7,ra
  4010c8:   0320f809    jalr    t9

person Dan Snyder    schedule 19.07.2010    source источник
comment
Я не знаком с MIPS, но, конечно, это загрузка значения из стека - возможно, аргумент функции, возможно, предоставленный средой выполнения для предоставления аргументов командной строки, если это точка входа в программу. Значение не будет известно до времени выполнения, поэтому компилятор не может предположить, что оно равно нулю.   -  person Mike Seymour    schedule 20.07.2010
comment
На самом деле я говорю об этой инструкции во время выполнения. Значение Это будет инструкция 10 или что-то вроде этого после точки входа в программу, и перед ней нет инструкций, которые выделяют загружаемый элемент памяти. Это говорит мне, что либо это преднамеренный (плохо примененный) nop, либо что сегмент исполняемого файла должен быть загружен перед разделом .text.   -  person Dan Snyder    schedule 20.07.2010
comment
Можете ли вы добавить больше контекста? Возможно вставить 5-10 инструкций до и после?   -  person bstpierre    schedule 20.07.2010
comment
Прыжок не на t9, а не на t0? t9 это -32664(gp), а не -32636+gp   -  person Michael Dorgan    schedule 20.07.2010
comment
Вы правы, так что LW не влияет на мои прыжки. Я все еще обеспокоен этим lw, поскольку t9 является целью перехода, который происходит через несколько инструкций после цели jal. Я опубликую это выше.   -  person Dan Snyder    schedule 20.07.2010
comment
Если вы создаете файл карты, что находится в области ниже 0xfc000000? (Не то, что должно быть там, а то, что в файле карты?)   -  person bstpierre    schedule 20.07.2010
comment
Я вручную проверяю. Чувак, я не знаю, какая у тебя работа, но она довольно тяжелая.   -  person Ben Zotto    schedule 20.07.2010
comment
Это загрузочный код ELF или что-то в этом роде? Здесь происходят какие-то сумасшедшие вещи.   -  person mjschultz    schedule 20.07.2010
comment
На самом деле, я пытаюсь сократить процесс связывания и загрузки до максимально простой реализации. По многим причинам я застрял, пытаясь запустить скомпилированную программу C++ hello world на симуляторе процессора mipsI, который я разработал с помощью Verilator. По сути, у меня нет другого способа создать золотой стандарт, поэтому я должен проверять его по ходу дела. Это какое-то сумасшествие... Но теперь я думаю, что привет, мир, как шестнадцатеричная свалка во сне... так что я больше не возражаю.   -  person Dan Snyder    schedule 20.07.2010
comment
Что вы подразумеваете под регионом ниже 0xfc00000000? Это относится к смещению магазина? Карта по умолчанию устанавливает каждый элемент равным 0, как бы. Я проверил, что любая загрузка 0 является статическим элементом (предварительно загруженным 0).   -  person Dan Snyder    schedule 20.07.2010
comment
Я собираюсь загрузить deadbeef в свою память и посмотреть, не испортил ли я просто доступ или что-то в этом роде.   -  person Dan Snyder    schedule 20.07.2010
comment
Итак, слово загрузки загружает deadbeef в мои регистры. Мне действительно нужно найти хорошего эльфа-загрузчика или что-то в этом роде.....   -  person Dan Snyder    schedule 20.07.2010


Ответы (2)


Возможно, он помещается после оператора перехода? Если это так, то этот оператор запускается до того, как произойдет переход, и может быть инструкцией ничего не делать (nop). Кроме того, это может быть просто компилятор с более низкими настройками оптимизации. Другая возможность заключается в том, что компилятор сохраняет поле флагов ЦП. Shift и Add играют с флагами, в то время как загрузка, которой я не верю.

person Michael Dorgan    schedule 19.07.2010
comment
На самом деле он помещается после ADDU, а затем LW. Поскольку у меня отключены задержки загрузки, я почти уверен, что регистру назначения на самом деле должно быть присвоено ненулевое значение. Но это будет означать, что точка входа, определенная readelf и objdump, на самом деле не является первой инструкцией, которую необходимо выполнить. - person Dan Snyder; 20.07.2010
comment
Нужны ли коду флаги из вызова ADDU? Если да, то это может объяснить задание. Кроме того, какой уровень оптимизации вы используете? - person Michael Dorgan; 20.07.2010
comment
03 — это оптимизация, которую я использую. Кроме того, слоты задержки перехода / ветвления заполнены пустыми словами, когда ничего больше туда нельзя поместить, как вы можете видеть из последней показанной инструкции. - person Dan Snyder; 20.07.2010

Это похоже на код CRT. Я думаю, что этот код загружает некоторые параметры, переданные ОС, в регистры $a0 и $a1. Вероятно, в стек передается какая-то более крупная структура, и код загружает эту структуру в правильное расположение в стеке. Этот код, вероятно, не генерируется компилятором C, а кодируется вручную на ассемблере.

person user420783    schedule 24.10.2010