字节数(rdx)
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 38 课,共 45 课。
你已经告诉 OS 在哪里打印(rdi)以及打印什么(rsi)。现在,你需要告诉它要打印多少字节。
用于指定字节数的寄存器是 rdx。
为什么操作系统需要字符串长度?
操作系统不知道你的字符串在哪里结束。如果没有长度,它就会一直读取内存。长度会准确地告诉操作系统何时停止。
示例:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = 要打印的字节数如果长度不对,会发生什么?
| 如果你设置得 | 结果 |
|---|---|
| 太短 | 只会打印字符串的一部分 |
| 太长 | 操作系统会继续读取字符串之后的垃圾内存:可能会打印随机字符或崩溃 |
| 为零 | 不会打印任何内容 |
自动计算长度:
你已经在第 3 章学习了 $ - label 模式:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6(Hello + 换行符)这样可以确保长度始终正确,即使你更改了字符串也是如此。
完整示例:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; write 系统调用
mov rdi, 1 ; stdout
mov rsi, msg ; 字符串的地址
mov rdx, msgLen ; 字节数
syscall挑战
给定一个名为 color 的字符串,其值为 'Red',后面跟着一个换行符。名为 colorLen 的常量已通过 $ - color 定义。
写出一行代码,使用 colorLen 常量将 rdx 设置为字符串的长度。
只写用于 rdx 的 mov 指令。
亲手试试
section .text
global _start
_start:
; 你的代码先运行(设置 rdx)
%include "solution.asm"
mov rax, 1
mov rdi, 1
mov rsi, color
; rdx 中已有长度(由你的代码设置)
syscall
mov rax, 60
mov rdi, 0
syscall这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器