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