用 db 定义字符串
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 28 课,共 45 课。
你已经知道 db 用来定义单个字节。但 db 也可以定义字符串:连续的多个字节。
语法:
label db 'text here'示例:
section .data
message db 'Hello'这会在内存中创建 5 个字节:“H”、“e”、“l”、“l”、“o”
内存中的情况:
| 地址 | 字节 | ASCII 值 |
|---|---|---|
| message | 'H' | 72 |
| message+1 | 'e' | 101 |
| message+2 | 'l' | 108 |
| message+3 | 'l' | 108 |
| message+4 | 'o' | 111 |
添加换行符:
要打印字符串并移到下一行,请添加 0x0a(换行符):
section .data
message db 'Hello', 0x0a现在这个字符串有 6 个字节:'H','e','l','l','o',换行符
多个字符串:
section .data
hello db 'Hello', 0x0a
goodbye db 'Goodbye', 0x0a为什么这很重要:
字符串是你在汇编中最常用的数据。write 系统调用(你将在第 5 章学习)会从内存中读取字节来打印字符串,直到读取到你指定的长度为止。
重要说明:
字符串只是字节。CPU 不知道也不关心 'H' 是一个字母。它只是数字 72。打印时,write 系统调用会将这些数字解释为字符。
挑战
简单在 .data 段中创建一个名为 greeting 的字符串,其值为 'Hi',后跟一个换行符(0x0a)。
亲手试试
%include "data.asm"
section .text
global _start
_start:
; 使用 write 系统调用打印字符串
mov rax, 1
mov rdi, 1
mov rsi, greeting
mov rdx, 3 ; 'H'、'i' 和换行符,共 3 字节
syscall
; 退出
mov rax, 60
mov rdi, 0
syscall这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器
查询任意字符的编码: ASCII 转换器