Обычно ли компиляторы (например, 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