0 前言

众所周知,对于8086汇编语言,有几大寻址方式,不过我觉得这个好墨迹,会用就可以了,为什么命名这么多,这次只说本质,不说命名,至于命名,还是得知道,毕竟是大部分人公认的,不能反抗这点哦,但是你知道,不代表你真的要这么去想。

1 何为寻址?何为寻址方式?

看了很多资料,让人眼花缭乱,各种专业词汇让人眼花缭乱,扑朔迷离,我直接用最简练的语言说明。

  • 寻址,就是找数据
  • 寻址方式,就是找数据的方法

接下来,根据数据的位置,我再细说一下各种寻址方式。

2 立即数寻址

一句话,在指令中找数据

访问方式: 找指令的时候,顺便将数据带过来了,怎么找指令就怎么找它。

举例:

mov ax,1000h

1000h就是立即数,也就用到了立即数寻址

3 寄存器寻址

一句话,在寄存器中找数据

访问方式: 直接写上寄存器的名字,就能访问了。

举例:

mov ax,1000h

ax就是寄存器的名称,也就用到了寄存器寻址

4 存储器寻址

一句话,在存储器中找数据。(这里的存储器,通常情况下指的是主内存)

访问方式: 表示出存储单元的地址,就能访问了。

唯独存储器寻址比较麻烦,因为它表示地址的方式有很多种

但是在我这里,也就一句话,地址的形成方式是:BX,BP,SI,DI和立即数的各种组合

其实也就这些而已,只不过还有一些其他的规则限定,我也来细说一下(顺便说一句,这些东西,先看懂理解,然后自己动手试一下,多试试就学会了,不要背)。

BX —— based register——基地址寄存器
BP —— base point——基础指针
SI —— source index——源变址寄存器
DI —— destination index——目的变址寄存器

先给出你英文全称,你就很快能够知道,为什么是这几个寄存器了。

4.1 语法格式

mov ax,dataSegmentName
mov ds,ax
mov 目标,[address]

使用存储器寻址的时候,需要

  1. 设置好DS的值
  2. 再设置[address]的值,address的内容,就是上面说的

4.2 各种存储单元地址的生成方式

这里,我结合大家公认的命名,以及我自己的观点,阐述这些内容。

不管是什么寻址方式,本质就是为了生成address的值,生成数值的本质,就是我说的5个东西(bx,bp,si,di,立即数)进行基本的数学运算

  1. 寄存器直接寻址
    由立即数提供偏移地址。
mov ax,ds:[1000h]

在汇编语言中,立即数作为偏移地址,前面需要显式地加上提供段地址的寄存器,另外,这种显式的方式,一样可以应用于后面的方式,但是不是强制的。

  1. 寄存器间接寻址
    bx,si,di提供偏移地址,注意没有BP,至于原因,与硬件设计和语法设定有关,不必追究。
mov ax,[bx] ; 也可以写上 mov ax,ds:[bx]
mov ax,[si]
mov ax,[di]

另外,也可以使用其他段寄存器(ss,cs,es)提供段地址,显示加上就可以,mov ax,ss:[bx],这样就由ss提供段地址,bx提供偏移地址。

  1. 基址寻址
    bx + 位移量bp + 位移量提供偏移地址。

特殊:只有bp提供偏移地址的时候,默认ss寄存器提供段地址,其他的默认ds。

mov ax,[bx + 10H] ; 本质 mov ax,ds:[bx + 10H]
mov ax,[bp + 10H ]; 本质 mov ax,ss:[bp + 10H]

另外,在寻址范围之内,位移量可正可负可为0,下面的4,5也是这样。

  1. 变址寻址
    si + 位移量di + 位移量提供偏移地址。
mov ax,[si - 10h]
mov ax,[di - 10h]
  1. 基址变址寻址
    1个基址寄存器 + 1个变址寄存器 + 位移量提供偏移地址,只有含有BP,就是SS提供段地址。
mov ax,[bx + si + 10h]

4.3 位移量为什么还可以是负数?

首先,你需要了解的是,这里的负数是十进制的负数,编码方式是二进制补码

位移量是正数,就代表在基础之上,加了东西
位移量是负数,就代表在基础之上,减了东西

说白了就是,可加可减,反正都是找数据,怎么找都可以,画个图你就明白了。

你可能问,如果是bx - 11h,但是bx < 11h,不是成了负数?注意,在二进制世界,减过头了,叫溢出,是正溢出,溢出的结果,就是循环回去。 我再画个图:

对于有符号数

正溢出:两数运算,大于最大的正数,进入负数区域
负溢出:两数运算,小于最小的负数,进入正数区域

4.4 小结

注意,位移量其实就是个常数,也可以说成立即数,大多数情况不用区分。

1个:[常数][bx][si][di]
2个:[bx + 位移量][bp + 位移量][si + 位移量][di + 位移量]
3个:[(bx或bp)+ (si或di)+ 位移量],注意,不可以是[bx + bp + 位移量][si + di + 位移量]

4.5 思想方法

需要注意的是,以上是数学运算,都是加减法,但是这只是在8086中,未来,还会有乘法的出现,但是依然没有脱离本质,address = { {BX,BP,SI,DI和立即数} 的基本数学混合运算}

希望你明白,之所以不要你去专注于各种被限定的寻址方式,是因为那些不是本质,掌握本质,把握知识源头,才能够更好地应对未来。

在x86-32汇编语言中,地址的生成方式,又有所改变。
例如:mov dword ptr [ebp+eax*4-6Ch],edx,如果你记忆的是8086汇编于寻址方式,那么这个新的方式,你依然要去记忆,但是如果你掌握的是本质,你就知道,这不过是在生成地址的过程中,增加了一个乘号而已,之后你再去探索一下,为什么增加这个乘号,你就可以快速透彻理解和掌握它了。

5 注意事项

需要注意的是,这些理解,是为了让你抓住本质,但是并不代表,你只知道这些就可以了,内些杂乱的命名,依然有存在的价值,你同样需要掌握。

最后,还有一个重要的感悟,那就是任何操作数,都需要应用到这些寻址方式,因为计算机的本质就是处理数据,数据又需要通过寻址来找到

推荐阅读:计算机处理信息的本质,是二进制数的运算(本文第2节)

【汇编语言】8086汇编,快速搞定各种寻址方式:立即数寻址 / 寄存器寻址 / 存储器寻址相关推荐

  1. 教你一招超级简单的方法快速搞定grub.conf文件的丢失及损坏

    教你一招超级简单的方法快速搞定grub.conf文件的丢失及损坏 实验环境: GRUB是大多数Linux系统默认使用的引导程序,当"/boot/grub/grub.conf"配置文 ...

  2. 一行代码快速搞定Flowable断点下载(下)

    一行代码快速搞定Flowable断点下载(下) 其实这个主题对应的三篇文章真的真的非常难写,首先是感觉非常多人对于函数式编程不太熟悉,然后又有一些人对于kotlin不太熟悉.这就导致了,写这三篇文章的 ...

  3. 一行代码快速搞定Flowable断点下载(中)

    一行代码快速搞定Flowable断点下载(中) 感觉上一篇家常聊了太多,这一篇就直接进入正题,首先来看一下,通过存储化以及方法拓展技术将mComposableDisposable的相关逻辑也从抽象Ac ...

  4. 一行代码快速搞定Flowable断点下载(上)

    一行代码快速搞定Flowable断点下载(上) 之前我们大致讲了讲,到底怎么完全将disposable相关代码完全隐藏. 然后到了这里,可能有些杠精就会说了,你那个方式,我们不是完全不能拿到Flowa ...

  5. 白话经典算法系列之六 快速排序 快速搞定

    快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个 ...

  6. 怎么做95置信区间图_这种动态的OD图怎么做?简单3步快速搞定

    之前在视频号中发过一个单车的出行数据可视化效果. 动态展示了某天单车不同时段的运行情况,这种动态的OD可视化效果是如何制作的呢?使用的是kepler.gl进行制作的,其实非常简单,3步即可快速搞定. ...

  7. 【转载】白话经典算法系列之六 快速排序 快速搞定

    原文地址:http://blog.csdn.net/morewindows/article/details/6684558 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经 ...

  8. 水墨特效怎么做?两种方法快速搞定!大神都在用的超美视频画面效果

    想在视频里用高大上的水墨特效,却不知道怎么做?一般做这种唯美好看的效果,在一些特效软件里需要自己去设计.渲染,这一步就难倒了很多新手.那像视频大神一样的水墨特效就没办法制作了吗? 今天就教大家快速搞定 ...

  9. 计算机设计图片教程,电脑如何抠图?教你一招快速搞定

    电脑抠图是使用软件进行图片处理,去除照片背景得到一张透明背景的图片,便于进行设计创作,抠图对于ps大神是非常简单的事情,可对于一窍不通的新手小白来说用电脑抠图是很困难的事情,但小编今天给大家分享一个抠 ...

最新文章

  1. 【转】判断UIViewController是否正在显示
  2. 安装MYSQL最低的RAM_安装MySQL后,需要调整的10个性能配置项
  3. Host Switch Plus结合nginx使用
  4. boost::variant2模块实现抛出异常的测试程序
  5. java孙膑和庞涓问题_庞涓与孙膑的故事
  6. CentOS Linux服务器实现攻防演练
  7. Etag If-None-Match 专题
  8. 三菱FX2N:PC与PLC建立通讯的几种方式(SC-09通讯电缆+FX2N-485-BD通讯板)
  9. 深度学习损失函数 分类损失回归损失
  10. QQ桌球瞄准器开发(3)绘制瞄准线及母球
  11. java做一个查询网页版_用java写一个网页输入url点击查询即可在下面显示网页源代码...
  12. 专升本英语——语法知识——高频语法——第六节 名词性从句(主语从句-表语从句-同位语从句-宾语从句)【学习笔记】
  13. 康定游记-宝宝征服4300米海拔折多山
  14. python异常-TypeError: ‘tuple‘ object is not callable.当不同的环境下同一个语句运行结果不同时,不如重启程序、更改不相关变量试试
  15. 湖北测绘资质类别范围,如何办理测绘资质?
  16. Tetrate万凯:SkyWalking MAL的监控虚拟机和Kubernetes实践
  17. 树莓派进阶之路 (038) - P2P 文件下载机
  18. 【DB笔试面试639】在Oracle中,什么是多列统计信息(Extended Statistics)?
  19. 如何快速掌握正确的UI配色方案?6种技巧不容错过!(转载)
  20. Android App开发实战项目之购物车(附源码 超详细必看)

热门文章

  1. Fix “Windows cannot access the specified device path or file” Error
  2. hdp安装 不安装mysql_hdp安装及使用问题汇总(一)
  3. 倒计时 时间校准android,android倒计时器时间
  4. 信号与系统 徐亚宁 matlab程序,信号与系统(第4版)
  5. php实现第三方邮箱登录_PHP实现用户异地登录提醒功能的方法
  6. flask mysql分页,Flask分页的实现方法
  7. C排序算法:(二)冒泡排序
  8. because the following virtual functions are pure within
  9. Jenkins入门指南
  10. java 批量处理 示例_Java中异常处理的示例