빈 메모리 요소를 레지스터에로드하는 명령어를 생성하는 것이 컴파일러 (예 : gcc)에서 일반적입니까? 마찬가지로 ... lw, 0 (sp) 여기서 memory [sp + 0] = 0. 기본적으로 0은 $ at ($ R1.)에 저장됩니다. 실행 파일의 16 진 덤프 (실행 파일 C++ 파일을 컴파일 한 결과입니다.) 수동으로 확인 중이며 objdump 상태 진입 점에서 시작하면이 작업을 수행하는 명령이 실행됩니다. 나는 그것이 일반적인 컴파일러 동작이라면 이것이 에러가되도록해야하는지 확신 할 수 없다. 그것은 레지스터를 0으로 만드는 나쁜 방법처럼 보입니다. ADDU $ at, $ 0, $ 0은 더 좋을 것입니다. 또는 SLL $ at, $ 0, $ 0 ..간단한 MIPS 명령어와 컴파일러
엔트리 포인트는 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
필자는 MIPS에 익숙하지 않지만 스택에서 값을로드하고 있습니다. 아마도 함수 인수 일 수 있습니다. 프로그램 입력 지점 인 경우 명령 줄 인수를 제공하기 위해 런타임에서 제공 될 수도 있습니다. 이 값은 런타임까지 알 수 없기 때문에 컴파일러는 이것이 0이라고 가정 할 수 없습니다. –
저는 런타임 동안이 명령에 대해 실제로 말하고 있습니다. 의미 이것은 프로그램 엔트리 포인트 다음에 10이나 어떤 것을 지시 할 것이고로드되기 전의 메모리 요소를 할당하기 전에이 명령이 없다. 이것은 고의적 인 (적절하게 적용되지 않은) nop이거나 실행 파일의 한 부분이 .text 섹션 앞에로드되어야한다고 알려줍니다. –
컨텍스트를 추가 할 수 있습니까? 아마도 5 ~ 10 개의 지침을 전후에 붙여 넣을 수 있습니까? – bstpierre