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