Ký tự xuống dòng rất quan trọng
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 41 trên 45.
Bạn đã thêm 0x0a (ký tự xuống dòng) vào cuối các chuỗi. Nhưng nếu bạn quên thì sao?
Không xuống dòng:
Văn bản được in ra, nhưng con trỏ vẫn ở cùng dòng. Mọi nội dung đầu ra sau đó sẽ xuất hiện ngay bên cạnh.
Ví dụ không có ký tự xuống dòng:
section .data
first db 'Hello'
firstLen equ $ - first
second db 'World'
secondLen equ $ - second
section .text
mov rax, 1
mov rdi, 1
mov rsi, first
mov rdx, firstLen
syscall
mov rax, 1
mov rdi, 1
mov rsi, second
mov rdx, secondLen
syscallĐầu ra:
HelloWorld
Không có khoảng trắng. Không có dòng mới. Mọi thứ dính liền với nhau.
Có ký tự xuống dòng:
section .data
first db 'Hello', 0x0a
firstLen equ $ - first
second db 'World', 0x0a
secondLen equ $ - secondĐầu ra:
Hello
WorldMỗi chuỗi được in ra trên một dòng riêng.
Chức năng của ký tự xuống dòng:
| Ký tự | ASCII | Tác dụng |
|---|---|---|
0x0a | 10 | Di chuyển con trỏ đến đầu dòng tiếp theo |
Các lỗi xuống dòng thường gặp:
| Lỗi | Kết quả |
|---|---|
| Không có ký tự xuống dòng | Văn bản dính liền trên một dòng |
| Chỉ có ký tự xuống dòng ở cuối chuỗi cuối cùng | Tất cả chuỗi dính liền trên một dòng, sau đó con trỏ chuyển sang dòng tiếp theo |
| Có ký tự xuống dòng ở giữa chuỗi | Các dòng bị ngắt ở những chỗ không mong đợi |
Quy tắc an toàn:
Luôn thêm 0x0a vào cuối mỗi chuỗi mà bạn muốn hiển thị trên một dòng riêng.
Thử thách
Bạn được cho ba chuỗi không có ký tự xuống dòng. Nhiệm vụ của bạn là in chúng ra sao cho mỗi chuỗi nằm trên một dòng riêng.
Các chuỗi là:
| Chuỗi | Giá trị |
|---|---|
word1 | 'Apple' |
word2 | 'Banana' |
word3 | 'Cherry' |
Yêu cầu:
- Định nghĩa mỗi chuỗi có ký tự xuống dòng (
0x0a) ở cuối - Tự động tính độ dài của mỗi chuỗi
- In cả ba chuỗi bằng syscall write
- Thoát bình thường với mã 0
Tự làm thử
section .data
; TODO: Định nghĩa word1 với văn bản thứ 1 trong hướng dẫn và ký tự xuống dòng
; TODO: Định nghĩa word2 với văn bản thứ 2 trong hướng dẫn và ký tự xuống dòng
; TODO: Định nghĩa word3 với văn bản thứ 3 trong hướng dẫn và ký tự xuống dòng
; TODO: Tính độ dài của từng chuỗi
section .text
global _start
_start:
; TODO: In ra word1
; TODO: In ra word2
; TODO: In ra word3
; TODO: Thoát chương trình đúng cách
Bà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