Menu
Coddy logo textTech

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>을 실행하면 어떤 일이 발생할까요:

  1. CPU가 Linux 커널로 이동합니다
  2. 커널이 다음을 확인합니다: "exit syscall with code 0"
  1. 커널이 프로그램을 종료합니다
  2. 커널이 셸 또는 운영 체제에 제어권을 반환합니다

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로 끝내세요.

challenge icon

챌린지

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 시스템 콜 추가
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨

직접 연습해 보세요: Assembly 플레이그라운드