Menu
CoddyTech

LEA:加载地址

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

到目前为止,你已经使用 mov 将值从内存加载到寄存器中。但有时你并不想要这个值,而是想要地址本身。

LEA 是 Load Effective Address 的缩写。它会计算一个内存地址,并将该地址放入寄存器中,而不会访问内存。

语法:

lea register, [address]

MOV 与 LEA:

指令作用
mov al, [number]访问内存,获取其中的值,并将其放入 al
lea rsi, [number]不会访问内存。计算 number 的地址,并将其放入 rsi

可以这样理解:

  • mov = 打开盒子,取出里面的东西
  • lea = 把盒子的编号(地址)写在纸上

示例:

number db 42        ; 值 42 存储在某个地址

mov al, [number]    ; al = 42(这个值)
lea rsi, [number]   ; rsi = number 的地址(例如 0x402000)

为什么需要 LEA?

在汇编语言中,如果你想打印字符串或将内存位置传递给函数,你需要的是地址,而不是值。write 系统调用(你将在第 5 章学习)要求 rsi 中存放一个地址。

LEA 能做什么(不只是处理简单地址):

LEA 还可以对地址进行基本的数学运算。例如:

lea rsi, [number + 5]   ; rsi = number 的地址加 5 个字节

这对于处理数组和数据结构很有用。

challenge icon

挑战

写一行汇编代码,将 message 的地址加载到 rsi 寄存器中。

亲手试试

section .data
    msg_prefix db 'message = '
    prefix_len equ $ - msg_prefix

section .text
    global _start

_start:
    ; 先运行你写的 lea 指令
    ; rsi 现在应该包含 message 的地址
    
    ; 打印前缀
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_prefix
    mov rdx, prefix_len
    syscall
    
    %include "solution.asm"
    
    ; 使用你加载的地址打印字符串
    mov rax, 1
    mov rdi, 1
    ; rsi 已经有这个地址了(来自你写的代码)
    mov rdx, 6                    ; "Hello" + 换行符 = 6 字节
    syscall
    
    ; 退出
    mov rax, 60
    mov rdi, 0
    syscall
quiz icon自我测试

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

基础知识中的所有课

自己练习: Assembly 在线编辑器