Menu
CoddyTech

综合应用

本课属于 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 指令的顺序就不重要。

challenge icon

挑战

编写一个完整的程序,打印消息 "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 正常退出
quiz icon自我测试

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

基础知识中的所有课

自己练习: Assembly 在线编辑器