Простые инструкции MIPS и компиляторы - PullRequest
2 голосов
/ 20 июля 2010

Обычно ли компиляторы (например, gcc) генерируют инструкцию, которая загружает какой-то пустой элемент памяти в регистр? Например ... lw at, 0 (sp), где memory [sp + 0] = 0. Это просто помещает 0 в $ at ($ R1.) Я спрашиваю, потому что я просматриваю шестнадцатеричный дамп исполняемого файла (исполняемый файл). является результатом компиляции файла c ++), и я проверяю его вручную, и если я начинаю с точки входа в состояние 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

Цель Джал - 4010c0.

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

Ответы [ 2 ]

0 голосов
/ 24 октября 2010

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

0 голосов
/ 20 июля 2010

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

...