Slt bne beg 실제적으로 하드웨어에 정의가 되어있음
Ble blt bgt bge -> Pseudo instructions
모든 연산은 ALU를 거치도록 되어있음 따라서 단순 move같은 명령은 없음. 이에 기존에 있는 path를 이용해서 move 시킴
직접 어드레싱 immediate addressing
Conditional branching
Register (jump regiseter)
op rs
-> 레지스터에서 지칭해서 이동
In C, a procedure is called a function(함수).
Subfunc가 나오는곳마다 Subfunc의 해당되는 코드를 전부 넣는 것
-> 함수를 짜는것에 있어서 효율성이 하나도 없음
서브루틴을 사용할 때 4가지의 복잡한 이슈가 발생함
이를 해결하기 위한 명령어가 있음
1) Jump 가 일어났을 경우 돌아와야함
돌아올 주소를 지정해줘야함 -> jal 명령어 (jump and link)
saves pc + 4 in regisetr $ra { = r31}
주소를 복사하고 저장하고 점프 후 돌아올 주소를 기제해 둠
2) Argument and return value
Main routine (caller) puts parameters in a place where the procedure (callee) can access them
$a0 - $a3: four argument registers
Caller transfers control to the callee
Callee acquires the storage resources needed
Callee performs the desired task (jal : ra 에 pc + 4를 넣어둠, v0 v1에 리턴값을 넣어두고 ra 에 들어잇는 값을 pc로 넣어주면 돌아올수 있게 된다)
Callee puts the result value in a place where the caller can
access it
$v0 - $v1: two value registers for result values
Callee returns control to the caller
$ra: one return address register to return to the next instruction of the caller.
3) Procedure 값을 백업하거나 복원하는 back up and restore -> 특수명령어가 있는게 아니라 서브루틴으로 콜이 발생했을시, 기존의 명령어를 이용하여 문제없이 이루어질수 있도록 하는 코드를 추가 -> 어디서 백업하고 복원할거냐 논란
첫번째
1) 스택영역에 save하고 점프
2) Argument 셋업
3) 돌아올 주소 설정 후 점프함
4) Callee 과정 끝나면 돌아오고
5) Register 에 저장된 값을 복원해서 다시 사용함
두번째
1) callee 에서 save register 넣어줌
새번째
하이브리드 방식 : s를 사용할거면 s 만 백업해라
32개의 레지스터
0 제로
1 $at 맘대로 사용 (Pseduo Instruction 을 위해 예약)
2 3 $v0, $ v1 리턴값을 저장할 수 있음
4 5 6 7 $a0 ~ $a3 argument값의 용도로 사용함
내부적으로 함수콜이 없는 함수를 leaf example이라고 할 수 있다
int leaf_example ( int g, int h, int i, int j ) {
int f ;
f = ( g + h ) – ( i + j );
return f;
}
4개의 argu를 받을 수 있음
로드 스토어가 존재하기는 하나, 사실상 별로 필요하지 않다
int nonleaf_example (int arg){
int result;
result = arg +
leaf_example(5,4,3,2);
return result;
}
재귀함수의 실행을 알아보기 위해, 팩토리얼 재귀함수를 작성하였다.
int fact (int n) {
if (n < 1) return 1;
else return (n * fact (n-1)); }
과정은 다음과 같다.
fact:
addi $sp, $sp, -8
sw sp)
sw sp)
slti $t0, $a0, 1
beq $t0, $zero, L1
addi $v0, $zero, 1
addi $sp, $sp, 8
jr $ra #return to caller (1st)
L1: addi $a0, $a0, -1
jal fact #call fact with (n-1)
bk_f:
lw sp)
lw sp)
addi $sp, $sp, 8
mul $v0, $a0, $v0
jr $ra #return to caller (2nd)