综合应用
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 39 课,共 45 课。
你已经学会了 write 系统调用的全部四个部分:
| 寄存器 | 其中存放的内容 | 屏幕输出时的值 |
|---|---|---|
rax | 系统调用编号 | 1(write) |
rdi | 文件描述符 | 1(stdout) |
rsi | 缓冲区地址 | 你的字符串的地址 |
rdx | 字节数 | 你的字符串的长度 |
现在该把它们组合起来了。
完整的 write 系统调用模式:
mov rax, 1 ; write 的系统调用号
mov rdi, 1 ; 文件描述符(stdout)
mov rsi, msg ; 字符串的地址
mov rdx, msgLen ; 要打印的字节数
syscall ; 请求操作系统打印一个完整可运行的程序:
section .data
msg db 'Hello, World!', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscall这个程序的作用:
| 步骤 | 发生了什么 |
|---|---|
| 1 | 在屏幕上打印 "Hello, World!" |
| 2 | 换到新的一行 |
| 3 | 以代码 0 正常退出 |
顺序很重要:
你必须在执行 syscall 之前设置寄存器。只要在执行 syscall 之前设置好全部四个寄存器,mov 指令的顺序就不重要。
挑战
编写一个完整的程序,打印消息 "Assembly is fun" 并换行,然后正常退出。
字符串及其长度已经定义好了。你只需要在 _start: 中编写代码。
亲手试试
section .data
msg db 'Assembly is fun', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; TODO:设置并调用 write 系统调用
; 使用 rax=1, rdi=1, rsi=msg, rdx=msgLen
; TODO:以退出码 0 正常退出
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器