File Descriptor (rdi)
Coddy Assembly 여정의 기초 섹션에 포함된 레슨. 45개 중 36번째.
이전 레슨에서는 write syscall의 일부로 mov rdi, 1을 사용했습니다. 이 숫자 1을 file descriptor라고 합니다.
file descriptor는 운영 체제에 데이터를 어디로 보낼지 알려 주는 숫자입니다.
Linux의 세 가지 표준 파일 디스크립터:
| 파일 디스크립터 | 이름 | 데이터가 전달되는 곳 |
|---|---|---|
| 0 | stdin | 키보드 입력 (사용자로부터 데이터 읽기) |
| 1 | stdout | 화면 출력 (일반 프로그램 출력) |
| 2 | stderr | 화면 출력 (오류 메시지) |
화면에 두 개의 출력이 있는 이유는 무엇인가요?
일반 출력(stdout)과 오류 출력(stderr)은 같은 화면으로 전송되지만, 별도로 처리됩니다. 이를 통해 다음을 수행할 수 있습니다.
- 화면에서 오류를 계속 확인하면서 일반 출력을 파일로 리디렉션
- 일반 출력이 숨겨져 있어도 오류 표시
이 과정에서 출력할 때:
메시지를 출력할 때는 항상 파일 디스크립터 1(stdout)을 사용합니다. 아직은 stderr가 필요하지 않습니다.
예시:
mov rdi, 1 ; 출력을 stdout(화면)으로 보냄잘못된 파일 디스크립터를 사용하면 어떻게 될까요?
| 사용하는 값 | 결과 |
|---|---|
| 0 (stdin) | write syscall은 출력이 아니라 입력을 예상합니다. 실패하거나 아무 작업도 하지 않습니다 |
| 2 (stderr) | stdout처럼 작동하여 화면에 출력되지만, 오류를 위한 것입니다 |
| 그 외의 숫자 | 커널이 이를 인식하지 못하므로 syscall이 실패합니다 |
챌린지
줄바꿈이 뒤따르는 'OK' 값을 가진 message라는 문자열이 주어집니다. 화면(stdout)에 출력하도록 파일 디스크립터를 설정하는 코드 한 줄을 작성하세요. rdi에 대한 mov 명령어만 작성하세요.
직접 해보기
section .data
message db 'OK', 0x0a
msgLen equ $ - message
section .text
global _start
_start:
; 학생이 여기에 파일 디스크립터를 설정합니다
%include "solution.asm"
mov rax, 1
; rdi는 이미 학생이 설정해 두어야 합니다
mov rsi, message
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscall이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
3첫 번째 명령어 - MOV
MOV란 무엇인가요?MOV 즉시값MOV 레지스터에서 레지스터로MOV 메모리에서 레지스터로MOV 레지스터에서 메모리로LEA - 주소 로드다양한 크기의 MOV실습: 레지스터 값 교환요약: MOV 챌린지6Write Syscall
Write Syscall (1)File Descriptor (rdi)Buffer Address (rsi)Byte Count (rdx)하나로 합치기두 문자열 출력하기줄바꿈의 중요성요약: Write 설정직접 연습해 보세요: Assembly 플레이그라운드