打印两个字符串
本课属于 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 系统调用。
挑战
给你两个字符串: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
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器