汇编语言寻址方式

前言

汇编中80%的报错、崩溃、数据错乱,都来自于寻址方式不熟练。

很多同学写汇编代码时,分不清:

到底是取数值?还是取地址?为什么中括号加不加结果完全不一样?

本篇文章一次性讲完汇编全部主流寻址方式,零基础也能彻底吃透!

一、核心前置概念(重中之重)

  • 无中括号:代表数值本身

  • 有中括号[]:代表内存地址中的数据

这是汇编寻址的终极核心,看懂这个,你就学会了一半!

二、五大汇编寻址方式详解(附代码+解析)

1. 立即数寻址

直接写死的常数数据,直接赋值,不经过内存、不经过地址。

mov ax, 0x00000001

mov bx, 100

特点:速度最快、固定数值、无法修改、仅用于赋值初始化。

2. 寄存器寻址

数据直接存放在寄存器中,无内存参与,运算效率最高。

mov ax,bx

add cx,ax

特点:CPU直接读写,速度最快,日常运算首选。

3. 直接内存寻址

直接给出内存地址,读取该地址中的数据。

mov ax, [0x401000]

含义:取出内存地址0x401000中存储的数据,赋值给EAX。

坑点:地址非法会直接程序崩溃、段错误。

4. 寄存器间接寻址

寄存器中存放的是内存地址,通过地址取值。

mov ax,bx ; bx存地址

mov cx,[bx] ; 取出bx指向的内存数据

适用场景:遍历数组、动态内存读取、指针操作(C语言指针底层就是这个!)

5. 变址寻址(基址+偏移)

汇编最常用、最重要的寻址方式!函数局部变量、结构体、数组全部依赖它。

mov ax,[bx-4]

mov bx,[si+0x8]

原理:基地址 + 固定偏移 = 真实内存地址

场景:栈变量读取、结构体成员访问、数组下标取值。

三、新手高频致命坑点(必看)

坑点1:分不清 [ ] 和无 [ ]

mov ax,bx 👉 传数值

mov ax,[bx] 👉 传地址对应内存数据

两者天差地别,写错直接数据全错、程序闪退。

坑点2:非法内存寻址

随意写未知内存地址,会触发系统保护,直接段错误闪退。

坑点3:偏移写反

栈内存是高地址向低地址生长,局部变量永远是 [ebp-偏移],写加号直接取值错误。

四、寻址方式快速记忆口诀

常数直接立即数,寄存器快无偏移;

中括号里取内存,间接寻址靠指针;

基址偏移最常用,栈变结构全靠它。