참고자료 : 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로
바꾸어주는게 아닐까 싶다.
'Assembly > 공개글' 카테고리의 다른 글
MIPS 어셈블리 <-> 기계어 mapping table (0) | 2015.08.03 |
---|---|
MIPS pseudo instruction (0) | 2015.08.03 |
x86/gcc에서 relative jump 사용하는법 (0) | 2015.02.08 |
intel 문법과 AT&T 문법에서 주소 참조 차이 (1) | 2015.01.07 |
어셈블리어는 unsigned/signed를 구분해서 처리한다. (0) | 2014.07.30 |