두 종류가 있음. 같으면 라벨로 점프하라는 beq 과 다르면 라벨로 점프하라는 bne!!
bne 를 먼저 살펴 보자. 각각의 어셈블리어 한 줄은 4바이트라고 햇다. 즉 저게 컴파일이 되면, 한 줄이 32비트의 기계어로 바뀌게 된다. 그럼 그 다음 명령어는? 4바이트 뒤에 있다! 근데 Else 의 경우에는 instruction 으로 치지 않는다. 그래서 22레지스터와 23 레지스터의 값이 같다라면, 그냥 20과 21의 값을 더한 다음에 그걸 19에 저장하면 되고, x0 끼리는 항상 같으니까, exit 하면 됨. 반면 다를 경우에는 12 바이트 뒤에 있는 sub 명령어로 가서 명령을 수행하고 exit 하면 됨.
이번에는 while 문을 한 번 봐 보자!
slli 는 왼쪽으로 비트 옮기는 것을 뜻 하고, 22번 레지스터의 값을 이용해 2번 연산을 수행해서 x10 에 결과를 넣으라는 것!
위에 초록색 배경 박스처럼, 컴파일러가 프로그램을 쪼개는 가장 초기 단계! 의 블락을 basic block 이라고 한다.
먼저 jal 을 톺아보자. Procedure Address 는 내가 가고 싶은 주소이고, jal 을 사용할 경우 x1 에는 항상! 현재 주소(점프 이전 주소) + 4 (인스트럭션이 4바이트 이기 때문에. 32비트 인스트럭션! )의 값이 저장이 되게 됨. 즉 하나 다음 메모리 주소가 저장이 되게 됨. 그래서 다음에 돌아올 곳이 내가 지금 있는 곳 바로 다음임1! (x1 은 돌아올 곳을 저장하는 코드인 것 잊지 말기!!) 그 다음에 이제 점프를 해서 일을 수행을 하고 돌아오고 싶을 경우에는 jalr 명령어를 사용하면 x0 에 우리가 아까 저장해둔 돌아올 곳 주소를 저장하게 됨. →?? 그럼 함수의 리턴값이 있는 경우 그 값은 x0 에 저장되어 있는데 또 x0 에 저장하면 덮어쓰기가 되는 것 아니지..? x0 의 경우, 항상 0값이 들어 있다!!! 그러니까 우리는 x1이라는 값 자체를 리턴하고 싶은 것! 그럼 0을 더해서 리턴해야 겠다.