TOOLS GAMES DEVLOG DOCS ABOUT CONTACT
HOME > DOCS > Architecture / ISA > QtSpim / MARS 시뮬레이터 MIPS syscall 입출력(I/O) 및 서비스 코드 가이드
Architecture / ISA Beginner QtSpim / SPIM / MARS

QtSpim / MARS 시뮬레이터 MIPS syscall 입출력(I/O) 및 서비스 코드 가이드

MIPS 시뮬레이터(QtSpim, SPIM, MARS) 환경에서 시스템 콜($v0)을 이용한 정수/문자열 콘솔 출력, 사용자 입력 받기, 메모리 할당 및 프로그램 정상 종료 구현.

#MIPS #Assembly #QtSpim #Syscall #IO
핵심 개념MIPS 시뮬레이터(QtSpim, MARS 등)에서 화면 출력이나 키보드 입력 같은 운영체제 I/O 서비스를 요청할 때는 $v0 레지스터에 서비스 번호를 적재하고 필요한 인자를 $a0, $a1 등에 배치한 후 syscall 명령어를 호출합니다.

1. 주요 Syscall 서비스 코드 일람표

서비스 ($v0)기능입력 인자출력/반환값
1Print Integer$a0 = 출력할 정수-
4Print String$a0 = null 종단 문자열 주소-
5Read Integer-$v0 = 입력받은 정수
8Read String$a0 = 버퍼 주소, $a1 = 최대 길이버퍼에 문자열 저장
9Sbrk (Heap 할당)$a0 = 할당할 바이트 수$v0 = 할당된 힙 메모리 주소
10Exit (프로그램 종료)-시뮬레이터 실행 중단
11Print Character$a0 = ASCII 문자 코드-

2. 사용자 입력 및 출력 종합 어셈블리 예제

spim_io_example.s
.data
prompt:     .asciiz "정수를 입력하세요: "
result_msg: .asciiz "입력한 정수의 두 배는: "
newline:    .asciiz "\n"

.text
.globl main
main:
    # 1. 안내 문자열 출력 (Service 4: print_string)
    li   $v0, 4
    la   $a0, prompt
    syscall

    # 2. 사용자 정수 입력 받기 (Service 5: read_int)
    li   $v0, 5
    syscall
    move $t0, $v0           # 입력받은 값을 $t0에 저장

    # 3. 연산 수행 (2배 곱하기)
    sll  $t1, $t0, 1        # $t1 = $t0 * 2 (좌측 시프트 1비트)

    # 4. 결과 안내 문자열 출력
    li   $v0, 4
    la   $a0, result_msg
    syscall

    # 5. 연산 결과 정수 출력 (Service 1: print_int)
    li   $v0, 1
    move $a0, $t1           # 출력할 값을 $a0에 배치
    syscall

    # 6. 줄바꿈 출력
    li   $v0, 4
    la   $a0, newline
    syscall

    # 7. 프로그램 안전 종료 (Service 10: exit)
    li   $v0, 10
    syscall

3. 실무 주의점 및 팁

  • exit(서비스 10) 누락 주의: 프로그램 끝에서 syscall 10을 호출하지 않으면 PC 카운터가 데이터 영역이나 임의의 메모리로 넘어가 무한 루프나 Invalid Instruction 예외가 터집니다.
  • 문자열 버퍼 오버플로우: Service 8(read_string) 사용 시 $a1에 반드시 버퍼의 최대 크기(종단 \0 포함)를 전달해야 메모리 오염을 방지할 수 있습니다.

참고자료 & 관련 링크