In hai chuỗi
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 40 trên 45.
Bạn đã biết cách in ra một chuỗi. Nhưng nếu bạn muốn in ra hai chuỗi riêng biệt thì sao? Ví dụ: "Hello " rồi đến "World!"?
Bạn chỉ cần gọi syscall write hai lần, mỗi lần cho một chuỗi.
Cách hoạt động:
; In ra lần thứ nhất
mov rax, 1
mov rdi, 1
mov rsi, firstMsg
mov rdx, firstLen
syscall
; In ra lần thứ hai
mov rax, 1
mov rdi, 1
mov rsi, secondMsg
mov rdx, secondLen
syscallVí dụ:
section .data
first db 'Hello ', 0x0a
firstLen equ $-first
second db 'World!', 0x0a
secondLen equ $-second
section .text
global _start
_start:
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
mov rax, 60
mov rdi, 0
syscallĐầu ra:
Hello
World!
Mỗi chuỗi (string) kết thúc bằng 0x0a (ký tự xuống dòng), nên hai chuỗi được in trên các dòng riêng biệt.
Tại sao in ra hai chuỗi thay vì một chuỗi?
| Lý do | Ví dụ |
|---|---|
| Tái sử dụng | In cùng một lời chào với các tên khác nhau |
| Linh hoạt | In các thông điệp khác nhau tùy theo điều kiện |
| Sắp xếp | Lưu riêng các thông điệp khác nhau trong bộ nhớ |
Bạn có thể in ra bao nhiêu chuỗi tùy thích:
Chỉ cần lặp lại lệnh gọi hệ thống write cho mỗi chuỗi.
Thử thách
Bạn được cho hai chuỗi: partOne có giá trị 'Good' và partTwo có giá trị 'bye'. Cả hai đều đã có ký tự xuống dòng ở cuối.
Viết code để in ra partOne, sau đó là partTwo, sao cho đầu ra hiển thị:
Good
bye
Phần dữ liệu và lời gọi hệ thống thoát đã có sẵn. Bạn chỉ cần viết hai lời gọi hệ thống ghi.
Tự làm thử
section .data
partOne db 'Good', 0x0a
partOneLen equ $-partOne
partTwo db 'bye', 0x0a
partTwoLen equ $-partTwo
section .text
global _start
_start:
; TODO: In partOne ra bằng lệnh gọi hệ thống write
; TODO: In partTwo ra bằng lệnh gọi hệ thống write
mov rax, 60
mov rdi, 0
syscall
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
Tự luyện tập: Playground Assembly