본문 바로가기
Developing Note/OS

[MIPS]초기 변수 받기 (argc, argv, envp)

by dev_mac-_- 2018. 4. 9.

[MIPS]초기 변수 받기 (argc, argv, envp)

 MIPS를 처음 실행하면 입력하지 않은 명령어인데도 기본적으로 입력이 되는 명령어들이 있다.

1
2
3
4
5
6
7
8
9
lw $a0, 0($sp)    # argc
addiu $a1, $sp, 4    #argv
addiu $a2, $a1, 4    #envp
sll $v0, $a0, 2
addu $a2, $a2, $v0
jal main
nop
li $v0, 10
syscall
cs


리눅스 상에서 파일을 실행시킬때 받는 값들이 있다.

c언어 혹은 java도 마찬가지로

1
2
3
int main(argc, argv){
    return 0;
}
cs
 
1
2
3
public static void main(String[] args){
 
}
cs

1번 $a0 argument register에 argc 즉 위에서 1000이 써있는 자리를 뜻한다. 

argv는 500인 자리, envp는 -s 자리이다.


컴퓨터에서 데이터를 서로 주고받을때 쓰이는 자료구조가 stack이다.  (Caller와 Callee 사이 중개 매개체)

이때도 사용자 입력값을 stack으로 받는 것을 알 수 있다. 

2번 자리에서는 $a1 argument register를 stack 주소값 +4를 저장한다. (이때 값은 사용자에게 입력받은 argv값이다.)

3번 자리는 마찬가지고 a1의 주소값 + 4 (즉, 이 전의 stack 주소값에서 +4)인 것을 알 수 있다. 


그 이후 jal main 명령어로 main부분의 함수로 jump한다. 이때 jal 명령어는 현재의 PC값에 +4한 위치를 $ra 레지스터에 저장 후 점프를 한다.



댓글