나는 MIPS의 파이프 라인을 배우고,이 두 명령 그쪽으로 들었다 :왜이 두 개의 밉 명령이 파이프 라인에서 데이터 위험을 초래할 수 있습니까?
jal addr;
store $ra;store the value of $ra into memory
데이터 위험을 야기하지만, 아무도 나를 도와 why.Could 이해가 안 돼요?
나는 MIPS의 파이프 라인을 배우고,이 두 명령 그쪽으로 들었다 :왜이 두 개의 밉 명령이 파이프 라인에서 데이터 위험을 초래할 수 있습니까?
jal addr;
store $ra;store the value of $ra into memory
데이터 위험을 야기하지만, 아무도 나를 도와 why.Could 이해가 안 돼요?
store
이 무엇인지 모르겠지만 MIPS의 모든 정상 분기 및 점프 명령은 바로 다음 명령과 함께 실행됩니다. 대부분의 사소한 경우에 지점/점프가 마지막으로 실행되고 다른 명령은 첫 번째로 실행된다고 생각할 수 있습니다.
그러나 쌍을 이루는 명령어가 내부적으로 두 개의 개별 명령어 대신 하나의 분할 할 수없는 명령어로 실행되면 놀라지 않을 것입니다.
여기서 잠재적 인 문제는 은 store
다음의 명령어 주소를 $ra
에 저장한다는 것입니다. store
또는 무엇이든 지침 인 경우 $ra
을 사용하면 $ra
에 대한 두 액세스 사이에 경쟁 조건, 데이터 위험이있을 수 있으며 최종 결과는 확실하지 않거나 당연히 예상 할 수있는 결과 일 수 있습니다.
MIPS 분기 지연 슬롯의 명령어는 분기가 실행되기 전에 항상 완전히 실행됩니다. 따라서 store $ra
명령어는 의 값이 보다 작고보다 작고 jal
명령어 업데이트는 $ra
입니다. 환언하면,이 서열
li $ra, 0x1234
jal addr
store $ra, mem # mem <- 0x1234
이것은 MIPS 아키텍처에서 정의되지 않은 순서 아니므 결과 예측 :
li $ra, 0x1234
L: jal addr
nop
store $ra, mem # mem <- L + 8
이 순서보다는 메모리에 다른 값을 저장할하겠습니다.
noreorder
이 설정되어 있지 않으면 MIPS 어셈블러는 일반적으로 jal
뒤에 nop
을 삽입합니다.
글쎄 실제 명령어가 아니라 단순화 된 명령어입니다. 스토어는 $ ra의 값을 메모리에 저장하는 것을 의미합니다. – Alaya
메모리 위치가 있어야하므로 메모리 위치는 어떻게됩니까? –
네, 거기에 메모리 위치가 있지만 여기에 덜 중요하게 보인다. 내 생각에 '가게'는 'jal'이 점프하는 서브 루틴이 끝난 후에 만 $ ra를 읽으면 위험 할 수 없어야한다고 생각합니다. 따라서 질문은 "어떤 명령이 뽑힐 것인가? ''상점 '또는'jal '이 점프하는 곳에있는 지침이 될 것인가?" – Alaya