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 个字节这对于处理数组和数据结构很有用。
挑战
写一行汇编代码,将 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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器