Bộ mô tả tệp (rdi)
Thuộc phần Kiến thức nền tảng trong hành trình Assembly của Coddy. Bài học 36 trên 45.
Trong bài học trước, bạn đã dùng mov rdi, 1 trong lệnh gọi hệ thống write. Số 1 đó được gọi là bộ mô tả tệp.
Bộ mô tả tệp là một số cho hệ điều hành biết cần gửi dữ liệu đến đâu.
Ba bộ mô tả tệp tiêu chuẩn trong Linux:
| Bộ mô tả tệp | Tên | Nơi dữ liệu được gửi đến |
|---|---|---|
| 0 | stdin | Đầu vào từ bàn phím (đọc dữ liệu từ người dùng) |
| 1 | stdout | Đầu ra trên màn hình (đầu ra thông thường của chương trình) |
| 2 | stderr | Đầu ra trên màn hình (thông báo lỗi) |
Tại sao lại có hai đầu ra trên màn hình?
Đầu ra thông thường (stdout) và đầu ra lỗi (stderr) được gửi đến cùng một màn hình, nhưng được xử lý riêng biệt. Điều này cho phép bạn:
- Chuyển hướng đầu ra thông thường đến một tệp mà vẫn thấy lỗi trên màn hình
- Hiển thị lỗi ngay cả khi ẩn đầu ra thông thường
Để in ra trong khóa học này:
Bạn sẽ luôn dùng bộ mô tả tệp (file descriptor) 1 (stdout) để in thông báo. Bạn chưa cần dùng stderr.
Ví dụ:
mov rdi, 1 ; Gửi đầu ra (output) đến stdout (màn hình)Điều gì xảy ra nếu bạn dùng sai bộ mô tả tệp?
| Nếu bạn dùng | Kết quả |
|---|---|
| 0 (stdin) | Lệnh gọi hệ thống sẽ thất bại nếu đầu vào đến từ một pipe hoặc một tệp. Trong terminal, văn bản thường vẫn được in ra, nhưng stdin dành cho đầu vào, không phải đầu ra |
| 2 (stderr) | Hoạt động như stdout (in ra màn hình), nhưng dành cho lỗi |
| Bất kỳ số nào khác | Kernel không nhận diện được số đó: lệnh gọi hệ thống thất bại |
Thử thách
Bạn được cung cấp một chuỗi có tên message với giá trị 'OK' theo sau là một ký tự xuống dòng. Hãy viết dòng code đặt bộ mô tả tệp để in ra màn hình (stdout). Chỉ viết lệnh mov cho rdi.
Tự làm thử
section .data
message db 'OK', 0x0a
msgLen equ $ - message
section .text
global _start
_start:
; Bạn đặt bộ mô tả tệp ở đây
%include "solution.asm"
mov rax, 1
; Bạn cần đặt giá trị cho rdi trước đó
mov rsi, message
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscallBài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến thức nền tảng
3Lệnh đầu tiên: MOV
MOV là gì?MOV với giá trị tức thờiMOV từ thanh ghi sang thanh ghiMOV từ bộ nhớ sang thanh ghiMOV từ thanh ghi vào bộ nhớLEA: nạp địa chỉMOV với các kích thước khác nhauLuyện tập: hoán đổi thanh ghiÔn tập: thử thách MOV6Lời gọi hệ thống write
Lời gọi hệ thống write (1)Bộ mô tả tệp (rdi)Địa chỉ bộ đệm (rsi)Số byte (rdx)Ghép các phần lạiIn hai chuỗiKý tự xuống dòng rất quan trọngÔn tập: thiết lập writeTự luyện tập: Playground Assembly