Chuỗi với db
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 28 trên 45.
Bạn đã biết db định nghĩa một byte đơn. Nhưng db cũng có thể định nghĩa một chuỗi: nhiều byte liên tiếp.
Cú pháp:
label db 'text here'Ví dụ:
section .data
message db 'Hello'Lệnh này tạo 5 byte trong bộ nhớ: 'H', 'e', 'l', 'l', 'o'
Điều gì xảy ra trong bộ nhớ:
| Địa chỉ | Byte | Giá trị ASCII |
|---|---|---|
| message | 'H' | 72 |
| message+1 | 'e' | 101 |
| message+2 | 'l' | 108 |
| message+3 | 'l' | 108 |
| message+4 | 'o' | 111 |
Thêm ký tự xuống dòng:
Để in một chuỗi rồi chuyển sang dòng tiếp theo, hãy thêm 0x0a (ký tự xuống dòng):
section .data
message db 'Hello', 0x0aGiờ chuỗi có 6 byte: 'H','e','l','l','o', ký tự xuống dòng
Nhiều chuỗi:
section .data
hello db 'Hello', 0x0a
goodbye db 'Goodbye', 0x0aVì sao điều này quan trọng:
Chuỗi (string) là loại dữ liệu phổ biến nhất mà bạn sẽ dùng trong assembly. Lệnh gọi hệ thống write (bạn sẽ học trong Chương 5) in chuỗi ra bằng cách đọc từng byte trong bộ nhớ cho đến khi đạt đến độ dài bạn cung cấp.
Lưu ý quan trọng:
Chuỗi chỉ là các byte. CPU không biết và cũng không quan tâm rằng 'H' là một chữ cái. Đó chỉ là số 72. Lời gọi hệ thống write diễn giải các số đó thành ký tự khi in ra.
Thử thách
DễTạo một chuỗi có tên greeting với giá trị 'Hi' theo sau là ký tự xuống dòng (0x0a) trong phần .data.
Tự làm thử
%include "data.asm"
section .text
global _start
_start:
; In chuỗi bằng lệnh gọi hệ thống write
mov rax, 1
mov rdi, 1
mov rsi, greeting
mov rdx, 3 ; 'H', 'i', ký tự xuống dòng = 3 byte
syscall
; Thoát
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
Tự luyện tập: Playground Assembly
Tra mã của ký tự bất kỳ: Công cụ chuyển đổi ASCII