一、首先

P33:

严格来说有三种寻址方式

  1. 与数据有关的寻址方式
  2. 与转移指令或过程调用指令有关的寻址方式
  3. 与IO指令有关的寻址方式

这篇博客只讲1.2两条

二、然后

1. 与数据有关的寻址方式

数据,这个东西主要来自寄存器立即数内存,知道这个,就比较好办了
以下表格顺序与书本中不同。

寻址方式 讲解
立即寻址 指令所需的操作数直接包含在指令代码中,就是常说的立即数
注意,立即数有8/16位两种,在使用时要求与另一个操作数长度匹配
且只能出现在源操作数位置
直接寻址 操作数来源于(指令中直接指出的地址所指向的内存)
MOV AX [2000H],这个方括号的意思是“以括号内的值作为地址,(所指向的内存)中存储的值”
MOV AX,x这里的这个x是之前在数据段定义的变量,当汇编程序被汇编时,汇编器会计算出x的偏移值,然后替换掉原来的x
所以在DEBUG模式下,看到的就不是变量名,而是变量名在数据段中的偏移地址
寄存器寻址 操作数来源于某个寄存器/是这个寄存器里存储的值
比如我要把某个16位的数从BX复制到AX,那么我可以用MOV AX,BX
这里的两个操作数都是寄存器寻址
寄存器间接寻址 这就很好理解了,现在括号里放的不是立即数了,放的是寄存器了,代表操作数在内存中,它的地址的括号内的寄存器中
不过这个间接寻址有几个注意点:
1. 寄存器一般使用的是基址寄存器BP\BX或变址寄存器SI\DI
2. 完整的形式应该是[段地址]:[段内偏移]
3. 当未显式指定段寄存器时,BX\SI\DI中是相对于DS段的偏移地址,BP是相对于SS段的偏移地址
寄存器相对寻址 操作数的地址 = 间址寄存器+偏移量
同直接寻址一样,偏移量可以是一个常量也可以是一个符号名或变量名
例如MOV AX,[SI+10H]MOV AX,ARRAY[SI]
基址变址寻址 操作数地址 = 基址寄存器+变址寄存器
例如MOV AX,[BX+SI]

2.与转移地址有关的寻址方式

这四种寻址方式主要运用于转移指令JMP和过程调用指令CALL
首先要了解这两个东西:
标号,过程名(自己看,不讲了)

寻址方式 讲解
段内直接 就是说我们现在程序运行到这里需要发生一个转跳
去执行其他地方的一些代码
辣么这些代码在哪里呢
我们进行了一些运算,用当前IP的值加上指令中指定的偏移量,得到了一个地址
然后我们就要跳到那里去
比如JMP func1
偏移量可以是8位或者16位,相对的我们就要使用 SHORT func1或者NEAR PTR func1
段间直接 这个和段内直接的区别是什么呢
就是一个X86汇编程序,可能有几个代码段,当使用段间直接寻址时,需要改变段地址的值,相当于跳到了另一个代码段,开始执行新的代码
比如JMP FAR PTR func1
段内间接 跟段内直接的区别是:要转跳的地址放在了寄存器里,而不是一个标号(参考一下2里的寄存器简介寻址吧)
段间间接 类似于段内间接,但是,间接寻址的地址不能直接放在寄存器里,只能放在内存单元中,而且是一个双字

可以简单看看这个博客:
https://blog.csdn.net/b_h_l/article/details/28866267

X86主要的几种寻址方式的更多相关文章

  1. ARM的九种寻址方式

    文章目录 1.立即数寻址 2.寄存器寻址 3.寄存器间接寻址 4.寄存器偏移寻址 5.寄存器基址变址寻址 6.批量寄存器寻址 7.相对寻址 8.堆栈寻址 9.块拷贝寻址 寻址方式就是CPU根据指令中的 ...

  2. ARM寄存器的8种寻址方式01

    一.立即数寻址 操作数由指令本身给出 MOV r0,#0x0F //是所有寻址方式里面速度最快的,但是受到合法立即数的限制 立即数要求以#和$开头 十六进制,#后跟0x:十进制,#后直接加:八进制,# ...

  3. ARM的9种寻址方式

    立即寻址 操作数是立即数,以“#”为前缀,表示 16 进制数值时以“0x”表示. 例: MOV   R0,#0xFF00   ;0xFF00 ->  R0 SUBS   R0,R0,#1     ...

  4. ARM 内核 汇编指令 的 8种 寻址方式

    str: store register ->指令将寄存器内容存到内存空间中, ldr:  load register 将内存内容加载到通用寄存器, ldr/str 组合来实现ARM CPU 和内 ...

  5. X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  6. C语言的本质(29)——C语言与汇编之寄存器和寻址方式

    x86的通用寄存器有eax.ebx.ecx.edx.edi.esi.这些寄存器在大多数指令中是可以任意选用的,比如movl指令可以把一个立即数传送到eax中,也可传送到ebx中.但也有一些指令规定只能 ...

  7. x86汇编程序基础(AT&T语法)

    一.简单的汇编程序 以下面这段简单的汇编代码为例 .section .data .section .text .globl _start _start: movl $, %eax movl $, %e ...

  8. X86/X64处理器体系结构及寻址模式

    由8086/8088.x86.Pentium发展到core系列短短40多年间,处理器的时钟频率差点儿已接近极限.尽管如此,自从86年Intel推出386至今除了添加一些有关流媒体的指令如mmx/sse ...

  9. x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式

    目录 x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式 一丶x86指令复习. 1.1什么是x86指令. 1.2 x86与x64下的通用寄存器 1.3 OpCode 1.4 7种寻址方式 二 ...

随机推荐

  1. ConstraintLayout使用手册

    1. 解决痛点 主要用拖拽 解决嵌套过多 2. 简易使用手册 增加约束 四个角直接拖拽就好了 删除约束 match_constraint 属性 这个属性类似于match_parent,去掉margin ...

  2. SDN 第四次作业

    阅读 了解SDN控制器的发展 http://www.sdnlab.com/13306.html http://www.docin.com/p-1536626509.html 了解ryu控制器 http ...

  3. python第三十二课——栈

    栈:满足特点 --> 先进后出,类似于我们生活中的子弹夹 [注意] 对于栈结构而言:python中没有为其封装特定的函数,我们可以使用list(列表)来模拟栈的特点 使用list对象来模拟栈结构 ...

  4. BZOJ4552:[TJOI2016&HEOI2016]排序(线段树,二分)

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  5. Azkaban学习之路 (二)Azkaban的安装

    安装过程 1.软件介绍 Azkaban Web 服务器:azkaban-web-server-2.5.0.tar.gz Azkaban Excutor 执行服务器:azkaban-executor-s ...

  6. Linux备份压缩命令

    gzip 命令 把/home/chenjialins目录下的familyA目录下所有文件压缩成.gz文件cd /home/chenjialinstar -cvf /home/chenjialins/f ...

  7. shiro实战系列(十三)之单元测试

    由于我们已经涉及到了 Subject reference,我们知道 Subject 是“当前执行”用户的特定安全视图,且该 Subject 实 例绑定到一个线程来确保我们知道在线程执行期间的任何时间是 ...

  8. Git同时使用不同平台代码仓库

    问题描述 公司项目使用代码仓库为gitinn/gitlab等,个人项目使用github进行托管,而公司项目和个人项目设置的邮箱和用户名是不同的,而ssh的密钥对又是基于这两个信息生成的,所以此时想要同 ...

  9. day63

    一.环境搭建 1.安装node 去官网下载node安装包 傻瓜式安装 万一安装后终端没有node环境,要进行node环境变量的配置(C:\Program Files\nodejs) 可以通过node提 ...

  10. Windows下配置Django环境

    辛辛苦苦,终于在Windows10上把Django环境搭建并成功建立工程 1.首先安装python,配置环境变量path:C:\Python27:C:\Python27\Scripts: 2.去dja ...