Menu
CoddyTech

打印两个字符串

本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 40 课,共 45 课。

你已经知道如何打印一个字符串。但如果你想打印两个单独的字符串呢?例如,先打印 "Hello ",然后打印 "World!"?

你只需调用两次 write 系统调用,每个字符串调用一次。

工作原理:

; 第一次输出
mov rax, 1
mov rdi, 1
mov rsi, firstMsg
mov rdx, firstLen
syscall

; 第二次输出
mov rax, 1
mov rdi, 1
mov rsi, secondMsg
mov rdx, secondLen
syscall

示例:

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

输出:

Hello

World!

每个字符串都以 0x0a(换行符)结尾,因此这两个字符串会分别打印在不同的行上。

为什么要打印两个字符串,而不是一个?

原因示例
可重用性用不同的名字打印相同的问候语
灵活性根据条件打印不同的消息
组织性将不同的消息分别保存在内存中

你可以打印任意多个字符串:

只需为每个字符串重复调用 write 系统调用。

challenge icon

挑战

给你两个字符串:partOne 的值为 'Good',partTwo 的值为 'bye'。它们末尾都已经有一个换行符。

编写代码,先输出 partOne,再输出 partTwo,使输出如下:

Good

bye

数据段和退出系统调用已经提供。你只需要编写两个写入系统调用。

亲手试试

section .data
    partOne db 'Good', 0x0a
    partOneLen equ $-partOne
    partTwo db 'bye', 0x0a
    partTwoLen equ $-partTwo

section .text
    global _start

_start:
    ; TODO: 使用 write 系统调用输出 partOne
    ; TODO: 使用 write 系统调用输出 partTwo

    mov rax, 60
    mov rdi, 0
    syscall
quiz icon自我测试

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

基础知识中的所有课

自己练习: Assembly 在线编辑器