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