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) | 기능 | 입력 인자 | 출력/반환값 |
|---|---|---|---|
| 1 | Print Integer | $a0 = 출력할 정수 | - |
| 4 | Print String | $a0 = null 종단 문자열 주소 | - |
| 5 | Read Integer | - | $v0 = 입력받은 정수 |
| 8 | Read String | $a0 = 버퍼 주소, $a1 = 최대 길이 | 버퍼에 문자열 저장 |
| 9 | Sbrk (Heap 할당) | $a0 = 할당할 바이트 수 | $v0 = 할당된 힙 메모리 주소 |
| 10 | Exit (프로그램 종료) | - | 시뮬레이터 실행 중단 |
| 11 | Print Character | $a0 = ASCII 문자 코드 | - |
2. 사용자 입력 및 출력 종합 어셈블리 예제
.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포함)를 전달해야 메모리 오염을 방지할 수 있습니다.