Exit 시스템 콜 (60)
Coddy Assembly 여정의 기초 섹션에 포함된 레슨. 45개 중 32번째.
모든 프로그램에서 가장 중요한 시스템 호출은 exit입니다. 이것이 없으면 프로그램은 영원히 계속 실행되거나 메모리의 끝에 도달했을 때 충돌할 수 있습니다.
exit 시스템 호출 번호는 60입니다.
구문:
mov rax, 60 ; exit에 해당하는 syscall 번호
mov rdi, 0 ; 종료 코드 (0 = 성공)
syscall ; OS에 종료를 요청syscall을 rax = 60과 함께 실행하면 어떤 일이 일어날까요:
- CPU가 Linux 커널로 점프합니다
- 커널은 "exit syscall with code 0"이라고 인식합니다
- 커널이 프로그램을 종료합니다
- 커널이 셸 또는 운영 체제로 제어를 반환합니다
종료 코드 0은 성공을 의미합니다. 프로그램이 오류 없이 완료되었습니다. 종료 코드 1부터 255까지는 서로 다른 오류를 나타냅니다. 무엇이 잘못되었는지 알리기 위해 어떤 숫자든 선택할 수 있습니다.
종료 코드가 중요한 이유:
프로그램이 종료된 후 셸(터미널)에 종료 코드가 저장됩니다. 다음과 같이 확인할 수 있습니다.
./myprogram
echo $? ; Prints the exit code다음과 같은 경우에 유용합니다:
- 프로그램이 성공했는지 확인하는 스크립트
- 디버깅(오류마다 다른 코드 사용)
- 프로그램을 서로 연결하기
완전한 최소 프로그램:
section .text
global _start
_start:
mov rax, 60 ; 종료 시스템 호출
mov rdi, 0 ; 종료 코드 0 (성공)
syscall이 프로그램은 눈에 보이는 동작을 하지 않습니다. 그저 성공적으로 종료될 뿐입니다. 하지만 유효하고 완전한 프로그램입니다.
global _start와 _start:가 무엇인지 설명하겠습니다.
| 코드 | 무엇인지 | 필요한 이유 |
|---|---|---|
global _start | 프로그램이 시작되는 위치를 링커에 알립니다 | 이것이 없으면 링커는 어떤 레이블이 진입점인지 알 수 없습니다 |
_start: | 코드의 시작을 표시하는 레이블 | CPU가 여기서 실행을 시작합니다 |
세부 사항을 외울 필요는 없습니다. 모든 main.asm에 코드 앞에 이 두 줄이 있어야 한다는 것만 알면 됩니다. 모든 프로그램에서 이 줄들을 사용하게 됩니다.
exit syscall을 잊어버리면 어떻게 될까요?
exit syscall을 포함하지 않으면 CPU는 코드 뒤의 메모리에 있는 쓰레기 데이터를 계속 실행합니다. 이 경우 보통 세그멘테이션 오류(충돌)가 발생하거나 전혀 예상치 못한 동작을 합니다. 프로그램이 깔끔하게 종료되지 않습니다.
프로그램을 항상 종료 시스템 호출로 끝내세요.
챌린지
종료 코드 5로 exit 시스템 호출을 추가하세요.
메시지 "Exiting with code 5"를 출력하는 코드는 이미 제공되어 있습니다. 아직 이해할 필요는 없습니다. 이 내용은 5장에서 다룹니다.
여러분의 할 일은 마지막에 exit 시스템 호출을 추가하는 것뿐입니다.
직접 해보기
section .data
msg db 'Exiting with code 5', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
; TODO: 종료 코드 5를 사용하는 종료 syscall을 추가하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: Assembly 플레이그라운드