File Descriptor (rdi)
Coddy Assembly 여정의 기초 섹션에 포함된 레슨 — 45개 중 36번째.
이전 레슨에서 여러분은 mov rdi, 1을 write 시스템 호출의 일부로 사용했습니다. 그 숫자 1은(는) 파일 디스크립터라고 불립니다.
파일 디스크립터는 운영체제에게 데이터를 어디로 보낼지 알려주는 숫자입니다.
Linux의 세 가지 표준 파일 디스크립터:
| 파일 디스크립터 | 이름 | 데이터 전송 위치 |
|---|---|---|
| 0 | stdin | 키보드 입력 (사용자로부터 데이터 읽기) |
| 1 | stdout | 화면 출력 (일반 프로그램 출력) |
| 2 | stderr | 화면 출력 (에러 메시지) |
왜 화면에 두 개의 출력이 있나요?
일반 출력(stdout)과 오류 출력(stderr)은 동일한 화면으로 전달되지만, 서로 별개로 처리됩니다. 이를 통해 다음과 같은 작업이 가능합니다:
- 화면에서 오류를 계속 확인하면서 일반 출력을 파일로 리다이렉션하기
- 일반 출력이 숨겨져 있는 경우에도 오류 표시하기
이 코스에서 출력할 때:
메시지를 출력할 때 항상 파일 디스크립터 1 (stdout)을 사용하게 됩니다. 아직 stderr는 필요하지 않습니다.
예시:
mov rdi, 1 ; 출력을 stdout(화면)으로 보냅니다잘못된 파일 디스크립터를 사용하면 어떻게 되나요?
| 사용할 경우 | 결과 |
|---|---|
| 0 (stdin) | write 시스템 호출은 출력이 아닌 입력을 기대합니다 — 실패하거나 아무 작업도 수행하지 않습니다 |
| 2 (stderr) | stdout처럼 작동(화면에 출력)하지만, 오류를 위한 용도입니다 |
| 기타 다른 숫자 | 커널이 이를 인식하지 못합니다 — 시스템 호출이 실패합니다 |
챌린지
'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 설정