1. Conditional Operations

Untitled

두 종류가 있음. 같으면 라벨로 점프하라는 beq 과 다르면 라벨로 점프하라는 bne!!

Untitled

bne 를 먼저 살펴 보자. 각각의 어셈블리어 한 줄은 4바이트라고 햇다. 즉 저게 컴파일이 되면, 한 줄이 32비트의 기계어로 바뀌게 된다. 그럼 그 다음 명령어는? 4바이트 뒤에 있다! 근데 Else 의 경우에는 instruction 으로 치지 않는다. 그래서 22레지스터와 23 레지스터의 값이 같다라면, 그냥 20과 21의 값을 더한 다음에 그걸 19에 저장하면 되고, x0 끼리는 항상 같으니까, exit 하면 됨. 반면 다를 경우에는 12 바이트 뒤에 있는 sub 명령어로 가서 명령을 수행하고 exit 하면 됨.

  1. While Loop

Untitled

이번에는 while 문을 한 번 봐 보자!

slli 는 왼쪽으로 비트 옮기는 것을 뜻 하고, 22번 레지스터의 값을 이용해 2번 연산을 수행해서 x10 에 결과를 넣으라는 것!

  1. Basic Block

위에 초록색 배경 박스처럼, 컴파일러가 프로그램을 쪼개는 가장 초기 단계! 의 블락을 basic block 이라고 한다.

  1. 더 많은 조건부 연산자들
    1. blt rs1 rs2 branch ← branch less than rs1 이 rs2 보다 작으면 branch 해라!
    2. bge rs1 rs2 branch ← branch greater than or equal rs1 이 rs2 보다 크거나 같으면 branch 해라!
    3. 위에 거는 다 signed 용이었고 아래는 Unsigned 용! 단순 같다 비교는 비트 비교를 통해 가능한데, signed, unsigned 의 경우 뭐가 더 크냐? 에 대해서는 얘가 signed 인지 unsigned 인지를 알려주고, 그것끼리 비교해야 하기 때문에 이렇게 나뉘는 것임.
    4. bltu branch if less than, unsigned 와 bgeu branch greater or equal than unsinged 가 있다.
  2. function 을 사용할 때의 작동 절차!
    1. 파라미터를 넣어야 하고
    2. 그 함수가 파라미터를 읽어서
    3. 코드의 순서대로 연산을 하고
    4. 결과를 저장함
    5. 이때 이 함수의 경우, main 함수 위에 코드의 맨시작에 그 주소가 저장되어 있어서
    6. Main 함수가 그 주소를 보고 함수를 찾아가게 됨.

Untitled

Untitled

  1. function을 쓰게 되면 인자 즉 파라미터를 쓰게 되는데, 인자를 몇 개 주는지가 중요!! 8개까지는 x10 부터 차례대로 x11, x12 … x17 까지 하나씩 저장이 됨! 그리고 나서 코드를 쫙 수행해서 계산된 결과의 값을 x10 에 넣고, 다시 원래 original code sequence 로 돌아오면 됨! 그럼 x10 에는 항상 리턴된 값이 되어있다는 약속이 되어 잇기 때문에 (즉 main 이 알고 있기 때문에 ) x10 에 있는 값을 읽으면 함수의 계산 결과를 알 수 있음!!
  2. jump 를 했으면 돌아오는 어드레스를 알아야 함!! 돌아오는 주소는 x1 에 저장이 되게 됨!! 이건 이제 unconditional jump 라고 함!! 조건부 점프가 아니니까!!

Untitled

먼저 jal 을 톺아보자. Procedure Address 는 내가 가고 싶은 주소이고, jal 을 사용할 경우 x1 에는 항상! 현재 주소(점프 이전 주소) + 4 (인스트럭션이 4바이트 이기 때문에. 32비트 인스트럭션! )의 값이 저장이 되게 됨. 즉 하나 다음 메모리 주소가 저장이 되게 됨. 그래서 다음에 돌아올 곳이 내가 지금 있는 곳 바로 다음임1! (x1 은 돌아올 곳을 저장하는 코드인 것 잊지 말기!!) 그 다음에 이제 점프를 해서 일을 수행을 하고 돌아오고 싶을 경우에는 jalr 명령어를 사용하면 x0 에 우리가 아까 저장해둔 돌아올 곳 주소를 저장하게 됨. →?? 그럼 함수의 리턴값이 있는 경우 그 값은 x0 에 저장되어 있는데 또 x0 에 저장하면 덮어쓰기가 되는 것 아니지..? x0 의 경우, 항상 0값이 들어 있다!!! 그러니까 우리는 x1이라는 값 자체를 리턴하고 싶은 것! 그럼 0을 더해서 리턴해야 겠다.