Menu
CoddyTech

字节数(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
challenge icon

挑战

给定一个名为 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Assembly 在线编辑器