참고자료 : http://stackoverflow.com/questions/9548927/mips-jal-confusion-ra-pc4-or-pc8


-----


MIPS 어셈블리 분석할 때..


subroutine1:


jal subroutine2

some instruction1


subroutine2:


jr $ra

some instruction2


MIPS에서는 branch가 수행될 때 branch delay slot에 있는 명령어가 먼저 실행됨. 즉 위의 문장에서 명령어가 실행


되는 순서는 some intsruction1 -> jal subroutine2 -> some instruction2 -> jr $ra 가 됨. subroutine call 이후 


return할 때는 some instruction1이 실행되는 것이 아니고, some instruction1 밑에 있는 인스트럭션이 실행됨. 


즉, jal subroutine2가 실행될 때 PC값은 4가 증가하는 것이 아니고 8이 증가한다.


또한 beqz 라던지 bnez  등등.. subroutine call/return 뿐만 아니라 branch 관련 명령어들도 branch가 적중했을 때


branch 아래에 있는(branch delay slot에 들어있는) 명령어가 먼저 실행된 후, branch 하는 곳으로 넘어감. branch가


적중하지 않았으면 그냥 branch 다음 인스트럭션부터 실행함.


branch 명령어중에서 뒤에 l이 붙은 명령어도 있는데, 이 경우에는 branch가 적중하지 않았을 때 branch 다음에 있는


명령어를 실행하지 않는다.




p.s) RISC architecture중 SPARC, PowerPC, MIPS.. 등이 이러한 방식을 사용한다고 한다.


왜 이렇게 처리하는가 하면.. 기본적으로 파이프라이닝을 이용해 명령어들을 실행하는 과정에서, branch instruction


의 경우라면 파이프에 들어있던 next instruction이 비워져야 하는데, 이는 낭비가 되니까 아예 branch와 무관한, 같이


실행해도 상관없는 인스트럭션을 branch instruction 밑에 넣어놓고 branch instruction을 실행할 때 다음 인스트럭


션을 같이 실행해버리자는 말. branch instruction 다음에 있는 instruction을 비우지 않아도 되는 이점을 가진다.



c코드 혹은 MIPS 어셈블리 코드를 짰을 때 이를 컴파일러 혹은 어셈블러가 아마(?) 이런식으로 executable code로 


바꾸어주는게 아닐까 싶다.




Posted by huammmm1
,